@firestitch/report 18.12.0 → 18.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/app/reports/components/component-grid/component-grid.component.d.ts +5 -1
  2. package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
  3. package/app/reports/components/report-component/report-component.component.d.ts +0 -1
  4. package/app/reports/export/report-export-collector.service.d.ts +8 -1
  5. package/app/reports/export/report-filter-lines.d.ts +2 -0
  6. package/app/reports/export/report-grid-export.d.ts +20 -0
  7. package/app/reports/export/report-pdf.service.d.ts +2 -0
  8. package/app/reports/export/report-pptx.service.d.ts +1 -0
  9. package/app/reports/group-by.d.ts +3 -0
  10. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
  11. package/app/reports/interfaces/report.interface.d.ts +7 -0
  12. package/app/reports/report-filter-items.d.ts +1 -1
  13. package/app/reports/report-grid-layout.d.ts +8 -2
  14. package/app/reports/services/report-filter-state.service.d.ts +8 -1
  15. package/app/reports/tile-data-state.d.ts +2 -2
  16. package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +34 -7
  17. package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
  18. package/esm2022/app/reports/components/report-component/report-component.component.mjs +15 -19
  19. package/esm2022/app/reports/data/report.data.mjs +3 -3
  20. package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
  21. package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
  22. package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
  23. package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
  24. package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
  25. package/esm2022/app/reports/group-by.mjs +13 -0
  26. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  27. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  28. package/esm2022/app/reports/report-filter-items.mjs +9 -7
  29. package/esm2022/app/reports/report-grid-layout.mjs +57 -4
  30. package/esm2022/app/reports/services/report-filter-state.service.mjs +124 -38
  31. package/esm2022/app/reports/tile-data-state.mjs +12 -17
  32. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  33. package/esm2022/app/reports/views/report/report.component.mjs +2 -2
  34. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs → firestitch-report-echarts-EecIloKo.mjs} +2 -2
  35. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs.map → firestitch-report-echarts-EecIloKo.mjs.map} +1 -1
  36. package/fesm2022/{firestitch-report-firestitch-report-CHPA7sla.mjs → firestitch-report-firestitch-report-DbdLxQSE.mjs} +566 -116
  37. package/fesm2022/firestitch-report-firestitch-report-DbdLxQSE.mjs.map +1 -0
  38. package/fesm2022/firestitch-report.mjs +1 -1
  39. package/package.json +2 -2
  40. package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +0 -1
@@ -10,7 +10,7 @@ import { DEFAULT_FORMAT_CONTEXT, getZonedNow, resolveFormatContext, resolveRepor
10
10
  import { listHiddenColumns, listSortTerms } from '../list-config';
11
11
  import { dateBoundString, LIST_SEARCH_MAX_LENGTH } from '../report-filter-items';
12
12
  import { groupValueSignature } from '../report-filter-items';
13
- import { authoredGridLayout, gridLayoutKey } from '../report-grid-layout';
13
+ import { GRID_GRANULARITIES, authoredGridLayout, grainedGridLayout, gridLayoutKey, rebasedGridLayout, } from '../report-grid-layout';
14
14
  import { isTile } from '../report-tile';
15
15
  import { cleanDrillPath, finiteNumber, isRelativeRange, sameDrillPath, sameStoredGroupValue, stateDiffers, toStoredGroupValue, } from '../report-state';
16
16
  import { tileDataState } from '../tile-data-state';
@@ -177,9 +177,11 @@ export class ReportFilterStateService {
177
177
  // Whether the screen differs from the report's authored defaults
178
178
  // (stateDiffers): what the report bar's 'Clear filters' shows for. A switch
179
179
  // of page does not count, and the temporary state never does.
180
+ // A table tile in a layout of the viewer's own counts too; it stays out of
181
+ // the snapshot, so no saved filter or link carries it.
180
182
  differsFromDefaults = computed(() => {
181
183
  this._revision();
182
- return stateDiffers(this.authoredConfig(), this.snapshot());
184
+ return this._gridLayouts().size > 0 || stateDiffers(this.authoredConfig(), this.snapshot());
183
185
  });
184
186
  _values = new Map();
185
187
  _groups = new Map();
@@ -189,7 +191,8 @@ export class ReportFilterStateService {
189
191
  // its default straight back. A change to the stored default releases it.
190
192
  _cleared = new Set();
191
193
  // The report's group-by control: a single report-wide bucket override for all
192
- // time-series charts. Unset = each chart uses its authored granularity. Never
194
+ // the tiles that follow it (followsGroupBy). Unset = each one uses its
195
+ // authored granularity. Never
193
196
  // saved to the report, and carried in the data request's
194
197
  // `state`, so it propagates through to the PDF/PowerPoint exports too. Named
195
198
  // for the `frequency` wire key it travels under, not for the control's label.
@@ -249,6 +252,16 @@ export class ReportFilterStateService {
249
252
  // changed from (ReportGridSessionLayout.base). A table showing its authored
250
253
  // layout has no entry, and only a table has one.
251
254
  _gridLayouts = signal(new Map());
255
+ // The groups a viewer left open in each table tile, by component id, so a
256
+ // tile drawn again (a page switch) opens them. Session only: no Clear
257
+ // resets them, differsFromDefaults never reads them, and fs-grid drops
258
+ // them itself once the row levels change.
259
+ _gridExpansions = signal(new Map());
260
+ // By table tile, the column filter a group-by change took out of it and
261
+ // the grain the table now groups by (_grainGridLayouts()), for fs-grid's
262
+ // status line. fs-grid hides it once the field is filtered again; a Clear
263
+ // drops it.
264
+ _gridClearedFilters = signal(new Map());
252
265
  // The temporary layer: kept apart from everything above, so snapshot()
253
266
  // and differsFromDefaults never read it.
254
267
  _temporary = signal(emptyTemporaryState());
@@ -315,14 +328,18 @@ export class ReportFilterStateService {
315
328
  frequency() {
316
329
  return this._frequency;
317
330
  }
331
+ // Each table that follows the group-by has its filter on the group-by's
332
+ // field moved to the new grain first (_grainGridLayouts()), so a table on
333
+ // screen reads once, with both.
318
334
  setFrequency(frequency) {
319
335
  this._frequency = frequency;
336
+ this._grainGridLayouts();
320
337
  this._frequencyChanged$.next();
321
338
  this._stateChanged$.next();
322
339
  }
323
- // Fires whenever the group-by grain changes — every time-series chart listens
324
- // so it refetches and re-buckets (the override isn't scoped to any filter
325
- // group, so changesFor() can't carry it).
340
+ // Fires whenever the group-by grain changes — every tile that follows it
341
+ // listens so it refetches and re-buckets (the override isn't scoped to any
342
+ // filter group, so changesFor() can't carry it).
326
343
  frequencyChanges() {
327
344
  return this._frequencyChanged$.asObservable();
328
345
  }
@@ -575,24 +592,27 @@ export class ReportFilterStateService {
575
592
  // the tile reads as stored again. fs-grid reads the change itself, so only
576
593
  // changes() hears about it, and only on a real change.
577
594
  setGridLayout(component, layout) {
578
- const base = gridLayoutKey(authoredGridLayout(component));
579
- const key = gridLayoutKey(layout);
580
- const current = this._gridLayouts().get(component.id);
581
- const unchanged = key === base
582
- ? !current
583
- : current?.base === base && gridLayoutKey(current.layout) === key;
584
- if (component.type !== 'grid' || unchanged) {
585
- return;
586
- }
587
- const next = new Map(this._gridLayouts());
588
- if (key === base) {
589
- next.delete(component.id);
595
+ if (this._putGridLayout(component, layout)) {
596
+ this._stateChanged$.next();
590
597
  }
591
- else {
592
- next.set(component.id, { layout, base });
598
+ }
599
+ // The column filter a group-by change took out of a table tile, or null
600
+ // (_gridClearedFilters).
601
+ gridClearedFilter(component) {
602
+ return this._gridClearedFilters().get(component.id) ?? null;
603
+ }
604
+ // The groups a viewer left open in a table tile, or undefined: the tile
605
+ // opens as its layout says.
606
+ gridExpansion(component) {
607
+ return this._gridExpansions().get(component.id);
608
+ }
609
+ // Records the groups open in a table tile, as fs-grid writes them out. It
610
+ // changes no read, so nothing hears about it.
611
+ setGridExpansion(component, expansion) {
612
+ if (component.type !== 'grid' || !expansion || this._gridExpansions().get(component.id) === expansion) {
613
+ return;
593
614
  }
594
- this._gridLayouts.set(next);
595
- this._stateChanged$.next();
615
+ this._gridExpansions.set(new Map(this._gridExpansions()).set(component.id, expansion));
596
616
  }
597
617
  // The durable state on screen as one document: the page, every group the
598
618
  // report has (null when it holds nothing, a cleared default included), the
@@ -958,6 +978,56 @@ export class ReportFilterStateService {
958
978
  this.listHidden.set(new Map());
959
979
  this._drills.set(new Map());
960
980
  this._gridLayouts.set(new Map());
981
+ this._gridClearedFilters.set(new Map());
982
+ }
983
+ // setGridLayout() without the change event; true when the layout changed.
984
+ _putGridLayout(component, layout) {
985
+ const base = gridLayoutKey(authoredGridLayout(component));
986
+ const key = gridLayoutKey(layout);
987
+ const current = this._gridLayouts().get(component.id);
988
+ const unchanged = key === base
989
+ ? !current
990
+ : current?.base === base && gridLayoutKey(current.layout) === key;
991
+ if (component.type !== 'grid' || unchanged) {
992
+ return false;
993
+ }
994
+ const next = new Map(this._gridLayouts());
995
+ if (key === base) {
996
+ next.delete(component.id);
997
+ }
998
+ else {
999
+ next.set(component.id, { layout, base });
1000
+ }
1001
+ this._gridLayouts.set(next);
1002
+ return true;
1003
+ }
1004
+ // Every table that follows the group-by (followsGroupBy), its column filter
1005
+ // on the group-by's field moved to the grain it now reads at: the viewer's
1006
+ // pick, else the table's own (grainedGridLayout()). Tables on other pages
1007
+ // move too, so their files, the chat and their next paint read the moved
1008
+ // filter. A filter taken out is noted on its tile (gridClearedFilter()); a
1009
+ // note already there names the new grain, unless the field is filtered
1010
+ // again, which ends it.
1011
+ _grainGridLayouts() {
1012
+ const cleared = new Map(this._gridClearedFilters());
1013
+ this._tiles().forEach((component) => {
1014
+ const groupBy = component.type === 'grid' ? component.followsGroupBy : null;
1015
+ const granularity = this._frequency ?? groupBy?.granularity;
1016
+ if (!groupBy || !granularity) {
1017
+ return;
1018
+ }
1019
+ const grained = grainedGridLayout(this.gridLayout(component), groupBy.field, granularity);
1020
+ const filtered = (grained.layout.filters ?? []).some((filter) => filter.field === groupBy.field);
1021
+ const note = grained.cleared ?? (filtered ? null : cleared.get(component.id));
1022
+ if (note) {
1023
+ cleared.set(component.id, { ...note, granularity: GRID_GRANULARITIES[granularity] });
1024
+ }
1025
+ else {
1026
+ cleared.delete(component.id);
1027
+ }
1028
+ this._putGridLayout(component, grained.layout);
1029
+ });
1030
+ this._gridClearedFilters.set(cleared);
961
1031
  }
962
1032
  // One chart's drill path; an empty path is the chart's top.
963
1033
  _setDrillPath(componentId, path) {
@@ -970,8 +1040,8 @@ export class ReportFilterStateService {
970
1040
  }
971
1041
  this._drills.set(next);
972
1042
  }
973
- // After resetToDefaults(): every bar and tile repaints, and the
974
- // time-series charts refetch when the grain moved.
1043
+ // After resetToDefaults(): every bar and tile repaints, and the tiles that
1044
+ // follow the group-by refetch when the grain moved.
975
1045
  _notifyReset(frequency) {
976
1046
  this._stateVersion.update((version) => version + 1);
977
1047
  this._changed$.next(null);
@@ -991,39 +1061,55 @@ export class ReportFilterStateService {
991
1061
  return this._tiles()
992
1062
  .some((component) => component.id === componentId && component.type === 'chart');
993
1063
  }
994
- // Drops each table layout whose tile is gone, is no table any more, or is
995
- // authored otherwise than when the viewer changed it.
1064
+ // Drops each table layout and expansion whose tile is gone or is no table
1065
+ // any more. A layout whose tile is now authored otherwise (an edit, the
1066
+ // agent's) moves onto the new authored layout, keeping the viewer's filters
1067
+ // and sort terms on fields it still places (rebasedGridLayout), so the tile
1068
+ // shows both changes; one that then draws the authored layout is dropped.
996
1069
  _pruneGridLayouts() {
997
1070
  const grids = new Map(this._tiles()
998
1071
  .filter((component) => component.type === 'grid')
999
1072
  .map((component) => [component.id, component]));
1000
- const kept = new Map([...this._gridLayouts()]
1001
- .filter(([componentId, session]) => {
1073
+ const kept = new Map();
1074
+ this._gridLayouts().forEach((session, componentId) => {
1002
1075
  const component = grids.get(componentId);
1003
- return !!component && session.base === gridLayoutKey(authoredGridLayout(component));
1004
- }));
1005
- if (kept.size !== this._gridLayouts().size) {
1006
- this._gridLayouts.set(kept);
1007
- }
1076
+ if (!component) {
1077
+ return;
1078
+ }
1079
+ const authored = authoredGridLayout(component);
1080
+ const base = gridLayoutKey(authored);
1081
+ const layout = session.base === base ? session.layout : rebasedGridLayout(session.layout, session.base, authored);
1082
+ if (gridLayoutKey(layout) !== base) {
1083
+ kept.set(componentId, { layout, base });
1084
+ }
1085
+ });
1086
+ this._gridLayouts.set(kept);
1087
+ this._gridExpansions.set(new Map([...this._gridExpansions()]
1088
+ .filter(([componentId]) => grids.has(componentId))));
1089
+ this._gridClearedFilters.set(new Map([...this._gridClearedFilters()]
1090
+ .filter(([componentId]) => grids.has(componentId))));
1008
1091
  }
1009
1092
  // Keeps the page, drill and table state to what the report (re)loaded by
1010
1093
  // init() still has: drill paths on charts it still has, the page while it
1011
- // has it, and each table's layout while it is still a table authored as it
1012
- // was when the viewer changed it (a new authored layout, an edit or the
1013
- // agent's, is shown as authored). On another report it starts again: match
1014
- // 'all', no drill, every table as authored and nothing temporary.
1094
+ // has it, and each table's layout and open groups while it is still a table
1095
+ // (_pruneGridLayouts). On another report it starts again: match 'all', no
1096
+ // drill, every table as authored and closed, and nothing temporary.
1015
1097
  _prunePageState(report) {
1016
1098
  if (this._report()?.id !== report.id) {
1017
1099
  this._match.set('all');
1018
1100
  this._pageId.set(null);
1019
1101
  this._drills.set(new Map());
1020
1102
  this._gridLayouts.set(new Map());
1103
+ this._gridExpansions.set(new Map());
1104
+ this._gridClearedFilters.set(new Map());
1021
1105
  this._temporary.set(emptyTemporaryState());
1022
1106
  }
1023
1107
  this._report.set(report);
1024
1108
  this._drills.set(new Map([...this._drills()]
1025
1109
  .filter(([componentId]) => this._isChart(componentId))));
1026
1110
  this._pruneGridLayouts();
1111
+ // A table the report now authors otherwise reads at the grain on screen.
1112
+ this._grainGridLayouts();
1027
1113
  if (this._pageId() && !(report.pages ?? []).some((page) => page.id === this._pageId())) {
1028
1114
  this._pageId.set(null);
1029
1115
  }
@@ -1082,4 +1168,4 @@ export class ReportFilterStateService {
1082
1168
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
1083
1169
  type: Injectable
1084
1170
  }] });
1085
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUl0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBb0JuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIs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QUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUVyRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7d0dBN25DVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBHcmlkTGF5b3V0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgZW5kT2ZXZWVrLCBzdGFydE9mTW9udGgsIHN0YXJ0T2ZRdWFydGVyLCBzdGFydE9mV2Vlaywgc3RhcnRPZlllYXIsXG4gIHN1YkRheXMsIHN1Yk1vbnRocywgc3ViV2Vla3MsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0gZnJvbSAnLi4vY29uc3RzL3JlcG9ydC13ZWVrLmNvbnN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIGdldFpvbmVkTm93LCByZXNvbHZlRm9ybWF0Q29udGV4dCwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lLFxufSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RHJpbGxTdGVwIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZHJpbGwtc3RlcC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTWF0Y2ggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkU2Vzc2lvbkxheW91dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWdyaWQtc2Vzc2lvbi1sYXlvdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFRlbXBvcmFyeVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtdGVtcG9yYXJ5LXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRUaWxlU3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10aWxlLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTdGF0ZVNuYXBzaG90IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtc3RhdGUtc25hcHNob3QuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENoYXJ0R3JhbnVsYXJpdHksXG4gIEZpbHRlckdyb3VwRGVmYXVsdCxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRSZWxhdGl2ZVJhbmdlLFxuICBSZXBvcnRTb3J0LFxuICBSZXNvbHZlZEZpbHRlclZhbHVlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgbGlzdEhpZGRlbkNvbHVtbnMsIGxpc3RTb3J0VGVybXMgfSBmcm9tICcuLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBkYXRlQm91bmRTdHJpbmcsIExJU1RfU0VBUkNIX01BWF9MRU5HVEggfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGdyb3VwVmFsdWVTaWduYXR1cmUgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGF1dGhvcmVkR3JpZExheW91dCwgZ3JpZExheW91dEtleSB9IGZyb20gJy4uL3JlcG9ydC1ncmlkLWxheW91dCc7XG5pbXBvcnQgeyBpc1RpbGUgfSBmcm9tICcuLi9yZXBvcnQtdGlsZSc7XG5pbXBvcnQge1xuICBjbGVhbkRyaWxsUGF0aCwgZmluaXRlTnVtYmVyLCBpc1JlbGF0aXZlUmFuZ2UsIHNhbWVEcmlsbFBhdGgsIHNhbWVTdG9yZWRHcm91cFZhbHVlLFxuICBzdGF0ZURpZmZlcnMsIHRvU3RvcmVkR3JvdXBWYWx1ZSxcbn0gZnJvbSAnLi4vcmVwb3J0LXN0YXRlJztcbmltcG9ydCB7IENvbXBvbmVudERhdGFTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB0aWxlRGF0YVN0YXRlIH0gZnJvbSAnLi4vdGlsZS1kYXRhLXN0YXRlJztcbmltcG9ydCB7IHJlcG9ydENvbXBvbmVudHMgfSBmcm9tICcuLi92YWx1ZXMnO1xuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgc2FtZUxpc3QoYS52YWx1ZXMsIGIudmFsdWVzKVxuICAgICYmIHNhbWVMaXN0KGEuZXhjbHVkZVZhbHVlcywgYi5leGNsdWRlVmFsdWVzKVxuICAgICYmIGEubWluID09PSBiLm1pblxuICAgICYmIGEubWF4ID09PSBiLm1heDtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgbGlzdHMgaG9sZCB0aGUgc2FtZSB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIuXG5mdW5jdGlvbiBzYW1lTGlzdChhOiB1bmtub3duW10gfCB1bmRlZmluZWQsIGI6IHVua25vd25bXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGEgPz8gW10pLmxlbmd0aCA9PT0gKGIgPz8gW10pLmxlbmd0aFxuICAgICYmIChhID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIgPz8gW10pW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdCBzb3J0cyBvcmRlciB0aGUgcm93cyB0aGUgc2FtZSB3YXkuIE5vIGRpcmVjdGlvbiByZWFkcyBhc1xuLy8gYXNjZW5kaW5nLCB0aGUgd2F5IHRoZSBsaXN0IGFwcGxpZXMgaXQuXG5mdW5jdGlvbiBzYW1lU29ydChhOiBSZXBvcnRTb3J0LCBiOiBSZXBvcnRTb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFiXG4gICAgJiYgYS5jb2x1bW4gPT09IGIuY29sdW1uXG4gICAgJiYgKGEuZGlyZWN0aW9uID8/ICdhc2MnKSA9PT0gKGIuZGlyZWN0aW9uID8/ICdhc2MnKTtcbn1cblxuXG4vLyBXaGV0aGVyIGEgdmFsdWUgcmVhZCBvZmYgYSBmaWx0ZXIgYmFyIGlzIHRoZSB2YWx1ZSBhbHJlYWR5IHN0b3JlZCBmb3IgaXRzXG4vLyBncm91cDogdGhlIHNhbWUgY2FsZW5kYXIgZGF5cywgdGhlIHNhbWUgc2VsZWN0IHZhbHVlcyBrZXB0IG9yIGxlZnQgb3V0IGluXG4vLyB0aGUgc2FtZSBvcmRlciwgdGhlIHNhbWUgdHJpbW1lZCB0ZXh0IGFuZCB0aGUgc2FtZSBudW1iZXIgcmFuZ2UgZW5kcy4gQVxuLy8gYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvIHRoaXMgaXMgd2hhdCB0ZWxscyB0aGVcbi8vIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZ3JvdXBWYWx1ZVNpZ25hdHVyZShhKSA9PT0gZ3JvdXBWYWx1ZVNpZ25hdHVyZShiKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIChncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICAgIGdyb3VwRGVmYXVsdC5taW4gPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0Lm1heCA/PyAnJyxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVGhlIHRlbXBvcmFyeSBsYXllciB3aXRoIG5vdGhpbmcgcGlja2VkLlxuZnVuY3Rpb24gZW1wdHlUZW1wb3JhcnlTdGF0ZSgpOiBSZXBvcnRUZW1wb3JhcnlTdGF0ZSB7XG4gIHJldHVybiB7IGNyb3NzRmlsdGVyczogW10sIGRldGFpbDogbnVsbCB9O1xufVxuXG5cbi8vIFZpZXdlciBmaWx0ZXIgc3RhdGUgZm9yIHRoZSBvcGVuIHJlcG9ydC4gRmlsdGVyIFZBTFVFUyBhcmUgbmV2ZXIgc2F2ZWQgdG9cbi8vIHRoZSByZXBvcnQg4oCUIHRoaXMgc2VydmljZSBob2xkcyB0aGVtIHBlciBmaWx0ZXIgR1JPVVAgKHRoZSBwcm9wYWdhdGlvbiB1bml0KSxcbi8vIHJlc29sdmVzIHRoZW0gaW50byBwZXItY29tcG9uZW50IG1lbWJlci1maWx0ZXIgdmFsdWVzIGZvciBlYWNoIGRhdGEgcmVxdWVzdCxcbi8vIGFuZCBub3RpZmllcyB0aGUgY29tcG9uZW50cyB3aG9zZSBncm91cHMgY2hhbmdlZCBzbyBvbmx5IHRoZXkgcmVmZXRjaC5cbi8vXG4vLyBJdCBpcyB0aGUgb25lIHBsYWNlIHRoZSB2aWV3ZXIncyBzdGF0ZSBsaXZlcyB3aGlsZSB0aGUgcmVwb3J0IGlzIG9wZW46IHRoZVxuLy8gZ3JvdXAgdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIHRoZSBtYXRjaCwgbGlzdCBzb3J0cywgc2VhcmNoZXMgYW5kIGhpZGRlblxuLy8gY29sdW1ucywgdGhlIHBhZ2UsIGVhY2ggY2hhcnQncyBkcmlsbCBwYXRoIGFuZCBlYWNoIHRhYmxlJ3MgbGF5b3V0LiBOb25lIG9mXG4vLyBpdCBpcyBldmVyIHdyaXR0ZW4gdG8gdGhlIGJyb3dzZXIgVVJMLiBJdCBvdXRsaXZlcyBhIHBhZ2Ugc3dpdGNoICh0aGUgY2FudmFzXG4vLyBjaGFuZ2VzIHRoZSBwYWdlLCBub3QgdGhpcyBzZXJ2aWNlKSBhbmQgZ29lcyB3aXRoIHRoZSByZXBvcnQgdmlldzogYSByZWxvYWRcbi8vIHN0YXJ0cyBhIG5ldyBzZXJ2aWNlLCB3aGljaCBvcGVucyBvbiB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMuXG4vLyBjaGFuZ2VzKCkgZmlyZXMgb24gZXZlcnkgY2hhbmdlIG9mIGl0LlxuLy9cbi8vIFRoZSBkdXJhYmxlIHBhcnQgcmVhZHMgYXMgb25lIGRvY3VtZW50OiBzbmFwc2hvdCgpIHdyaXRlcyBpdCwgYW5kXG4vLyBkaWZmZXJzRnJvbURlZmF1bHRzIHNheXMgd2hldGhlciB0aGUgc2NyZWVuIHN0aWxsIHNob3dzIHRoZSByZXBvcnQnc1xuLy8gYXV0aG9yZWQgZGVmYXVsdHMgKHJlc2V0VG9EZWZhdWx0cygpIHB1dHMgaXQgYmFjayBvbiB0aGVtKS4gVGhlIHRlbXBvcmFyeVxuLy8gbGF5ZXIgKGEgY3Jvc3MtZmlsdGVyLCBhbiBvcGVuIHJvd3MgcGFuZWwpIGlzIGl0cyBvd24gc2VjdGlvbiwgc28gYVxuLy8gc25hcHNob3QgbmV2ZXIgY2FycmllcyBpdC5cbi8vXG4vLyBTZXNzaW9uLW9ubHksIG5ldmVyIGluIHRoZSBzbmFwc2hvdDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb21cbi8vIGEgY29tcG9uZW50J3MgZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhXG4vLyB2aWV3ZXIncyB0b2dnbGUgc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLCBhbmQgZWFjaCB0YWJsZSdzIGxheW91dCxcbi8vIHdoaWNoIGZzLWdyaWQgc2VuZHMgd2l0aCB0aGUgdGFibGUncyBvd24gcmVhZHMuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBlZmZlY3RpdmUgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lKS4gUmVsYXRpdmUgcHJlc2V0c1xuICAvLyByZXNvbHZlIGFnYWluc3QgdG9kYXkgaW4gaXQsIGFuZCBkYXRlIGNlbGxzIHJlbmRlciBpbiBpdC5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gc2lnbmFsPHN0cmluZz4oJ1VUQycpO1xuXG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAocmVzb2x2ZUZvcm1hdENvbnRleHQpOlxuICAvLyBpdHMgbG9jYWxlLCBpdHMgY3VycmVuY3kgYW5kIHdoZXRoZXIgcGVyY2VudHMgYXJyaXZlIGFzIHJhdGlvcy4gRXZlcnkgS1BJLFxuICAvLyBjaGFydCwgZGF0ZSBjZWxsIGFuZCBleHBvcnQgcmVhZHMgaXQgaGVyZS4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkXG4gIC8vIG9mIGFuIHVuY2hhbmdlZCByZXBvcnQgcmUtcmVuZGVycyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Q29udGV4dCA9IHNpZ25hbDxSZXBvcnRGb3JtYXRDb250ZXh0PihERUZBVUxUX0ZPUk1BVF9DT05URVhULCB7XG4gICAgZXF1YWw6IChhLCBiKSA9PiBhLmxvY2FsZSA9PT0gYi5sb2NhbGVcbiAgICAgICYmIGEuY3VycmVuY3kgPT09IGIuY3VycmVuY3lcbiAgICAgICYmIGEucmF0aW9QZXJjZW50ID09PSBiLnJhdGlvUGVyY2VudCxcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBlYWNoIHBsYWluIGxpc3QgKGxpc3RIaWRkZW5Db2x1bW5zKSxcbiAgLy8gYnkgY29tcG9uZW50IGlkOyBhIGxpc3Qgc2hvd2luZyBldmVyeSBjb2x1bW4gaGFzIG5vIGVudHJ5LiBBIHNpZ25hbCwgc28gYVxuICAvLyBsaXN0IGhpZGVzIGFuZCBzaG93cyBpdHMgY29sdW1ucyBpbiBwbGFjZTogdGhlIHJvd3MgZG8gbm90IGNoYW5nZSwgc29cbiAgLy8gbm90aGluZyByZWZldGNoZXMuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZCB0aGF0IGtlZXBzIGV2ZXJ5IGNvbHVtblxuICAvLyByZXBhaW50cyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdEhpZGRlbiA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPj4obmV3IE1hcCgpLCB7XG4gICAgZXF1YWw6IHNhbWVIaWRkZW4sXG4gIH0pO1xuXG4gIC8vIE1vdmVzIGVhY2ggdGltZSByZXNldFRvRGVmYXVsdHMoKSByZXBsYWNlcyB0aGUgd2hvbGUgZHVyYWJsZSBzdGF0ZS4gQmFyc1xuICAvLyBhbmQgdGlsZXMga2V5IG9uIGl0LCBzbyBhIHJlc2V0IHJlcGFpbnRzIGFsbCBvZiB0aGVtOyB0aGUgdGlsZXMgcmVmZXRjaFxuICAvLyBpbiBwbGFjZSwgc28gdGhlaXIgZGF0YSBzdGF5cyBvbiBzY3JlZW4gd2hpbGUgdGhleSByZWxvYWQuXG4gIHB1YmxpYyByZWFkb25seSBzdGF0ZVZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9zdGF0ZVZlcnNpb24oKSk7XG5cbiAgLy8gQnkgbGlzdCBjb21wb25lbnQgaWQsIGhvdyBtYW55IHJlc2V0cyBtb3ZlZCB0aGF0IGxpc3QncyBzb3J0LiBGc0xpc3RcbiAgLy8gcmVhZHMgaXRzIHNvcnQgb25seSB3aGVuIGl0IGlzIGNyZWF0ZWQsIHNvIGEgbGlzdCB3aG9zZSBzb3J0IGEgcmVzZXRcbiAgLy8gbW92ZWQgaXMgZHJhd24gYWdhaW4gKGtleWVkIG9uIGl0cyBjb3VudCk7IGV2ZXJ5IG90aGVyIHRpbGUgcmVsb2FkcyBpblxuICAvLyBwbGFjZS5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RTb3J0UmVzZXRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fbGlzdFNvcnRSZXNldHMoKSk7XG5cbiAgLy8gVGhlIG9wZW4gcGFnZSwgb3IgbnVsbCBiZWZvcmUgdGhlIGhvc3QgcmVwb3J0cyBvbmUgKHNldFBhZ2UpLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3BhZ2VJZCgpKTtcblxuICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lOiAnYWxsJyBrZWVwcyB0aGUgcm93cyBldmVyeSBncm91cCBrZWVwcywgJ2FueSdcbiAgLy8gdGhlIHJvd3MgYXQgbGVhc3Qgb25lIGVsaWdpYmxlIGdyb3VwIGtlZXBzIChzZXRNYXRjaCkuXG4gIHB1YmxpYyByZWFkb25seSBtYXRjaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX21hdGNoKCkpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgZmVhdHVyZXMgdGhlIG9wZW4gcmVwb3J0J3Mgc2VydmVyIHNlcnZlcyAoUmVwb3J0LnZpZXdlckZlYXR1cmVzKTpcbiAgLy8gYSBmaWx0ZXIgYmFyIG9mZmVycyBhIGNvbnRyb2wgb25seSB3aGVuIGl0cyBmZWF0dXJlIGlzIGxpc3RlZC4gRW1wdHlcbiAgLy8gYmVmb3JlIGEgcmVwb3J0IGlzIG9wZW4gYW5kIGZyb20gYW4gb2xkZXIgc2VydmVyLlxuICBwdWJsaWMgcmVhZG9ubHkgdmlld2VyRmVhdHVyZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9yZXBvcnQoKT8udmlld2VyRmVhdHVyZXMgPz8gW10pO1xuXG4gIC8vIFRoZSByZXBvcnQgaW5pdCgpIGxhc3QgcmVhZCwgb3IgbnVsbCBiZWZvcmUgb25lIGlzIG9wZW4uIEEgdGlsZSBoZWFkZXJcbiAgLy8gbGlzdHMgaXRzIHNlbGVjdCBvcHRpb25zIGZyb20gaXQgKFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKS5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0c1xuICAvLyAoc3RhdGVEaWZmZXJzKTogd2hhdCB0aGUgcmVwb3J0IGJhcidzICdDbGVhciBmaWx0ZXJzJyBzaG93cyBmb3IuIEEgc3dpdGNoXG4gIC8vIG9mIHBhZ2UgZG9lcyBub3QgY291bnQsIGFuZCB0aGUgdGVtcG9yYXJ5IHN0YXRlIG5ldmVyIGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBkaWZmZXJzRnJvbURlZmF1bHRzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHRoaXMuX3JldmlzaW9uKCk7XG5cbiAgICByZXR1cm4gc3RhdGVEaWZmZXJzKHRoaXMuYXV0aG9yZWRDb25maWcoKSwgdGhpcy5zbmFwc2hvdCgpKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWU+KCk7XG4gIHByaXZhdGUgX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkRpc2FibGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gR3JvdXBzIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdGhlIHZpZXdlciBjbGVhcmVkLiBXaXRob3V0IHRoaXMgYSByZWxvYWQgb2YgdGhlXG4gIC8vIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgZGlhbG9nKSB3b3VsZCBmaW5kIG5vIHZhbHVlIGZvciB0aGUgZ3JvdXAgYW5kIHNlZWRcbiAgLy8gaXRzIGRlZmF1bHQgc3RyYWlnaHQgYmFjay4gQSBjaGFuZ2UgdG8gdGhlIHN0b3JlZCBkZWZhdWx0IHJlbGVhc2VzIGl0LlxuICBwcml2YXRlIF9jbGVhcmVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2w6IGEgc2luZ2xlIHJlcG9ydC13aWRlIGJ1Y2tldCBvdmVycmlkZSBmb3IgYWxsXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cy4gVW5zZXQgPSBlYWNoIGNoYXJ0IHVzZXMgaXRzIGF1dGhvcmVkIGdyYW51bGFyaXR5LiBOZXZlclxuICAvLyBzYXZlZCB0byB0aGUgcmVwb3J0LCBhbmQgY2FycmllZCBpbiB0aGUgZGF0YSByZXF1ZXN0J3NcbiAgLy8gYHN0YXRlYCwgc28gaXQgcHJvcGFnYXRlcyB0aHJvdWdoIHRvIHRoZSBQREYvUG93ZXJQb2ludCBleHBvcnRzIHRvby4gTmFtZWRcbiAgLy8gZm9yIHRoZSBgZnJlcXVlbmN5YCB3aXJlIGtleSBpdCB0cmF2ZWxzIHVuZGVyLCBub3QgZm9yIHRoZSBjb250cm9sJ3MgbGFiZWwuXG4gIHByaXZhdGUgX2ZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mcmVxdWVuY3lDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgdmlld2VyLWNob3NlbiBzb3J0LCBieSBjb21wb25lbnQgaWQuIEhlbGQgaGVyZSByYXRoZXIgdGhhbiBvbmx5XG4gIC8vIGluIHRoZSBsaXN0J3MgRnNMaXN0IHNvIGl0IHN1cnZpdmVzIHRoZSBsaXN0IGJlaW5nIHJlY3JlYXRlZCAoYSBwYWdlIHN3aXRjaCxcbiAgLy8gYSByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkgYW5kIHNvIGV2ZXJ5IGNvbnN1bWVyIG9mIHZpZXdlciBzdGF0ZSByZWFkcyBvbmUgcGxhY2UuXG4gIHByaXZhdGUgX2xpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpLCBieSBjb21wb25lbnQgaWQuIEEgbGlzdCB3aXRoXG4gIC8vIGFuIGVtcHR5IGJveCBoYXMgbm8gZW50cnkuIEhlbGQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29ucyBhcyB0aGUgc29ydHMsIGFuZFxuICAvLyBiZWNhdXNlIHRoZSBib3ggbGl2ZXMgaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIsIG5vdCBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBsaXN0cywgYnkgY29tcG9uZW50IGlkLCBzbyBhIGZpbHRlciB0b2dnbGUgY2FuIHRlbGxcbiAgLy8gd2hpY2ggb2YgdGhlbSBsb3NlIHRoZWlyIHNlYXJjaCBib3ggKGxpc3RTZWFyY2hhYmxlKS5cbiAgcHJpdmF0ZSBfbGlzdHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2guIExpc3Qgc2VhcmNoIGFuZCBlZmZlY3RpdmVMb2NhbGVcbiAgLy8gc2hpcCBpbiB0aGUgc2FtZSBmcmFtZXdvcmsgY2hhbmdlIHNldCwgc28gYSBzZXJ2ZXIgdGhhdCBzZW5kcyBub1xuICAvLyBlZmZlY3RpdmVMb2NhbGUgaGFzIG5laXRoZXIsIGFuZCBpdHMgbGlzdHMgc2hvdyBubyBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZXJ2ZXJTZWFyY2hlcyA9IGZhbHNlO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgbGlzdCB3aG9zZSBzZWFyY2ggdGV4dCBjaGFuZ2VkLlxuICBwcml2YXRlIF9saXN0U2VhcmNoQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gRW1pdHMgdGhlIGdyb3VwIGlkIHRoYXQgY2hhbmdlZDsgY29tcG9uZW50cyBsaXN0ZW4gZmlsdGVyZWQgdG8gdGhlaXIgb3duXG4gIC8vIGdyb3VwIGlkcy4gbnVsbCA9IGV2ZXJ5dGhpbmcgY2hhbmdlZCAocmUtaW5pdCkuXG4gIHByaXZhdGUgX2NoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvLyBGaXJlcyB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgdmlld2VyIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQuXG4gIHByaXZhdGUgX3N0YXRlQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIENvdW50cyB0aGUgY2hhbmdlcyBjaGFuZ2VzKCkgcmVwb3J0cy4gVGhlIGdyb3VwIHZhbHVlcywgdGhlIGdyYWluIGFuZFxuICAvLyB0aGUgbGlzdCBzdGF0ZSB0aGF0IGRpZmZlcnNGcm9tRGVmYXVsdHMgY29tcGFyZXMgYXJlIHRoZSBwbGFpbiBmaWVsZHNcbiAgLy8gYWJvdmUsIHdoaWNoIGV2ZXJ5IHNldHRlciByZXBvcnRzIHRocm91Z2ggY2hhbmdlcygpICh0aGV5IGFyZSBzaGFyZWRcbiAgLy8gd2l0aCB0aGUgaW5saW5lIHZhbHVlcyBidWlsZCwgc28gdGhleSBzdGF5IGFzIHRoZXkgYXJlKTsgdGhpcyBjb3VudGVyIGlzXG4gIC8vIGhvdyB0aGUgY29tcHV0ZWQgaGVhcnMgb2YgdGhlbS4gVGhlIHBhZ2UsIG1hdGNoIGFuZCBkcmlsbHMgYmVsb3cgYXJlXG4gIC8vIHNpZ25hbHMgYW5kXG4gIC8vIGlzIHJlYWQgZGlyZWN0bHkuIFRoZSBzdWJqZWN0IGlzIHRoaXMgc2VydmljZSdzIG93biBhbmQgaXMgbmV2ZXJcbiAgLy8gY29tcGxldGVkLCBzbyB0aGUgc2lnbmFsIGxpc3RlbnMgdG8gaXQgZXhhY3RseSBhcyBsb25nIGFzIHRoZSBzZXJ2aWNlXG4gIC8vIGxpdmVzLlxuICBwcml2YXRlIF9yZXZpc2lvbiA9IHRvU2lnbmFsKHRoaXMuX3N0YXRlQ2hhbmdlZCQucGlwZShzY2FuKChjb3VudCkgPT4gY291bnQgKyAxLCAwKSksIHtcbiAgICBpbml0aWFsVmFsdWU6IDAsXG4gICAgbWFudWFsQ2xlYW51cDogdHJ1ZSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfc3RhdGVWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIHByaXZhdGUgX2xpc3RTb3J0UmVzZXRzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgbnVtYmVyPj4obmV3IE1hcCgpKTtcblxuICAvLyBUaGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQ6IHRoZSB0aWxlcyBhbmQgcGFnZXMgdGhlIHN0YXRlIGlzIGNoZWNrZWRcbiAgLy8gYWdhaW5zdC5cbiAgcHJpdmF0ZSBfcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBvcGVuIHBhZ2UsIHNldCBieSB0aGUgaG9zdCBhcyB0aGUgdmlld2VyIG1vdmVzIGJldHdlZW4gcGFnZXMuXG4gIHByaXZhdGUgX3BhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lOiAnYWxsJyAodGhlIGRlZmF1bHQpIG9yICdhbnknLlxuICBwcml2YXRlIF9tYXRjaCA9IHNpZ25hbDxSZXBvcnRGaWx0ZXJNYXRjaD4oJ2FsbCcpO1xuXG4gIC8vIEVhY2ggY2hhcnQncyBkcmlsbCBwYXRoLCB0b3AgZmlyc3QsIGJ5IGNvbXBvbmVudCBpZC4gQSBjaGFydCBhdCBpdHMgdG9wXG4gIC8vIGhhcyBubyBlbnRyeSwgYW5kIG9ubHkgYSBjaGFydCBoYXMgb25lLlxuICBwcml2YXRlIF9kcmlsbHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXT4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBjaGFydCB3aG9zZSBkcmlsbCBwYXRoIGNoYW5nZWQuXG4gIHByaXZhdGUgX2RyaWxsQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIGxheW91dCBhIHZpZXdlciBwdXQgZWFjaCB0YWJsZSB0aWxlIGluLCBieSBjb21wb25lbnQgaWQsIHdoaWxlIGl0XG4gIC8vIGRpZmZlcnMgZnJvbSB0aGUgdGlsZSdzIGF1dGhvcmVkIGxheW91dCwgd2l0aCB0aGUgYXV0aG9yZWQgbGF5b3V0IGl0IHdhc1xuICAvLyBjaGFuZ2VkIGZyb20gKFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0LmJhc2UpLiBBIHRhYmxlIHNob3dpbmcgaXRzIGF1dGhvcmVkXG4gIC8vIGxheW91dCBoYXMgbm8gZW50cnksIGFuZCBvbmx5IGEgdGFibGUgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfZ3JpZExheW91dHMgPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCBSZXBvcnRHcmlkU2Vzc2lvbkxheW91dD4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gVGhlIHRlbXBvcmFyeSBsYXllcjoga2VwdCBhcGFydCBmcm9tIGV2ZXJ5dGhpbmcgYWJvdmUsIHNvIHNuYXBzaG90KClcbiAgLy8gYW5kIGRpZmZlcnNGcm9tRGVmYXVsdHMgbmV2ZXIgcmVhZCBpdC5cbiAgcHJpdmF0ZSBfdGVtcG9yYXJ5ID0gc2lnbmFsPFJlcG9ydFRlbXBvcmFyeVN0YXRlPihlbXB0eVRlbXBvcmFyeVN0YXRlKCkpO1xuXG4gIC8vIFNlZWQgZ3JvdXBzICsgdGhlaXIgZGVmYXVsdHMgd2hlbiBhIHJlcG9ydCBsb2Fkcy4gRXhpc3Rpbmcgc2Vzc2lvbiB2YWx1ZXNcbiAgLy8gZm9yIHN0aWxsLWV4aXN0aW5nIGdyb3VwcyBzdXJ2aXZlIGEgc3RydWN0dXJlIHJlLWZldGNoIChhIGNoYXQgZWRpdFxuICAvLyBzaG91bGRuJ3QgcmVzZXQgdGhlIHZpZXdlcidzIGZpbHRlcnMpLCBhbmQgc28gZG9lcyBhIGdyb3VwIHRoZSB2aWV3ZXJcbiAgLy8gY2xlYXJlZCDigJQgVU5MRVNTIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0IGl0c2VsZiBjaGFuZ2VkLCB3aGljaCBvbmx5XG4gIC8vIGhhcHBlbnMgd2hlbiBhbiBvcGVyYXRvciBzYXZlZCBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydCBzZXR0aW5ncyBvciB0aGVcbiAgLy8gYWdlbnQgc2V0IG9uZS4gVGhhdCBpcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiB0byByZS1zZWVkLCBzbyBpdCB3aW5zIG92ZXJcbiAgLy8gdGhlIHN1cnZpdmluZyBzZXNzaW9uIHZhbHVlOyB3aXRob3V0IGl0IHRoZSBiYXIga2VlcHMgc2hvd2luZyB3aGF0ZXZlciBpdFxuICAvLyB3YXMgZmlyc3Qgc2VlZGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAvL1xuICAvLyBBIGNoYW5nZSBvZiB0aGUgcmVwb3J0J3Mgem9uZSBtb3ZlcyBcInRvZGF5XCIsIHNvIGEgdmFsdWUgc3RpbGwgY2FycnlpbmcgaXRzXG4gIC8vIGdyb3VwIGRlZmF1bHQncyBwcmVzZXQgbmFtZSBpcyByZXNvbHZlZCBhZ2FpbiBpbiB0aGUgbmV3IHpvbmUuIEEgdmFsdWUgdGhlXG4gIC8vIHZpZXdlciBwaWNrZWQsIG9yIG9uZSBjYXJyeWluZyBhbm90aGVyIHByZXNldCBuYW1lLCBpcyBrZXB0IGFzIGl0IGlzLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzVGltZXpvbmUgPSB0aGlzLnRpbWV6b25lKCk7XG5cbiAgICAvLyBTZXQgZmlyc3Q6IHRoZSBkZWZhdWx0cyBzZWVkZWQgYmVsb3cgcmVzb2x2ZSB0aGVpciByZWxhdGl2ZSBwcmVzZXRzIGluIGl0LlxuICAgIHRoaXMudGltZXpvbmUuc2V0KHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpKTtcbiAgICB0aGlzLmZvcm1hdENvbnRleHQuc2V0KHJlc29sdmVGb3JtYXRDb250ZXh0KHJlcG9ydCkpO1xuICAgIC8vIEJlZm9yZSB0aGUgcHJ1bmluZzogbGlzdFNlYXJjaGFibGUgcmVhZHMgaXQuXG4gICAgdGhpcy5fc2VydmVyU2VhcmNoZXMgPSByZXBvcnQuZWZmZWN0aXZlTG9jYWxlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB0aW1lem9uZUNoYW5nZWQgPSBwcmV2aW91c1RpbWV6b25lICE9PSB0aGlzLnRpbWV6b25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNHcm91cHMgPSB0aGlzLl9ncm91cHM7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KGdyb3VwLmlkLCBncm91cCk7XG4gICAgICB0aGlzLl9zZWVkKGdyb3VwLCBwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpID8/IG51bGwsIHRpbWV6b25lQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHRoaXMuX3BydW5lKHJlcG9ydCk7XG4gICAgdGhpcy5fcHJ1bmVQYWdlU3RhdGUocmVwb3J0KTtcblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIGRhdGUgcGlja2VyIHByZXNldCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIHJlbGF0aXZlIHByZXNldCBuYW1lIGFzIHRvZGF5J3MgcmFuZ2UgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIG9yIG51bGwgZm9yXG4gIC8vIGEgbmFtZSBpdCBkb2VzIG5vdCBrbm93LlxuICBwdWJsaWMgcmVzb2x2ZVJlbGF0aXZlKG5hbWU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aXZlUmFuZ2UobmFtZSk7XG4gIH1cblxuICAvLyBUaGUgYWN0aXZlIGdyb3VwLWJ5IGdyYWluLCBvciBudWxsIHdoZW4gdGhlIHZpZXdlciBoYXNuJ3QgY2hvc2VuIG9uZS5cbiAgcHVibGljIGZyZXF1ZW5jeSgpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSBzbmFwc2hvdCgpIGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TGlzdFNvcnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRleHQgYSBsaXN0IGlzIHNlYXJjaGVkIGJ5LCBvciBudWxsIHdoZW4gaXRzIHNlYXJjaCBib3ggaXMgZW1wdHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgYSBsaXN0IHNob3dzIHRoZSBzZWFyY2ggYm94IG92ZXIgaXRzIHRleHQgY29sdW1uczogaXQgZG9lcyB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoIChzZWUgX3NlcnZlclNlYXJjaGVzKSwgdW5sZXNzIG9uZSBvZiBpdHMgbGl2ZVxuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gYSBrZXl3b3JkIGdyb3VwIGl0cyBoZWFkZXIgc2hvd3MuIEEgYmFyIHNob3dzIG9uZSBzZWFyY2hcbiAgLy8gYm94IChpdHMgbGFzdCBrZXl3b3JkIGl0ZW0pLCBhbmQgdGhhdCBvbmUgaXMgdGhlIGF1dGhvcidzLiBUaGUgaGVhZGVyLCB0aGVcbiAgLy8gcHJ1bmluZywgdGhlIGRhdGEgcmVxdWVzdCBzdGF0ZSBhbmQgdGhlIGV4cG9ydHMgYWxsIHJlYWRcbiAgLy8gdGhpcyBvbmUgcnVsZSwgc28gbm8gc2VhcmNoIG5hcnJvd3MgYSBsaXN0IHdob3NlIHNjcmVlbiBoYXMgbm8gYm94IHNob3dpbmdcbiAgLy8gaXQsIGFuZCBubyBleHBvcnQgdGl0bGVzIGEgc2VhcmNoIHRoZSBzZXJ2ZXIgZGlkIG5vdCBhcHBseS5cbiAgcHVibGljIGxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclNlYXJjaGVzXG4gICAgICAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICAmJiAhKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5zb21lKChmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyLmVuYWJsZWRcbiAgICAgICAgICAmJiAhdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpXG4gICAgICAgICAgJiYgZ3JvdXA/LnR5cGUgPT09ICdrZXl3b3JkJ1xuICAgICAgICAgICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCk7IGFuIGVtcHR5IGJveCBjbGVhcnNcbiAgLy8gaXQuIFRoZSBoZWFkZXIgY2FsbHMgdGhpcyBvbiBldmVyeSBjaGFuZ2Ugb2YgYW55IG9mIGl0cyBpdGVtcywgc28gdGhlXG4gIC8vIGxpc3QgYW5kIGNoYW5nZXMoKSBoZWFyIGFib3V0IGl0IG9ubHkgd2hlbiB0aGUgc3RvcmVkIHRleHQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgcHVibGljIHNldExpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2VhcmNoID0gbGlzdFNlYXJjaFRleHQodGV4dCk7XG5cbiAgICBpZiAoc2VhcmNoID09PSAodGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gJycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW4gbmFtZXMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdDsgbm9uZSB3aGVuIGl0IHNob3dzIHRoZW0gYWxsLlxuICBwdWJsaWMgaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RIaWRkZW4oKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBsaXN0LCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOlxuICAvLyBuYW1lcyB0aGUgbGlzdCBjYW5ub3QgaGlkZSBhcmUgZHJvcHBlZCwgYW5kIG5vbmUgKG9yIGV2ZXJ5IGNvbHVtbikgY2xlYXJzXG4gIC8vIHRoZSBlbnRyeS4gT25seSBjaGFuZ2VzKCkgaGVhcnMgYWJvdXQgaXQsIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXRIaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhpZGRlbiA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgaWYgKHNhbWVOYW1lcyhoaWRkZW4sIHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5saXN0SGlkZGVuKCkpO1xuXG4gICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBoaWRkZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIG9uZSBsaXN0J3Mgc2VhcmNoIHRleHQgY2hhbmdlcywgc28gdGhhdCBsaXN0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGlkKSA9PiBpZCA9PT0gY29tcG9uZW50SWQpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgdmlld2VyIHN0YXRlIG1heSBoYXZlIGNoYW5nZWQ6IGEgZ3JvdXAgdmFsdWUsIHRoZVxuICAvLyBncmFpbiwgdGhlIG1hdGNoLCB0aGUgcGFnZSwgYSBsaXN0IHNvcnQsIHNlYXJjaCBvciBoaWRkZW4gY29sdW1ucywgYVxuICAvLyBkcmlsbCBwYXRoLCBhIHJlc2V0IG9yIGEgKHJlKWxvYWQgb2YgdGhlIHJlcG9ydC5cbiAgcHVibGljIGNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuaW5nIGEga2V5d29yZCBmaWx0ZXIgYmFjayBvbiB0YWtlcyBpdHMgbGlzdCdzIHNlYXJjaCBib3ggYXdheSwgYW5kXG4gICAgLy8gdGhlIHNlYXJjaCB3aXRoIGl0LiBUaGUgbGlzdCByZWZldGNoZXMgb24gdGhlIGdyb3VwIGNoYW5nZSBiZWxvdy5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBBTlkgb2YgYSBzZXQgb2YgY29tcG9uZW50cyB0aGF0IGNvbWVzIGFuZCBnb2VzXG4gIC8vIChhIHBhZ2UncyB2YWx1ZXMpOiBhIGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiB0aGVpciBmaWx0ZXJzIGJlbG9uZ3MgdG8uXG4gIC8vIFVubGlrZSBjaGFuZ2VzRm9yLCB0aGUgc2V0IGlzIHJlYWQgb24gZWFjaCBldmVudCByYXRoZXIgdGhhbiBjYXB0dXJlZCBhdFxuICAvLyBzdWJzY3JpYmUsIHNvIG9uZSBzdWJzY3JpcHRpb24gZm9sbG93cyB0aGUgc2V0IGFzIHRoZSByZXBvcnQgcmVsb2Fkcy4gQVxuICAvLyBmdWxsIHJlLWluaXQgKG51bGwpIGlzIG5vdCBwYXNzZWQgb246IGluaXQoKSBydW5zIG9uIGEgcmVwb3J0XG4gIC8vIChyZSlsb2FkLCBhbmQgYSBjYWxsZXIgb2YgdGhpcyBjaGVja3Mgb24gdGhhdCByZWxvYWQgaXRzZWxmIHdoZXRoZXIgdGhlXG4gIC8vIGZpbHRlciB2YWx1ZXMgaXRzIGNvbXBvbmVudHMgYXJlIHJlYWQgd2l0aCBtb3ZlZC5cbiAgcHVibGljIGNoYW5nZXNGb3JBbnkoY29tcG9uZW50czogKCkgPT4gUmVwb3J0Q29tcG9uZW50W10pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKTogZ3JvdXBJZCBpcyBudW1iZXIgPT4gZ3JvdXBJZCAhPT0gbnVsbFxuICAgICAgICAgICYmIGNvbXBvbmVudHMoKS5zb21lKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5zb21lKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkID09PSBncm91cElkKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBncm91cCB2YWx1ZXMgcmVzb2x2ZWQgaW50byB0aGlzIGNvbXBvbmVudCdzIG1lbWJlci1maWx0ZXIgdmFsdWVzIOKAlFxuICAvLyB3aGF0IHRoZSBkYXRhIHJlcXVlc3QgY2Fycmllcy4gRGlzYWJsZWQgZmlsdGVycyAoYXV0aG9yZWQgb3Igc2Vzc2lvbikgYXJlXG4gIC8vIHNraXBwZWQgZW50aXJlbHkuXG4gIHB1YmxpYyByZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBjb21wb25lbnQuZmlsdGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFmaWx0ZXIuZW5hYmxlZCB8fCB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG4gICAgICBjb25zdCBmaWVsZHMgPSB2YWx1ZSA/IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKSA6IG51bGw7XG5cbiAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7IGZpbHRlcklkOiBmaWx0ZXIuaWQsIC4uLmZpZWxkcyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIHNldCwgb25lIGVudHJ5IHBlciBmaWx0ZXIgZ3JvdXAsIGZvciB0aGUgcmVwb3J0IGNoYXQ6XG4gIC8vIHRoZSBhZ2VudCByZWFkcyBpdCB0byBrbm93IHdoYXQgaXMgb24gc2NyZWVuLiBHcm91cCBvcmRlciwgbm90IHRoZSBvcmRlclxuICAvLyB0aGUgdmFsdWVzIHdlcmUgc2V0IGluLCBzbyB0aGUgc2FtZSBzdGF0ZSBhbHdheXMgcmVhZHMgdGhlIHNhbWUuIEEgZ3JvdXBcbiAgLy8gd2l0aCBub3RoaW5nIGluIGl0IGlzIGxlZnQgb3V0LCBhbmQgYSBzYXZlZCBkZWZhdWx0IGNvdW50cyB1bnRpbCB0aGVcbiAgLy8gdmlld2VyIGNoYW5nZXMgaXQuIFBlci1maWx0ZXIgdG9nZ2xlcyBhcmUgYSBjb21wb25lbnQncyBvd24gYnVzaW5lc3MsIHNvXG4gIC8vIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgdmlld2VyRmlsdGVycygpOiBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fdmFsdWVzLmVudHJpZXMoKV1cbiAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYSAtIGIpXG4gICAgICAubWFwKChbZ3JvdXBJZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuX3Jlc29sdmVkRmllbGRzKHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gZmllbGRzID8geyBncm91cElkLCAuLi5maWVsZHMgfSA6IG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyID0+IGVudHJ5ICE9PSBudWxsKTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIE9ubHkgYSB0aWxlIGJlY29tZXMgYSBmaWxlIChpc1RpbGUpLCBzbyBubyBvdGhlclxuICAvLyBjb21wb25lbnQncyBlbnRyaWVzIHJpZGUgYWxvbmcuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gaXNUaWxlKGNvbXBvbmVudCkpXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UGFnZShwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAocGFnZUlkID09PSB0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgY2hhbmdlIG9mIG1hdGNoIGNhbiBjaGFuZ2UgZXZlcnkgdGlsZSBhIGdyb3VwIHdpdGggYSB2YWx1ZSBuYXJyb3dzLCBzb1xuICAvLyBldmVyeSB0aWxlIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TWF0Y2gobWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dDogUmVwb3J0RmlsdGVyTWF0Y2ggPSBtYXRjaCA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xuICAgIGlmIChuZXh0ID09PSB0aGlzLl9tYXRjaCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbWF0Y2guc2V0KG5leHQpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0OyBlbXB0eSB3aGlsZSB0aGUgY2hhcnQgaXMgYXQgaXRzIHRvcC5cbiAgLy8gSXQgcmVhZHMgYSBzaWduYWwsIHNvIGEgdGVtcGxhdGUgdGhhdCBzaG93cyBpdCByZXBhaW50cyB3aGVuIGl0IG1vdmVzLlxuICBwdWJsaWMgZHJpbGwoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZHJpbGxzKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBjaGFydCdzIGRyaWxsIHBhdGgsIGtlcHQgdG8gY2xlYW5EcmlsbFBhdGg7IGFuIGVtcHR5IHBhdGggaXNcbiAgLy8gdGhlIGNoYXJ0J3MgdG9wLiBPbmx5IGEgY2hhcnQgb2YgdGhlIG9wZW4gcmVwb3J0IGRyaWxsczogYSBwYXRoIGZvciBhbnlcbiAgLy8gb3RoZXIgY29tcG9uZW50IGlzIGlnbm9yZWQuIE9ubHkgdGhhdCBjaGFydCBhbmQgY2hhbmdlcygpIGhlYXIgYWJvdXQgaXQsXG4gIC8vIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXREcmlsbChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSBjbGVhbkRyaWxsUGF0aChwYXRoKTtcbiAgICBpZiAoIXRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpIHx8IHNhbWVEcmlsbFBhdGgoa2VwdCwgdGhpcy5kcmlsbChjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICB0aGlzLl9kcmlsbENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGNoYXJ0J3MgZHJpbGwgcGF0aCBjaGFuZ2VzLCBzbyB0aGF0IGNoYXJ0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGRyaWxsQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaWxsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRha2VzIHRoZSBkcmlsbCBwYXRoIGEgY2hhcnQncyBhbnN3ZXIgYXBwbGllZCBhcyB0aGUgY2hhcnQncyBvd246IHRoZVxuICAvLyBzZXJ2ZXIga2VlcHMgdGhlIGxvbmdlc3QgcGFydCBvZiBhIHNlbnQgcGF0aCBpdCBjYW4gYXBwbHksIHNvIGEgbGF0ZXJcbiAgLy8gc2F2ZSBob2xkcyB0aGF0IHBhcnQgb25seS4gVGhlIGNoYXJ0IGhhcyBqdXN0IHJlYWQgdGhhdCBwYXRoLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC4gVHJ1ZSB3aGVuIHRoZSBwYXRoIGNoYW5nZWQuXG4gIHB1YmxpYyBhZG9wdERyaWxsKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2VwdCA9IGNsZWFuRHJpbGxQYXRoKHBhdGgpO1xuICAgIGlmICghdGhpcy5faXNDaGFydChjb21wb25lbnRJZCkgfHwgc2FtZURyaWxsUGF0aChrZXB0LCB0aGlzLmRyaWxsKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSBpcyBvbiBzY3JlZW4gaW46IHRoZSB2aWV3ZXIncyBvd24gd2hpbGUgdGhleVxuICAvLyBjaGFuZ2VkIGl0IGZyb20gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGVsc2UgdGhlIGF1dGhvcmVkIG9uZS4gSXQgcmVhZHNcbiAgLy8gYSBzaWduYWwsIHNvIGEgdGlsZSB0aGF0IHNob3dzIGl0IHJlZHJhd3Mgd2hlbiBlaXRoZXIgbW92ZXMuXG4gIHB1YmxpYyBncmlkTGF5b3V0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZExheW91dCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSA/PyBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIncyBvd24gbGF5b3V0IG9mIGEgdGFibGUgdGlsZSB3aGlsZSBpdCBkaWZmZXJzIGZyb20gdGhlIGxheW91dFxuICAvLyBhdXRob3JlZCBub3csIGVsc2UgbnVsbDogdGhlIHRpbGUgc2hvd3MgaXRzIHN0b3JlZCBsYXlvdXQuIFRoZSBjaGF0XG4gIC8vIHNlbmRzIGl0IGFzIHRoZSB0aWxlJ3MgbGF5b3V0LlxuICBwdWJsaWMgZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBHcmlkTGF5b3V0IHwgbnVsbCB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2dyaWRMYXlvdXRzKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG5cbiAgICByZXR1cm4gc2Vzc2lvbj8uYmFzZSA9PT0gZ3JpZExheW91dEtleShhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KSlcbiAgICAgID8gc2Vzc2lvbi5sYXlvdXRcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGxheW91dCBhIHZpZXdlciBwdXQgYSB0YWJsZSB0aWxlIGluIChhIHJlLXBpdm90LCBhIHNvcnQsIGFcbiAgLy8gY29sdW1uIGZpbHRlcikuIE9uZSB0aGF0IGRyYXdzIHRoZSBhdXRob3JlZCBsYXlvdXQgY2xlYXJzIHRoZSBlbnRyeSwgc29cbiAgLy8gdGhlIHRpbGUgcmVhZHMgYXMgc3RvcmVkIGFnYWluLiBmcy1ncmlkIHJlYWRzIHRoZSBjaGFuZ2UgaXRzZWxmLCBzbyBvbmx5XG4gIC8vIGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdCwgYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldEdyaWRMYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxheW91dDogR3JpZExheW91dCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2UgPSBncmlkTGF5b3V0S2V5KGF1dGhvcmVkR3JpZExheW91dChjb21wb25lbnQpKTtcbiAgICBjb25zdCBrZXkgPSBncmlkTGF5b3V0S2V5KGxheW91dCk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2dyaWRMYXlvdXRzKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgY29uc3QgdW5jaGFuZ2VkID0ga2V5ID09PSBiYXNlXG4gICAgICA/ICFjdXJyZW50XG4gICAgICA6IGN1cnJlbnQ/LmJhc2UgPT09IGJhc2UgJiYgZ3JpZExheW91dEtleShjdXJyZW50LmxheW91dCkgPT09IGtleTtcblxuICAgIGlmIChjb21wb25lbnQudHlwZSAhPT0gJ2dyaWQnIHx8IHVuY2hhbmdlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuX2dyaWRMYXlvdXRzKCkpO1xuXG4gICAgaWYgKGtleSA9PT0gYmFzZSkge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50LmlkLCB7IGxheW91dCwgYmFzZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9ncmlkTGF5b3V0cy5zZXQobmV4dCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgZHVyYWJsZSBzdGF0ZSBvbiBzY3JlZW4gYXMgb25lIGRvY3VtZW50OiB0aGUgcGFnZSwgZXZlcnkgZ3JvdXAgdGhlXG4gIC8vIHJlcG9ydCBoYXMgKG51bGwgd2hlbiBpdCBob2xkcyBub3RoaW5nLCBhIGNsZWFyZWQgZGVmYXVsdCBpbmNsdWRlZCksIHRoZVxuICAvLyBtYXRjaCwgdGhlIGdyYWluLCBhbmQgZWFjaCB0aWxlJ3Mgc29ydCwgc2VhcmNoLCBoaWRkZW4gY29sdW1ucyBhbmQgZHJpbGxcbiAgLy8gcGF0aCB3aGVyZSB0aGV5IGRpZmZlciBmcm9tIHRoZSBhdXRob3JlZCB0aWxlLiBBIGRhdGUgcmFuZ2UgdGhhdCBzdGlsbFxuICAvLyBjYXJyaWVzIGl0cyByZWxhdGl2ZSBwcmVzZXQgaXMgd3JpdHRlbiBhcyB0aGF0IHByZXNldCwgd2hhdGV2ZXIgdG9kYXkgaXNcbiAgLy8gKHRvU3RvcmVkR3JvdXBWYWx1ZSkuIFRoZSB0ZW1wb3JhcnkgbGF5ZXIgaXMgbmV2ZXIgcGFydCBvZiBpdC5cbiAgcHVibGljIHNuYXBzaG90KCk6IFJlcG9ydFN0YXRlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBSZXBvcnRTdGF0ZVNuYXBzaG90ID0ge307XG5cbiAgICBpZiAodGhpcy5fcGFnZUlkKCkpIHtcbiAgICAgIHNuYXBzaG90LnBhZ2VJZCA9IHRoaXMuX3BhZ2VJZCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9mcmVxdWVuY3kpIHtcbiAgICAgIHNuYXBzaG90Lmdyb3VwQnkgPSB0aGlzLl9mcmVxdWVuY3k7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21hdGNoKCkgPT09ICdhbnknKSB7XG4gICAgICBzbmFwc2hvdC5tYXRjaCA9ICdhbnknO1xuICAgIH1cblxuICAgIHNuYXBzaG90Lmdyb3VwcyA9IHRoaXMuX3NuYXBzaG90R3JvdXBzKCk7XG5cbiAgICBjb25zdCB0aWxlcyA9IHRoaXMuX3NuYXBzaG90VGlsZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXModGlsZXMpLmxlbmd0aCkge1xuICAgICAgc25hcHNob3QudGlsZXMgPSB0aWxlcztcbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMgYXMgYSBzbmFwc2hvdDogZXZlcnkgZ3JvdXAgYXQgaXRzIGF1dGhvcmVkXG4gIC8vIGRlZmF1bHQgKG51bGwgd2hlbiBpdCBoYXMgbm9uZSksIG5vIG1hdGNoLCBncmFpbiBvciB0aWxlIHN0YXRlLlxuICBwdWJsaWMgYXV0aG9yZWRDb25maWcoKTogUmVwb3J0U3RhdGVTbmFwc2hvdCB7XG4gICAgY29uc3QgZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiA9IHt9O1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBncm91cHNbZ3JvdXAuaWRdID0gdG9TdG9yZWRHcm91cFZhbHVlKGdyb3VwLnR5cGUsIHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgZ3JvdXBzIH07XG4gIH1cblxuICAvLyBQdXRzIHRoZSBzY3JlZW4gYmFjayBvbiB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMgb24gdGhlIHBhZ2UgaXQgaXNcbiAgLy8gb246IGV2ZXJ5IGdyb3VwIGF0IGl0cyBkZWZhdWx0LCBtYXRjaCAnYWxsJywgbm8gZ3JhaW4sIGFuZCBldmVyeSB0aWxlIGF0XG4gIC8vIGl0cyBhdXRob3JlZCBzb3J0LCBzZWFyY2gsIGNvbHVtbnMgYW5kIHRvcC4gQ2xlYXJzIHRoZSB0ZW1wb3JhcnkgbGF5ZXIuXG4gIC8vIFRoZSB0aWxlcyBzdGF5IGFuZCByZWxvYWQgaW4gcGxhY2UsIGV4Y2VwdCBhIGxpc3Qgd2hvc2Ugc29ydCB0aGlzIG1vdmVkXG4gIC8vIChsaXN0U29ydFJlc2V0cykuIEV2ZXJ5IGNoYW5nZSBpcyBhbm5vdW5jZWQgb25jZSwgYXQgdGhlIGVuZC5cbiAgcHVibGljIHJlc2V0VG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9mcmVxdWVuY3k7XG4gICAgY29uc3Qgc29ydHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RTb3J0cyk7XG5cbiAgICB0aGlzLl90ZW1wb3Jhcnkuc2V0KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB0aGlzLl9zZWVkQXV0aG9yZWQoZ3JvdXApKTtcbiAgICB0aGlzLl9tYXRjaC5zZXQoJ2FsbCcpO1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IG51bGw7XG4gICAgdGhpcy5fY2xlYXJUaWxlcygpO1xuICAgIHRoaXMuX2NvdW50U29ydFJlc2V0cyhzb3J0cyk7XG4gICAgdGhpcy5fbm90aWZ5UmVzZXQoZnJlcXVlbmN5KTtcbiAgfVxuXG4gIC8vIFB1dHMgb25seSBgZ3JvdXBJZHNgIGJhY2sgb24gdGhlaXIgYXV0aG9yZWQgZGVmYXVsdHMuIEEgdGlsZSBoZWFkZXInc1xuICAvLyAnQ2xlYXIgZmlsdGVycycgb3ducyBvbmx5IGl0cyBvd24gZ3JvdXBzOyB0aGUgcmVwb3J0IGJhcidzIGNhbGxzXG4gIC8vIHJlc2V0VG9EZWZhdWx0cygpLiBFYWNoIGdyb3VwIGlzIGFubm91bmNlZCBhcyBhIHZpZXdlcidzIGNoYW5nZSB0byBpdCBpcyxcbiAgLy8gc28gdGhlIHRpbGVzIGluIGl0IHJlZmV0Y2ggYW5kIGEgYmFyIHNob3dpbmcgaXQgd2l0aCBhbm90aGVyIHZhbHVlIGlzXG4gIC8vIGJ1aWx0IGFnYWluLlxuICBwdWJsaWMgcmVzZXRHcm91cHNUb0RlZmF1bHRzKGdyb3VwSWRzOiByZWFkb25seSBudW1iZXJbXSk6IHZvaWQge1xuICAgIGdyb3VwSWRzLmZvckVhY2goKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZWVkQXV0aG9yZWQoZ3JvdXApO1xuICAgICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gV2hldGhlciBvbmUgb2YgYGdyb3VwSWRzYCBzaG93cyBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGF1dGhvcmVkIGRlZmF1bHQsXG4gIC8vIHRoZSB2YWx1ZSByZXNldEdyb3Vwc1RvRGVmYXVsdHMoKSBwdXRzIGJhY2suIEEgdGlsZSBoZWFkZXIncyBDbGVhciBjaGlwXG4gIC8vIHNob3dzIGV4YWN0bHkgd2hpbGUgb25lIG9mIGl0cyBvd24gZ3JvdXBzIGRvZXMuIEl0IHJlYWRzIHRoZSByZXZpc2lvblxuICAvLyBkaWZmZXJzRnJvbURlZmF1bHRzIHJlYWRzLCBzbyBhIGNhbGxlciBvbiBlYWNoIGNoZWNrIG9mIGFuIE9uUHVzaCB2aWV3XG4gIC8vIHN0YXlzIGN1cnJlbnQuXG4gIHB1YmxpYyBncm91cHNEaWZmZXJGcm9tRGVmYXVsdHMoZ3JvdXBJZHM6IHJlYWRvbmx5IG51bWJlcltdKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmV2aXNpb24oKTtcblxuICAgIHJldHVybiBncm91cElkcy5zb21lKChncm91cElkKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yZWQgPSB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKSk7XG4gICAgICBjb25zdCBzY3JlZW4gPSB0aGlzLl9jbGVhcmVkLmhhcyhncm91cElkKSA/IG51bGwgOiB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fdmFsdWVzLmdldChncm91cElkKSk7XG5cbiAgICAgIHJldHVybiAhc2FtZVN0b3JlZEdyb3VwVmFsdWUoYXV0aG9yZWQsIHNjcmVlbik7XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgaW50ZXJhY3Rpb24gc3RhdGUgYSB0aWxlJ3MgZGF0YSByZXF1ZXN0IGNhcnJpZXMgbm93OiB0aWxlRGF0YVN0YXRlXG4gIC8vIG92ZXIgdGhlIG9wZW4gcmVwb3J0IGFuZCB0aGUgc2NyZWVuJ3Mgc25hcHNob3QoKS5cbiAgcHVibGljIHRpbGVTdGF0ZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IENvbXBvbmVudERhdGFTdGF0ZSB7XG4gICAgcmV0dXJuIHRpbGVEYXRhU3RhdGUodGhpcy5fcmVwb3J0KCksIGNvbXBvbmVudCwgdGhpcy5zbmFwc2hvdCgpKTtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGdyb3VwJ3MgdmFsdWUgc3RpbGwgaXMsIGFzIGEgZGF0YSByZXF1ZXN0IG5hbWVzIGl0XG4gIC8vIChpdHMgcHJlc2V0IHdoaWxlIGl0cyBkYXlzIGFyZSB0aGF0IHJhbmdlIHJlc29sdmVkIHRvZGF5KSwgb3IgbnVsbC4gVGhlXG4gIC8vIGV4cG9ydCB3b3JkaW5nIG5hbWVzIGEgbGl2ZSBwcmVzZXQgYnkgaXQuXG4gIHB1YmxpYyBsaXZlUHJlc2V0KGdyb3VwSWQ6IG51bWJlcik6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG5cbiAgICByZXR1cm4gdmFsdWUgPyB0aGlzLl9saXZlUHJlc2V0KHZhbHVlKSA6IG51bGw7XG4gIH1cblxuICAvLyBBIGdyb3VwIHZhbHVlIGFzIHRoZSBmaWVsZHMgYSByZXF1ZXN0IGNhcnJpZXM6IGRhdGUgYm91bmRzIGFzIGNhbGVuZGFyXG4gIC8vIGRheXMsIHNlbGVjdCB2YWx1ZXMgd2hlbiBhbnkgYXJlIHBpY2tlZCAoZWxzZSB0aGUgdmFsdWVzIGxlZnQgb3V0KSxcbiAgLy8ga2V5d29yZCB0ZXh0IHRyaW1tZWQsIGEgbnVtYmVyIHJhbmdlJ3MgZW5kcy4gTnVsbCB3aGVuIGFsbCBvZiB0aGVtIGFyZVxuICAvLyBlbXB0eS4gQSBkYXRlIHJhbmdlIGFsc28gbmFtZXMgdGhlIHJlbGF0aXZlIHJhbmdlIGl0IHN0aWxsIGlzXG4gIC8vIChfbGl2ZVByZXNldCksIHNvIHRoZSBzZXJ2ZXIga25vd3Mgd2hpY2ggcGVyaW9kIHRoZSBkYXlzIGNvdmVyO1xuICAvLyB0aGUgZGF5cyBzdGF5IHRoZSB3aW5kb3cgZWl0aGVyIHdheS4gQ29tcG9uZW50IGRhdGEsIHRoZSByZXBvcnQgYW5kIHBhZ2VcbiAgLy8gZXhwb3J0cyBhbmQgdGhlIGNoYXQncyB2aWV3ZXIgZmlsdGVycyBhbGwgcmVhZCB0aGVpciBmaWVsZHMgaGVyZSwgc28gYWxsXG4gIC8vIHRocmVlIGNhcnJ5IGl0LlxuICBwcml2YXRlIF9yZXNvbHZlZEZpZWxkcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gPSB7fTtcbiAgICBjb25zdCBwcmVzZXQgPSB0aGlzLl9saXZlUHJlc2V0KHZhbHVlKTtcblxuICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgZmllbGRzLnN0YXJ0ID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmVuZCkge1xuICAgICAgZmllbGRzLmVuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpO1xuICAgIH1cbiAgICBpZiAocHJlc2V0KSB7XG4gICAgICBmaWVsZHMucHJlc2V0ID0gcHJlc2V0O1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIGZpZWxkcy52YWx1ZXMgPSB2YWx1ZS52YWx1ZXM7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICBmaWVsZHMudmFsdWUgPSB2YWx1ZS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzb2x2ZUV4Y2x1ZGVBbmRSYW5nZSh2YWx1ZSwgZmllbGRzKTtcblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgfHwgZmllbGRzLmV4Y2x1ZGVWYWx1ZXMgfHwgZmllbGRzLm1pbiAhPT0gdW5kZWZpbmVkIHx8IGZpZWxkcy5tYXggIT09IHVuZGVmaW5lZFxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGRhdGUgdmFsdWUgc3RpbGwgaXM6IHRoZSBwcmVzZXQgbmFtZSBpdCBjYXJyaWVzLFxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gQVxuICAvLyB2YWx1ZSB3aG9zZSBkYXlzIHRoZSB2aWV3ZXIgY2hhbmdlZCwgb3Igb25lIHNlZWRlZCBiZWZvcmUgbWlkbmlnaHQgdGhhdFxuICAvLyBpcyBub3cgYSBkYXkgYmVoaW5kLCBuYW1lcyBub25lLCBhbmQgdGhlIHNlcnZlciByZWFkcyBpdHMgZGF5cyBhbG9uZS5cbiAgcHJpdmF0ZSBfbGl2ZVByZXNldCh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlLnByZXNldCB8fCAhaXNSZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpO1xuXG4gICAgcmV0dXJuIHJhbmdlICYmIHNhbWVEYXlzKHZhbHVlLCByYW5nZSkgPyB2YWx1ZS5wcmVzZXQgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyb3BzIHRoZSBzZWFyY2ggb2YgZXZlcnkgbGlzdCB0aGF0IG5vIGxvbmdlciBzaG93cyBhIHNlYXJjaCBib3g6IG9uZVxuICAvLyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMsIG9yIG9uZSB3aG9zZSBoZWFkZXIgbm93IGhhcyBhIGtleXdvcmQgZ3JvdXAuXG4gIHByaXZhdGUgX2Ryb3BVbnNlYXJjaGFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdFNlYXJjaGVzLmZvckVhY2goKHNlYXJjaCwgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk7XG5cbiAgICAgIGlmICghY29tcG9uZW50IHx8ICF0aGlzLmxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudCkpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBEcm9wcyBzdGF0ZSBrZXB0IGZvciBncm91cHMsIGxpc3RzIGFuZCBmaWx0ZXJzIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcy5cbiAgLy8gQSBsaXN0IHNvcnQgYWxzbyBnb2VzIHdoZW4gaXRzIGNvbHVtbiBkb2VzOiB0aGUgYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWVcbiAgLy8gaXQsIGFuZCB0aGUgcmVjcmVhdGVkIGxpc3Qgd291bGQgc2VuZCBhIGNvbHVtbiB0aGUgcXVlcnkgZG9lcyBub3Qga25vdy5cbiAgLy8gQSBsaXN0IHNlYXJjaCBnb2VzIHdpdGggaXRzIGxpc3QgKG9yIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXIgYVxuICAvLyBsaXN0KSwgYW5kIHdoZW4gdGhlIGxpc3QgZ2FpbnMgYSBrZXl3b3JkIGdyb3VwIGFuZCBzbyBsb3NlcyBpdHMgYm94LlxuICAvLyBIaWRkZW4gY29sdW1ucyBrZWVwIG9ubHkgdGhlIG5hbWVzIHRoZWlyIGxpc3Qgc3RpbGwgaGFzIGFzIGNvbHVtbnMgKHRoZVxuICAvLyBhZ2VudCBjYW4gcmVtb3ZlIG9yIHJlbmFtZSBvbmUsIG9yIHR1cm4gdGhlIGxpc3QgaW50byBhIGNyb3NzLXRhYiksIGFuZCBnb1xuICAvLyB3aGVuIHdoYXQgaXMgbGVmdCB3b3VsZCBoaWRlIGV2ZXJ5IGNvbHVtbi5cbiAgcHJpdmF0ZSBfcHJ1bmUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGdyb3VwSWQgb2YgWy4uLnRoaXMuX3ZhbHVlcy5rZXlzKCksIC4uLnRoaXMuX2NsZWFyZWRdKSB7XG4gICAgICBpZiAoIXRoaXMuX2dyb3Vwcy5oYXMoZ3JvdXBJZCkpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdFNvcnRzLmZvckVhY2goKHNvcnQsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5fc29ydGFibGVDb2x1bW5zKGNvbXBvbmVudCkuaW5jbHVkZXMoc29ydC5jb2x1bW4pKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVmFsdWVzIGluY2x1ZGVkOiBvbmUgaXMgbmV2ZXIgZHJhd24sIGJ1dCBpdHMgZmlsdGVycyBhcmUgdGhlIHJlcG9ydCdzXG4gICAgLy8gbGlrZSBhbnkgb3RoZXIgY29tcG9uZW50J3MsIGFuZCBzbyBhcmUgdGhlaXIgc2Vzc2lvbiB0b2dnbGVzLlxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQocmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdENvbXBvbmVudHMocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgcmV0dXJuIHJlcG9ydENvbXBvbmVudHMocmVwb3J0KVxuICAgICAgLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnKTtcbiAgfVxuXG4gIC8vIFRoZSBjb2x1bW5zIGEgbGlzdCBjYW4gYmUgc29ydGVkIGJ5OiBldmVyeSBhdXRob3JlZCBjb2x1bW4sIG9yIGFcbiAgLy8gY3Jvc3MtdGFiJ3Mgcm93IGNvbHVtbiBvbmx5IChpdHMgcGl2b3QgY29sdW1ucyBjb21lIGFuZCBnbyB3aXRoIHRoZSBkYXRhKS5cbiAgcHJpdmF0ZSBfc29ydGFibGVDb2x1bW5zKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWc7XG5cbiAgICBpZiAoY29uZmlnPy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICAgIHJldHVybiBjb25maWcucm93Qnk/LmNvbHVtbiA/IFtjb25maWcucm93QnkuY29sdW1uXSA6IFtdO1xuICAgIH1cblxuICAgIHJldHVybiAoY29uZmlnPy5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmNvbHVtbik7XG4gIH1cblxuICAvLyBBIGdyb3VwJ3MgYXV0aG9yZWQgZGVmYXVsdCwgbWFwcGVkIHRvIGEgc2Vzc2lvbiB2YWx1ZSBieSB0eXBlLiBSZWxhdGl2ZVxuICAvLyBkYXRlIHByZXNldHMgcmVzb2x2ZSBhZ2FpbnN0IFwibm93XCIgZWFjaCB0aW1lIHRoZSByZXBvcnQgb3BlbnMsIHNvIGEgc2F2ZWRcbiAgLy8gXCJsYXN0IDEyIG1vbnRoc1wiIHN0YXlzIHJlbGF0aXZlIGFuZCBjYXJyaWVzIGl0cyBwcmVzZXQgbmFtZTsgYSBmaXhlZFxuICAvLyByYW5nZSwgc2VsZWN0IHZhbHVlcyBhbmQga2V5d29yZCB0ZXh0IHNlZWQgdmVyYmF0aW0uXG4gIHByaXZhdGUgX2RlZmF1bHRWYWx1ZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gICAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuICAgIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnJlbGF0aXZlKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuX3JlbGF0aXZlUmFuZ2UoZ3JvdXBEZWZhdWx0LnJlbGF0aXZlKTtcblxuICAgICAgcmV0dXJuIHJhbmdlID8geyBzdGFydDogcmFuZ2Uuc3RhcnQsIGVuZDogcmFuZ2UuZW5kLCBwcmVzZXQ6IGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSB9IDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnN0YXJ0IHx8IGdyb3VwRGVmYXVsdC5lbmQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBncm91cERlZmF1bHQuc3RhcnQgPz8gbnVsbCxcbiAgICAgICAgZW5kOiBncm91cERlZmF1bHQuZW5kID8/IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlczogZ3JvdXBEZWZhdWx0LnZhbHVlcyB9O1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQudmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBncm91cERlZmF1bHQudmFsdWUgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXhjbHVkZU9yUmFuZ2VEZWZhdWx0KGdyb3VwRGVmYXVsdCk7XG4gIH1cblxuICAvLyBBIHJlbGF0aXZlIHByZXNldCBhcyBhIGNhbGVuZGFyLWRheSByYW5nZS4gXCJUb2RheVwiIGlzIHRoZSBkYXkgaW4gdGhlXG4gIC8vIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lLCBub3QgdGhlIGJyb3dzZXIncywgc28gZXZlcnkgdmlld2VyIHNlZWRzIHRoZSBzYW1lXG4gIC8vIHJhbmdlLiBUaGUgc2VydmVyIHR3aW4gaXMgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW0gKGZyYW1ld29yay9SZXBvcnQvRW51bSksXG4gIC8vIGFuZCBSZXBvcnRSZWxhdGl2ZVJhbmdlRW51bVRlc3QgcGlucyB0aGUgdGFibGUgYm90aCBzaWRlcyBtdXN0IHByb2R1Y2UuXG4gIHByaXZhdGUgX3JlbGF0aXZlUmFuZ2UocmVsYXRpdmU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgbm93ID0gZ2V0Wm9uZWROb3codGhpcy50aW1lem9uZSgpKTtcblxuICAgIHN3aXRjaCAocmVsYXRpdmUpIHtcbiAgICAgIC8vIEEgY2FsZW5kYXIgd2VlaywgTW9uZGF5IHRvIFN1bmRheSAoUkVQT1JUX1dFRUtfU1RBUlRTX09OLCB0aGUgc2FtZSB3ZWVrXG4gICAgICAvLyB0aGUgc2VydmVyJ3Mgd2Vla2x5IGJ1Y2tldHMgdXNlKSwgaW4gd2hvbGUgZGF5cyDigJQgbm90IHRoZSByb2xsaW5nXG4gICAgICAvLyBzZXZlbiBkYXlzIGBsYXN0N0RheXNgIGdpdmVzLCB3aGljaCBuZXZlciBsaW5lcyB1cCB3aXRoIHRoZSB3ZWVrIGFcbiAgICAgIC8vIHBhcnRuZXIgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBgbGFzdFdlZWtgIGlzIHRoZSBvbmUgYSB3ZWVrbHkgcmVwb3J0XG4gICAgICAvLyB3YW50czogaXQgZW5kcyBvbiB0aGUgcHJldmlvdXMgd2VlaydzIFN1bmRheSByYXRoZXIgdGhhbiBhdCBgbm93YCxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdlZWsgaXQgbmFtZXMgaGFzIGNsb3NlZC4gYHRoaXNXZWVrYCBmb2xsb3dzIGV2ZXJ5IG90aGVyXG4gICAgICAvLyBwcmVzZXQgaGVyZSBhbmQgcnVucyB1cCB0byBub3csIHNvIGl0IGlzIGRlbGliZXJhdGVseSBhIHBhcnQtZmluaXNoZWRcbiAgICAgIC8vIHdlZWsgKG9uIGEgU3VuZGF5IGl0IGlzIHRoZSB3aG9sZSBNb25kYXktdG8tU3VuZGF5IHdlZWspLlxuICAgICAgY2FzZSAndGhpc1dlZWsnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZldlZWsobm93LCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdFdlZWsnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gc3ViV2Vla3Mobm93LCAxKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgICBlbmQ6IGVuZE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3Q3RGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgNyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MzBEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCAzMCksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0M01vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAzKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3Q2TW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDYpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDEyTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDEyKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNNb250aCc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNRdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZRdWFydGVyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzWWVhcic6XG4gICAgICBjYXNlICd5ZWFyVG9EYXRlJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZZZWFyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVyeSBncm91cCBpbiBpdHMgc3RvcmVkIHNoYXBlOiBudWxsIHdoZW4gaXQgaG9sZHMgbm90aGluZywgYSBkZWZhdWx0XG4gIC8vIHRoZSB2aWV3ZXIgY2xlYXJlZCBpbmNsdWRlZC5cbiAgcHJpdmF0ZSBfc25hcHNob3RHcm91cHMoKTogUmVjb3JkPG51bWJlciwgRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwczogUmVjb3JkPG51bWJlciwgRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbD4gPSB7fTtcblxuICAgIHRoaXMuX2dyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXBzW2dyb3VwLmlkXSA9IHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdyb3VwcztcbiAgfVxuXG4gIC8vIEVhY2ggdGlsZSdzIHN0YXRlIHdoZXJlIGl0IGRpZmZlcnMgZnJvbSB0aGUgYXV0aG9yZWQgdGlsZS4gQSBsaXN0IHNvcnRcbiAgLy8gdGhhdCBpcyB0aGUgbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHRlcm0gaXMgaXRzIGRlZmF1bHQsIG5vdCBhIGNob2ljZS5cbiAgcHJpdmF0ZSBfc25hcHNob3RUaWxlcygpOiBSZWNvcmQ8bnVtYmVyLCBSZXBvcnRUaWxlU3RhdGU+IHtcbiAgICBjb25zdCB0aWxlczogUmVjb3JkPG51bWJlciwgUmVwb3J0VGlsZVN0YXRlPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5fdGlsZXMoKSkge1xuICAgICAgY29uc3QgdGlsZTogUmVwb3J0VGlsZVN0YXRlID0ge307XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBkcmlsbCA9IHRoaXMuZHJpbGwoY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgICAgdGlsZS5zb3J0ID0geyAuLi5zb3J0IH07XG4gICAgICB9XG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIHRpbGUuc2VhcmNoID0gc2VhcmNoO1xuICAgICAgfVxuICAgICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgICAgdGlsZS5oaWRkZW4gPSBbLi4uaGlkZGVuXTtcbiAgICAgIH1cbiAgICAgIGlmIChkcmlsbC5sZW5ndGgpIHtcbiAgICAgICAgdGlsZS5kcmlsbCA9IGRyaWxsLm1hcCgoc3RlcCkgPT4gKHsgLi4uc3RlcCB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aWxlKS5sZW5ndGgpIHtcbiAgICAgICAgdGlsZXNbY29tcG9uZW50LmlkXSA9IHRpbGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGVzO1xuICB9XG5cbiAgLy8gQSBncm91cCBiYWNrIGF0IGl0cyBhdXRob3JlZCBkZWZhdWx0LlxuICBwcml2YXRlIF9zZWVkQXV0aG9yZWQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuXG4gICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXAuaWQpO1xuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZXJ5IHRpbGUgYmFjayBhdCBpdHMgYXV0aG9yZWQgc3RhdGUuXG4gIHByaXZhdGUgX2NsZWFyVGlsZXMoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdFNvcnRzLmNsZWFyKCk7XG4gICAgdGhpcy5fbGlzdFNlYXJjaGVzLmNsZWFyKCk7XG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXcgTWFwKCkpO1xuICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcCgpKTtcbiAgICB0aGlzLl9ncmlkTGF5b3V0cy5zZXQobmV3IE1hcCgpKTtcbiAgfVxuXG4gIC8vIE9uZSBjaGFydCdzIGRyaWxsIHBhdGg7IGFuIGVtcHR5IHBhdGggaXMgdGhlIGNoYXJ0J3MgdG9wLlxuICBwcml2YXRlIF9zZXREcmlsbFBhdGgoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLl9kcmlsbHMoKSk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyaWxscy5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBBZnRlciByZXNldFRvRGVmYXVsdHMoKTogZXZlcnkgYmFyIGFuZCB0aWxlIHJlcGFpbnRzLCBhbmQgdGhlXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cyByZWZldGNoIHdoZW4gdGhlIGdyYWluIG1vdmVkLlxuICBwcml2YXRlIF9ub3RpZnlSZXNldChmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGVWZXJzaW9uLnVwZGF0ZSgodmVyc2lvbikgPT4gdmVyc2lvbiArIDEpO1xuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG5cbiAgICBpZiAoZnJlcXVlbmN5ICE9PSB0aGlzLl9mcmVxdWVuY3kpIHtcbiAgICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlcyBvZiB0aGUgcmVwb3J0IGluaXQoKSBsYXN0IHJlYWQuXG4gIHByaXZhdGUgX3RpbGVzKCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9yZXBvcnQoKTtcblxuICAgIHJldHVybiByZXBvcnRcbiAgICAgID8gcmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpLmZpbHRlcihpc1RpbGUpXG4gICAgICA6IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDaGFydChjb21wb25lbnRJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbGVzKClcbiAgICAgIC5zb21lKChjb21wb25lbnQpID0+IGNvbXBvbmVudC5pZCA9PT0gY29tcG9uZW50SWQgJiYgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcpO1xuICB9XG5cbiAgLy8gRHJvcHMgZWFjaCB0YWJsZSBsYXlvdXQgd2hvc2UgdGlsZSBpcyBnb25lLCBpcyBubyB0YWJsZSBhbnkgbW9yZSwgb3IgaXNcbiAgLy8gYXV0aG9yZWQgb3RoZXJ3aXNlIHRoYW4gd2hlbiB0aGUgdmlld2VyIGNoYW5nZWQgaXQuXG4gIHByaXZhdGUgX3BydW5lR3JpZExheW91dHMoKTogdm9pZCB7XG4gICAgY29uc3QgZ3JpZHMgPSBuZXcgTWFwKHRoaXMuX3RpbGVzKClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdncmlkJylcbiAgICAgIC5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwKFsuLi50aGlzLl9ncmlkTGF5b3V0cygpXVxuICAgICAgLmZpbHRlcigoW2NvbXBvbmVudElkLCBzZXNzaW9uXSkgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBncmlkcy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICAgIHJldHVybiAhIWNvbXBvbmVudCAmJiBzZXNzaW9uLmJhc2UgPT09IGdyaWRMYXlvdXRLZXkoYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCkpO1xuICAgICAgfSkpO1xuXG4gICAgaWYgKGtlcHQuc2l6ZSAhPT0gdGhpcy5fZ3JpZExheW91dHMoKS5zaXplKSB7XG4gICAgICB0aGlzLl9ncmlkTGF5b3V0cy5zZXQoa2VwdCk7XG4gICAgfVxuICB9XG5cbiAgLy8gS2VlcHMgdGhlIHBhZ2UsIGRyaWxsIGFuZCB0YWJsZSBzdGF0ZSB0byB3aGF0IHRoZSByZXBvcnQgKHJlKWxvYWRlZCBieVxuICAvLyBpbml0KCkgc3RpbGwgaGFzOiBkcmlsbCBwYXRocyBvbiBjaGFydHMgaXQgc3RpbGwgaGFzLCB0aGUgcGFnZSB3aGlsZSBpdFxuICAvLyBoYXMgaXQsIGFuZCBlYWNoIHRhYmxlJ3MgbGF5b3V0IHdoaWxlIGl0IGlzIHN0aWxsIGEgdGFibGUgYXV0aG9yZWQgYXMgaXRcbiAgLy8gd2FzIHdoZW4gdGhlIHZpZXdlciBjaGFuZ2VkIGl0IChhIG5ldyBhdXRob3JlZCBsYXlvdXQsIGFuIGVkaXQgb3IgdGhlXG4gIC8vIGFnZW50J3MsIGlzIHNob3duIGFzIGF1dGhvcmVkKS4gT24gYW5vdGhlciByZXBvcnQgaXQgc3RhcnRzIGFnYWluOiBtYXRjaFxuICAvLyAnYWxsJywgbm8gZHJpbGwsIGV2ZXJ5IHRhYmxlIGFzIGF1dGhvcmVkIGFuZCBub3RoaW5nIHRlbXBvcmFyeS5cbiAgcHJpdmF0ZSBfcHJ1bmVQYWdlU3RhdGUocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVwb3J0KCk/LmlkICE9PSByZXBvcnQuaWQpIHtcbiAgICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICAgICAgdGhpcy5fZ3JpZExheW91dHMuc2V0KG5ldyBNYXAoKSk7XG4gICAgICB0aGlzLl90ZW1wb3Jhcnkuc2V0KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0LnNldChyZXBvcnQpO1xuICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcChbLi4udGhpcy5fZHJpbGxzKCldXG4gICAgICAuZmlsdGVyKChbY29tcG9uZW50SWRdKSA9PiB0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSkpKTtcbiAgICB0aGlzLl9wcnVuZUdyaWRMYXlvdXRzKCk7XG5cbiAgICBpZiAodGhpcy5fcGFnZUlkKCkgJiYgIShyZXBvcnQucGFnZXMgPz8gW10pLnNvbWUoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IHRoaXMuX3BhZ2VJZCgpKSkge1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHNlbGVjdCdzIHZhbHVlcyB0byBsZWF2ZSBvdXQgKG9ubHkgd2hlbiBpdCBrZWVwcyBub25lKSBhbmQgYSBudW1iZXJcbiAgLy8gcmFuZ2UncyBlbmRzLCBhbiBvcGVuIGVuZCBsZWZ0IG91dCBhbmQgMCBrZXB0LCB3cml0dGVuIG9udG8gYGZpZWxkc2AuXG4gIHByaXZhdGUgX3Jlc29sdmVFeGNsdWRlQW5kUmFuZ2UodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUsIGZpZWxkczogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5leGNsdWRlVmFsdWVzPy5sZW5ndGggJiYgIWZpZWxkcy52YWx1ZXMpIHtcbiAgICAgIGZpZWxkcy5leGNsdWRlVmFsdWVzID0gdmFsdWUuZXhjbHVkZVZhbHVlcztcbiAgICB9XG5cbiAgICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIodmFsdWUubWluKTtcbiAgICBjb25zdCBtYXggPSBmaW5pdGVOdW1iZXIodmFsdWUubWF4KTtcblxuICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmllbGRzLm1pbiA9IG1pbjtcbiAgICB9XG4gICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZHMubWF4ID0gbWF4O1xuICAgIH1cbiAgfVxuXG4gIC8vIEFuIGF1dGhvcmVkIGRlZmF1bHQgdGhhdCBsZWF2ZXMgc2VsZWN0IHZhbHVlcyBvdXQsIG9yIGEgbnVtYmVyIHJhbmdlJ3NcbiAgLy8gZW5kcyAoMCBrZXB0KSwgYXMgYSBzZXNzaW9uIHZhbHVlOyBudWxsIHdoZW4gaXQgaG9sZHMgbmVpdGhlci5cbiAgcHJpdmF0ZSBfZXhjbHVkZU9yUmFuZ2VEZWZhdWx0KGdyb3VwRGVmYXVsdDogRmlsdGVyR3JvdXBEZWZhdWx0KTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGlmIChncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyBleGNsdWRlVmFsdWVzOiBncm91cERlZmF1bHQuZXhjbHVkZVZhbHVlcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZpbml0ZU51bWJlcihncm91cERlZmF1bHQubWluKTtcbiAgICBjb25zdCBtYXggPSBmaW5pdGVOdW1iZXIoZ3JvdXBEZWZhdWx0Lm1heCk7XG5cbiAgICBpZiAobWluID09PSB1bmRlZmluZWQgJiYgbWF4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obWluICE9PSB1bmRlZmluZWQgPyB7IG1pbiB9IDoge30pLFxuICAgICAgLi4uKG1heCAhPT0gdW5kZWZpbmVkID8geyBtYXggfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ291bnRzIGEgcmVzZXQgZm9yIGVhY2ggbGlzdCB3aG9zZSBzb3J0IGlzIG5vdCB0aGUgb25lIGl0IGhhZCAoYGJlZm9yZWAsXG4gIC8vIHRoZSBzb3J0cyBieSBsaXN0IGJlZm9yZSB0aGUgcmVzZXQpLiBBIHNvcnQgYSBsaXN0IGxvc3QgYW5kIG9uZSBpdFxuICAvLyBnYWluZWQgYm90aCBjb3VudDsgdGhlIGF1dGhvcmVkIHNvcnQgaXMgbm8gZW50cnkgZWl0aGVyIHNpZGUuXG4gIHByaXZhdGUgX2NvdW50U29ydFJlc2V0cyhiZWZvcmU6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0U29ydD4pOiB2b2lkIHtcbiAgICBjb25zdCBtb3ZlZCA9IFsuLi5uZXcgU2V0KFsuLi5iZWZvcmUua2V5cygpLCAuLi50aGlzLl9saXN0U29ydHMua2V5cygpXSldXG4gICAgICAuZmlsdGVyKChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICBjb25zdCB3YXMgPSBiZWZvcmUuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgICAgY29uc3Qgbm93ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcblxuICAgICAgICByZXR1cm4gd2FzID8gIXNhbWVTb3J0KHdhcywgbm93KSA6IG5vdyAhPT0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgaWYgKCFtb3ZlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RTb3J0UmVzZXRzKCkpO1xuICAgIG1vdmVkLmZvckVhY2goKGNvbXBvbmVudElkKSA9PiBjb3VudHMuc2V0KGNvbXBvbmVudElkLCAoY291bnRzLmdldChjb21wb25lbnRJZCkgPz8gMCkgKyAxKSk7XG4gICAgdGhpcy5fbGlzdFNvcnRSZXNldHMuc2V0KGNvdW50cyk7XG4gIH1cbn1cbiJdfQ==
1171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUl0RCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEdBQzdCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEdBQ2pGLE1BQU0sV0FBVyxDQUFDO0FBb0JuQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFB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QUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO3dHQWp1Q1Usd0JBQXdCOzRHQUF4Qix3QkFBd0I7OzRGQUF4Qix3QkFBd0I7a0JBRHBDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgR3JpZENsZWFyZWRGaWx0ZXIsIEdyaWRFeHBhbnNpb24sIEdyaWRMYXlvdXQgfSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBmaWx0ZXIgYXMgcnhGaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBzY2FuIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnREcmlsbFN0ZXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1kcmlsbC1zdGVwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJNYXRjaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmltcG9ydCB7IFJlcG9ydEdyaWRTZXNzaW9uTGF5b3V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1zZXNzaW9uLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGVtcG9yYXJ5U3RhdGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC10ZW1wb3Jhcnktc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFRpbGVTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXRpbGUtc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFN0YXRlU25hcHNob3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1zdGF0ZS1zbmFwc2hvdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydFJlbGF0aXZlUmFuZ2UsXG4gIFJlcG9ydFNvcnQsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFNvcnRUZXJtcyB9IGZyb20gJy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZywgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgZ3JvdXBWYWx1ZVNpZ25hdHVyZSB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHtcbiAgR1JJRF9HUkFOVUxBUklUSUVTLCBhdXRob3JlZEdyaWRMYXlvdXQsIGdyYWluZWRHcmlkTGF5b3V0LCBncmlkTGF5b3V0S2V5LCByZWJhc2VkR3JpZExheW91dCxcbn0gZnJvbSAnLi4vcmVwb3J0LWdyaWQtbGF5b3V0JztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7XG4gIGNsZWFuRHJpbGxQYXRoLCBmaW5pdGVOdW1iZXIsIGlzUmVsYXRpdmVSYW5nZSwgc2FtZURyaWxsUGF0aCwgc2FtZVN0b3JlZEdyb3VwVmFsdWUsXG4gIHN0YXRlRGlmZmVycywgdG9TdG9yZWRHcm91cFZhbHVlLFxufSBmcm9tICcuLi9yZXBvcnQtc3RhdGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YVN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IHRpbGVEYXRhU3RhdGUgfSBmcm9tICcuLi90aWxlLWRhdGEtc3RhdGUnO1xuaW1wb3J0IHsgcmVwb3J0Q29tcG9uZW50cyB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGZpbHRlci1ncm91cCBkZWZhdWx0cyBhcmUgdGhlIHNhbWUuIENvbXBhcmVkIG9uIHRoZSBmaWVsZHMgYVxuLy8gZGVmYXVsdCBjYW4gYWN0dWFsbHkgY2FycnksIHNvIGtleSBvcmRlciBpbiB0aGUgcGF5bG9hZCBjYW4ndCByZWFkIGFzIGEgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZWZhdWx0KFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0XG4gICAgJiYgYS5lbmQgPT09IGIuZW5kXG4gICAgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZVxuICAgICYmIGEucmVsYXRpdmUgPT09IGIucmVsYXRpdmVcbiAgICAmJiBzYW1lTGlzdChhLnZhbHVlcywgYi52YWx1ZXMpXG4gICAgJiYgc2FtZUxpc3QoYS5leGNsdWRlVmFsdWVzLCBiLmV4Y2x1ZGVWYWx1ZXMpXG4gICAgJiYgYS5taW4gPT09IGIubWluXG4gICAgJiYgYS5tYXggPT09IGIubWF4O1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBsaXN0cyBob2xkIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVMaXN0KGE6IHVua25vd25bXSB8IHVuZGVmaW5lZCwgYjogdW5rbm93bltdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAoYSA/PyBbXSkubGVuZ3RoID09PSAoYiA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEgPz8gW10pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSAoYiA/PyBbXSlbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0IHNvcnRzIG9yZGVyIHRoZSByb3dzIHRoZSBzYW1lIHdheS4gTm8gZGlyZWN0aW9uIHJlYWRzIGFzXG4vLyBhc2NlbmRpbmcsIHRoZSB3YXkgdGhlIGxpc3QgYXBwbGllcyBpdC5cbmZ1bmN0aW9uIHNhbWVTb3J0KGE6IFJlcG9ydFNvcnQsIGI6IFJlcG9ydFNvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWJcbiAgICAmJiBhLmNvbHVtbiA9PT0gYi5jb2x1bW5cbiAgICAmJiAoYS5kaXJlY3Rpb24gPz8gJ2FzYycpID09PSAoYi5kaXJlY3Rpb24gPz8gJ2FzYycpO1xufVxuXG5cbi8vIFdoZXRoZXIgYSB2YWx1ZSByZWFkIG9mZiBhIGZpbHRlciBiYXIgaXMgdGhlIHZhbHVlIGFscmVhZHkgc3RvcmVkIGZvciBpdHNcbi8vIGdyb3VwOiB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLCB0aGUgc2FtZSBzZWxlY3QgdmFsdWVzIGtlcHQgb3IgbGVmdCBvdXQgaW5cbi8vIHRoZSBzYW1lIG9yZGVyLCB0aGUgc2FtZSB0cmltbWVkIHRleHQgYW5kIHRoZSBzYW1lIG51bWJlciByYW5nZSBlbmRzLiBBXG4vLyBiYXIgcmUtcmVhZHMgZXZlcnkgZ3JvdXAgaXQgc2hvd3Mgb24gYW55IGNoYW5nZSwgc28gdGhpcyBpcyB3aGF0IHRlbGxzIHRoZVxuLy8gZ3JvdXAgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIG9uZXMgdGhhdCBkaWQgbm90LlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVGaWx0ZXJWYWx1ZShcbiAgYTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGI6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBncm91cFZhbHVlU2lnbmF0dXJlKGEpID09PSBncm91cFZhbHVlU2lnbmF0dXJlKGIpO1xufVxuXG5cbi8vIFRoZSBncm91cHMgYSBiYXIgcmUtcmVhZCB0aGF0IGl0IG5vdyBzaG93cyB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgb25lXG4vLyBpdCBsYXN0IHJlcG9ydGVkLCByZWNvcmRpbmcgZWFjaCBuZXcgdmFsdWUgaW4gYGxhc3RSZXBvcnRlZGAuIEEgYmFyIGlzXG4vLyBjb21wYXJlZCB3aXRoIGl0c2VsZiwgbmV2ZXIgd2l0aCB0aGUgc3RvcmVkIHZhbHVlOiBhIGdyb3VwIHNob3duIGluIHR3byBiYXJzXG4vLyAobGV2ZWwgJ2JvdGgnKSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgb3RoZXIgb25lLCBhbmQgdGhpcyBiYXIgaXMgbm90XG4vLyByZXBhaW50ZWQsIHNvIGl0cyBzdGFsZSB2YWx1ZSBtdXN0IG5vdCBiZSBzZXQgYmFjayB3aGVuIHRoZSB2aWV3ZXIgY2hhbmdlc1xuLy8gYW5vdGhlciBvZiBpdHMgaXRlbXMgKHRoZSBsaXN0IHNlYXJjaCBib3gsIHNheSkuXG5leHBvcnQgZnVuY3Rpb24gbW92ZWRHcm91cFZhbHVlcyhcbiAgbGFzdFJlcG9ydGVkOiBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4sXG4gIHJlcG9ydGVkOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIHJlcG9ydGVkLmZpbHRlcigoeyBncm91cElkLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHNhbWVGaWx0ZXJWYWx1ZShsYXN0UmVwb3J0ZWQuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsYXN0UmVwb3J0ZWQuc2V0KGdyb3VwSWQsIHZhbHVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuXG4vLyBBIGxpc3QncyBzZWFyY2ggdGV4dCBhcyB0aGUgc2VydmVyIGFwcGxpZXMgaXQ6IHRyaW1tZWQsIHRoZW4gY3V0IHRvXG4vLyBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzLCBhcyB0aGUgc2VydmVyIGNvdW50cyB0aGVtKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0U2VhcmNoVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLnRleHQudHJpbSgpXS5zbGljZSgwLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIKS5qb2luKCcnKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0cyBvZiBjb2x1bW4gbmFtZXMgYXJlIHRoZSBzYW1lIG5hbWVzIGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gc2FtZU5hbWVzKGE6IHJlYWRvbmx5IHN0cmluZ1tdLCBiOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKG5hbWUsIGluZGV4KSA9PiBuYW1lID09PSBiW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gaGlkZGVuLWNvbHVtbiBtYXBzIGhpZGUgdGhlIHNhbWUgY29sdW1ucyBvbiB0aGUgc2FtZSBsaXN0cy5cbmZ1bmN0aW9uIHNhbWVIaWRkZW4oXG4gIGE6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuICBiOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5zaXplID09PSBiLnNpemVcbiAgICAmJiBbLi4uYV0uZXZlcnkoKFtjb21wb25lbnRJZCwgbmFtZXNdKSA9PiBzYW1lTmFtZXMobmFtZXMsIGIuZ2V0KGNvbXBvbmVudElkKSA/PyBbXSkpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGRhdGUtcmFuZ2UgdmFsdWVzIGNvdmVyIHRoZSBzYW1lIGNhbGVuZGFyIGRheXMuXG5mdW5jdGlvbiBzYW1lRGF5cyhhOiBGaWx0ZXJHcm91cFZhbHVlLCBiOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlQm91bmRTdHJpbmcoYS5zdGFydCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLnN0YXJ0KVxuICAgICYmIGRhdGVCb3VuZFN0cmluZyhhLmVuZCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLmVuZCk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgKGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gICAgZ3JvdXBEZWZhdWx0Lm1pbiA/PyAnJyxcbiAgICBncm91cERlZmF1bHQubWF4ID8/ICcnLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBUaGUgdGVtcG9yYXJ5IGxheWVyIHdpdGggbm90aGluZyBwaWNrZWQuXG5mdW5jdGlvbiBlbXB0eVRlbXBvcmFyeVN0YXRlKCk6IFJlcG9ydFRlbXBvcmFyeVN0YXRlIHtcbiAgcmV0dXJuIHsgY3Jvc3NGaWx0ZXJzOiBbXSwgZGV0YWlsOiBudWxsIH07XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIHRoZSBvbmUgcGxhY2UgdGhlIHZpZXdlcidzIHN0YXRlIGxpdmVzIHdoaWxlIHRoZSByZXBvcnQgaXMgb3BlbjogdGhlXG4vLyBncm91cCB2YWx1ZXMsIHRoZSBncm91cC1ieSBncmFpbiwgdGhlIG1hdGNoLCBsaXN0IHNvcnRzLCBzZWFyY2hlcyBhbmQgaGlkZGVuXG4vLyBjb2x1bW5zLCB0aGUgcGFnZSwgZWFjaCBjaGFydCdzIGRyaWxsIHBhdGggYW5kIGVhY2ggdGFibGUncyBsYXlvdXQuIE5vbmUgb2Zcbi8vIGl0IGlzIGV2ZXIgd3JpdHRlbiB0byB0aGUgYnJvd3NlciBVUkwuIEl0IG91dGxpdmVzIGEgcGFnZSBzd2l0Y2ggKHRoZSBjYW52YXNcbi8vIGNoYW5nZXMgdGhlIHBhZ2UsIG5vdCB0aGlzIHNlcnZpY2UpIGFuZCBnb2VzIHdpdGggdGhlIHJlcG9ydCB2aWV3OiBhIHJlbG9hZFxuLy8gc3RhcnRzIGEgbmV3IHNlcnZpY2UsIHdoaWNoIG9wZW5zIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cy5cbi8vIGNoYW5nZXMoKSBmaXJlcyBvbiBldmVyeSBjaGFuZ2Ugb2YgaXQuXG4vL1xuLy8gVGhlIGR1cmFibGUgcGFydCByZWFkcyBhcyBvbmUgZG9jdW1lbnQ6IHNuYXBzaG90KCkgd3JpdGVzIGl0LCBhbmRcbi8vIGRpZmZlcnNGcm9tRGVmYXVsdHMgc2F5cyB3aGV0aGVyIHRoZSBzY3JlZW4gc3RpbGwgc2hvd3MgdGhlIHJlcG9ydCdzXG4vLyBhdXRob3JlZCBkZWZhdWx0cyAocmVzZXRUb0RlZmF1bHRzKCkgcHV0cyBpdCBiYWNrIG9uIHRoZW0pLiBUaGUgdGVtcG9yYXJ5XG4vLyBsYXllciAoYSBjcm9zcy1maWx0ZXIsIGFuIG9wZW4gcm93cyBwYW5lbCkgaXMgaXRzIG93biBzZWN0aW9uLCBzbyBhXG4vLyBzbmFwc2hvdCBuZXZlciBjYXJyaWVzIGl0LlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIHNuYXBzaG90OiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbVxuLy8gYSBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCksIGFuZCBlYWNoIHRhYmxlJ3MgbGF5b3V0LFxuLy8gd2hpY2ggZnMtZ3JpZCBzZW5kcyB3aXRoIHRoZSB0YWJsZSdzIG93biByZWFkcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uge1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUpLiBSZWxhdGl2ZSBwcmVzZXRzXG4gIC8vIHJlc29sdmUgYWdhaW5zdCB0b2RheSBpbiBpdCwgYW5kIGRhdGUgY2VsbHMgcmVuZGVyIGluIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignVVRDJyk7XG5cbiAgLy8gSG93IHRoZSBvcGVuIHJlcG9ydCB3cml0ZXMgaXRzIG51bWJlcnMgYW5kIGRhdGVzIChyZXNvbHZlRm9ybWF0Q29udGV4dCk6XG4gIC8vIGl0cyBsb2NhbGUsIGl0cyBjdXJyZW5jeSBhbmQgd2hldGhlciBwZXJjZW50cyBhcnJpdmUgYXMgcmF0aW9zLiBFdmVyeSBLUEksXG4gIC8vIGNoYXJ0LCBkYXRlIGNlbGwgYW5kIGV4cG9ydCByZWFkcyBpdCBoZXJlLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWRcbiAgLy8gb2YgYW4gdW5jaGFuZ2VkIHJlcG9ydCByZS1yZW5kZXJzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gc2lnbmFsPFJlcG9ydEZvcm1hdENvbnRleHQ+KERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubG9jYWxlID09PSBiLmxvY2FsZVxuICAgICAgJiYgYS5jdXJyZW5jeSA9PT0gYi5jdXJyZW5jeVxuICAgICAgJiYgYS5yYXRpb1BlcmNlbnQgPT09IGIucmF0aW9QZXJjZW50LFxuICB9KTtcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGVhY2ggcGxhaW4gbGlzdCAobGlzdEhpZGRlbkNvbHVtbnMpLFxuICAvLyBieSBjb21wb25lbnQgaWQ7IGEgbGlzdCBzaG93aW5nIGV2ZXJ5IGNvbHVtbiBoYXMgbm8gZW50cnkuIEEgc2lnbmFsLCBzbyBhXG4gIC8vIGxpc3QgaGlkZXMgYW5kIHNob3dzIGl0cyBjb2x1bW5zIGluIHBsYWNlOiB0aGUgcm93cyBkbyBub3QgY2hhbmdlLCBzb1xuICAvLyBub3RoaW5nIHJlZmV0Y2hlcy4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkIHRoYXQga2VlcHMgZXZlcnkgY29sdW1uXG4gIC8vIHJlcGFpbnRzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0SGlkZGVuID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+PihuZXcgTWFwKCksIHtcbiAgICBlcXVhbDogc2FtZUhpZGRlbixcbiAgfSk7XG5cbiAgLy8gTW92ZXMgZWFjaCB0aW1lIHJlc2V0VG9EZWZhdWx0cygpIHJlcGxhY2VzIHRoZSB3aG9sZSBkdXJhYmxlIHN0YXRlLiBCYXJzXG4gIC8vIGFuZCB0aWxlcyBrZXkgb24gaXQsIHNvIGEgcmVzZXQgcmVwYWludHMgYWxsIG9mIHRoZW07IHRoZSB0aWxlcyByZWZldGNoXG4gIC8vIGluIHBsYWNlLCBzbyB0aGVpciBkYXRhIHN0YXlzIG9uIHNjcmVlbiB3aGlsZSB0aGV5IHJlbG9hZC5cbiAgcHVibGljIHJlYWRvbmx5IHN0YXRlVmVyc2lvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3N0YXRlVmVyc2lvbigpKTtcblxuICAvLyBCeSBsaXN0IGNvbXBvbmVudCBpZCwgaG93IG1hbnkgcmVzZXRzIG1vdmVkIHRoYXQgbGlzdCdzIHNvcnQuIEZzTGlzdFxuICAvLyByZWFkcyBpdHMgc29ydCBvbmx5IHdoZW4gaXQgaXMgY3JlYXRlZCwgc28gYSBsaXN0IHdob3NlIHNvcnQgYSByZXNldFxuICAvLyBtb3ZlZCBpcyBkcmF3biBhZ2FpbiAoa2V5ZWQgb24gaXRzIGNvdW50KTsgZXZlcnkgb3RoZXIgdGlsZSByZWxvYWRzIGluXG4gIC8vIHBsYWNlLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdFNvcnRSZXNldHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9saXN0U29ydFJlc2V0cygpKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBvciBudWxsIGJlZm9yZSB0aGUgaG9zdCByZXBvcnRzIG9uZSAoc2V0UGFnZSkuXG4gIHB1YmxpYyByZWFkb25seSBwYWdlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcGFnZUlkKCkpO1xuXG4gIC8vIEhvdyB0aGUgZ3JvdXBzIGNvbWJpbmU6ICdhbGwnIGtlZXBzIHRoZSByb3dzIGV2ZXJ5IGdyb3VwIGtlZXBzLCAnYW55J1xuICAvLyB0aGUgcm93cyBhdCBsZWFzdCBvbmUgZWxpZ2libGUgZ3JvdXAga2VlcHMgKHNldE1hdGNoKS5cbiAgcHVibGljIHJlYWRvbmx5IG1hdGNoID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fbWF0Y2goKSk7XG5cbiAgLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGUgb3BlbiByZXBvcnQncyBzZXJ2ZXIgc2VydmVzIChSZXBvcnQudmlld2VyRmVhdHVyZXMpOlxuICAvLyBhIGZpbHRlciBiYXIgb2ZmZXJzIGEgY29udHJvbCBvbmx5IHdoZW4gaXRzIGZlYXR1cmUgaXMgbGlzdGVkLiBFbXB0eVxuICAvLyBiZWZvcmUgYSByZXBvcnQgaXMgb3BlbiBhbmQgZnJvbSBhbiBvbGRlciBzZXJ2ZXIuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ZXJGZWF0dXJlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3JlcG9ydCgpPy52aWV3ZXJGZWF0dXJlcyA/PyBbXSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLCBvciBudWxsIGJlZm9yZSBvbmUgaXMgb3Blbi4gQSB0aWxlIGhlYWRlclxuICAvLyBsaXN0cyBpdHMgc2VsZWN0IG9wdGlvbnMgZnJvbSBpdCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fcmVwb3J0KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIHJlcG9ydCdzIGF1dGhvcmVkIGRlZmF1bHRzXG4gIC8vIChzdGF0ZURpZmZlcnMpOiB3aGF0IHRoZSByZXBvcnQgYmFyJ3MgJ0NsZWFyIGZpbHRlcnMnIHNob3dzIGZvci4gQSBzd2l0Y2hcbiAgLy8gb2YgcGFnZSBkb2VzIG5vdCBjb3VudCwgYW5kIHRoZSB0ZW1wb3Jhcnkgc3RhdGUgbmV2ZXIgZG9lcy5cbiAgLy8gQSB0YWJsZSB0aWxlIGluIGEgbGF5b3V0IG9mIHRoZSB2aWV3ZXIncyBvd24gY291bnRzIHRvbzsgaXQgc3RheXMgb3V0IG9mXG4gIC8vIHRoZSBzbmFwc2hvdCwgc28gbm8gc2F2ZWQgZmlsdGVyIG9yIGxpbmsgY2FycmllcyBpdC5cbiAgcHVibGljIHJlYWRvbmx5IGRpZmZlcnNGcm9tRGVmYXVsdHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5fcmV2aXNpb24oKTtcblxuICAgIHJldHVybiB0aGlzLl9ncmlkTGF5b3V0cygpLnNpemUgPiAwIHx8IHN0YXRlRGlmZmVycyh0aGlzLmF1dGhvcmVkQ29uZmlnKCksIHRoaXMuc25hcHNob3QoKSk7XG4gIH0pO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aGUgdGlsZXMgdGhhdCBmb2xsb3cgaXQgKGZvbGxvd3NHcm91cEJ5KS4gVW5zZXQgPSBlYWNoIG9uZSB1c2VzIGl0c1xuICAvLyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KSwgYnkgY29tcG9uZW50IGlkLiBBIGxpc3Qgd2l0aFxuICAvLyBhbiBlbXB0eSBib3ggaGFzIG5vIGVudHJ5LiBIZWxkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgdGhlIHNvcnRzLCBhbmRcbiAgLy8gYmVjYXVzZSB0aGUgYm94IGxpdmVzIGluIHRoZSBjb21wb25lbnQgaGVhZGVyLCBub3QgaW4gdGhlIGxpc3QuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgbGlzdHMsIGJ5IGNvbXBvbmVudCBpZCwgc28gYSBmaWx0ZXIgdG9nZ2xlIGNhbiB0ZWxsXG4gIC8vIHdoaWNoIG9mIHRoZW0gbG9zZSB0aGVpciBzZWFyY2ggYm94IChsaXN0U2VhcmNoYWJsZSkuXG4gIHByaXZhdGUgX2xpc3RzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydENvbXBvbmVudD4oKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoLiBMaXN0IHNlYXJjaCBhbmQgZWZmZWN0aXZlTG9jYWxlXG4gIC8vIHNoaXAgaW4gdGhlIHNhbWUgZnJhbWV3b3JrIGNoYW5nZSBzZXQsIHNvIGEgc2VydmVyIHRoYXQgc2VuZHMgbm9cbiAgLy8gZWZmZWN0aXZlTG9jYWxlIGhhcyBuZWl0aGVyLCBhbmQgaXRzIGxpc3RzIHNob3cgbm8gc2VhcmNoIGJveC5cbiAgcHJpdmF0ZSBfc2VydmVyU2VhcmNoZXMgPSBmYWxzZTtcblxuICAvLyBFbWl0cyB0aGUgaWQgb2YgdGhlIGxpc3Qgd2hvc2Ugc2VhcmNoIHRleHQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIHZpZXdlciBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF9zdGF0ZUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBDb3VudHMgdGhlIGNoYW5nZXMgY2hhbmdlcygpIHJlcG9ydHMuIFRoZSBncm91cCB2YWx1ZXMsIHRoZSBncmFpbiBhbmRcbiAgLy8gdGhlIGxpc3Qgc3RhdGUgdGhhdCBkaWZmZXJzRnJvbURlZmF1bHRzIGNvbXBhcmVzIGFyZSB0aGUgcGxhaW4gZmllbGRzXG4gIC8vIGFib3ZlLCB3aGljaCBldmVyeSBzZXR0ZXIgcmVwb3J0cyB0aHJvdWdoIGNoYW5nZXMoKSAodGhleSBhcmUgc2hhcmVkXG4gIC8vIHdpdGggdGhlIGlubGluZSB2YWx1ZXMgYnVpbGQsIHNvIHRoZXkgc3RheSBhcyB0aGV5IGFyZSk7IHRoaXMgY291bnRlciBpc1xuICAvLyBob3cgdGhlIGNvbXB1dGVkIGhlYXJzIG9mIHRoZW0uIFRoZSBwYWdlLCBtYXRjaCBhbmQgZHJpbGxzIGJlbG93IGFyZVxuICAvLyBzaWduYWxzIGFuZFxuICAvLyBpcyByZWFkIGRpcmVjdGx5LiBUaGUgc3ViamVjdCBpcyB0aGlzIHNlcnZpY2UncyBvd24gYW5kIGlzIG5ldmVyXG4gIC8vIGNvbXBsZXRlZCwgc28gdGhlIHNpZ25hbCBsaXN0ZW5zIHRvIGl0IGV4YWN0bHkgYXMgbG9uZyBhcyB0aGUgc2VydmljZVxuICAvLyBsaXZlcy5cbiAgcHJpdmF0ZSBfcmV2aXNpb24gPSB0b1NpZ25hbCh0aGlzLl9zdGF0ZUNoYW5nZWQkLnBpcGUoc2NhbigoY291bnQpID0+IGNvdW50ICsgMSwgMCkpLCB7XG4gICAgaW5pdGlhbFZhbHVlOiAwLFxuICAgIG1hbnVhbENsZWFudXA6IHRydWUsXG4gIH0pO1xuXG4gIHByaXZhdGUgX3N0YXRlVmVyc2lvbiA9IHNpZ25hbCgwKTtcblxuICBwcml2YXRlIF9saXN0U29ydFJlc2V0cyA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIG51bWJlcj4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gVGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkOiB0aGUgdGlsZXMgYW5kIHBhZ2VzIHRoZSBzdGF0ZSBpcyBjaGVja2VkXG4gIC8vIGFnYWluc3QuXG4gIHByaXZhdGUgX3JlcG9ydCA9IHNpZ25hbDxSZXBvcnQgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgb3BlbiBwYWdlLCBzZXQgYnkgdGhlIGhvc3QgYXMgdGhlIHZpZXdlciBtb3ZlcyBiZXR3ZWVuIHBhZ2VzLlxuICBwcml2YXRlIF9wYWdlSWQgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gSG93IHRoZSBncm91cHMgY29tYmluZTogJ2FsbCcgKHRoZSBkZWZhdWx0KSBvciAnYW55Jy5cbiAgcHJpdmF0ZSBfbWF0Y2ggPSBzaWduYWw8UmVwb3J0RmlsdGVyTWF0Y2g+KCdhbGwnKTtcblxuICAvLyBFYWNoIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdG9wIGZpcnN0LCBieSBjb21wb25lbnQgaWQuIEEgY2hhcnQgYXQgaXRzIHRvcFxuICAvLyBoYXMgbm8gZW50cnksIGFuZCBvbmx5IGEgY2hhcnQgaGFzIG9uZS5cbiAgcHJpdmF0ZSBfZHJpbGxzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10+PihuZXcgTWFwKCkpO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgY2hhcnQgd2hvc2UgZHJpbGwgcGF0aCBjaGFuZ2VkLlxuICBwcml2YXRlIF9kcmlsbENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSBsYXlvdXQgYSB2aWV3ZXIgcHV0IGVhY2ggdGFibGUgdGlsZSBpbiwgYnkgY29tcG9uZW50IGlkLCB3aGlsZSBpdFxuICAvLyBkaWZmZXJzIGZyb20gdGhlIHRpbGUncyBhdXRob3JlZCBsYXlvdXQsIHdpdGggdGhlIGF1dGhvcmVkIGxheW91dCBpdCB3YXNcbiAgLy8gY2hhbmdlZCBmcm9tIChSZXBvcnRHcmlkU2Vzc2lvbkxheW91dC5iYXNlKS4gQSB0YWJsZSBzaG93aW5nIGl0cyBhdXRob3JlZFxuICAvLyBsYXlvdXQgaGFzIG5vIGVudHJ5LCBhbmQgb25seSBhIHRhYmxlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2dyaWRMYXlvdXRzID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgUmVwb3J0R3JpZFNlc3Npb25MYXlvdXQ+PihuZXcgTWFwKCkpO1xuXG4gIC8vIFRoZSBncm91cHMgYSB2aWV3ZXIgbGVmdCBvcGVuIGluIGVhY2ggdGFibGUgdGlsZSwgYnkgY29tcG9uZW50IGlkLCBzbyBhXG4gIC8vIHRpbGUgZHJhd24gYWdhaW4gKGEgcGFnZSBzd2l0Y2gpIG9wZW5zIHRoZW0uIFNlc3Npb24gb25seTogbm8gQ2xlYXJcbiAgLy8gcmVzZXRzIHRoZW0sIGRpZmZlcnNGcm9tRGVmYXVsdHMgbmV2ZXIgcmVhZHMgdGhlbSwgYW5kIGZzLWdyaWQgZHJvcHNcbiAgLy8gdGhlbSBpdHNlbGYgb25jZSB0aGUgcm93IGxldmVscyBjaGFuZ2UuXG4gIHByaXZhdGUgX2dyaWRFeHBhbnNpb25zID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgR3JpZEV4cGFuc2lvbj4+KG5ldyBNYXAoKSk7XG5cbiAgLy8gQnkgdGFibGUgdGlsZSwgdGhlIGNvbHVtbiBmaWx0ZXIgYSBncm91cC1ieSBjaGFuZ2UgdG9vayBvdXQgb2YgaXQgYW5kXG4gIC8vIHRoZSBncmFpbiB0aGUgdGFibGUgbm93IGdyb3VwcyBieSAoX2dyYWluR3JpZExheW91dHMoKSksIGZvciBmcy1ncmlkJ3NcbiAgLy8gc3RhdHVzIGxpbmUuIGZzLWdyaWQgaGlkZXMgaXQgb25jZSB0aGUgZmllbGQgaXMgZmlsdGVyZWQgYWdhaW47IGEgQ2xlYXJcbiAgLy8gZHJvcHMgaXQuXG4gIHByaXZhdGUgX2dyaWRDbGVhcmVkRmlsdGVycyA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIEdyaWRDbGVhcmVkRmlsdGVyPj4obmV3IE1hcCgpKTtcblxuICAvLyBUaGUgdGVtcG9yYXJ5IGxheWVyOiBrZXB0IGFwYXJ0IGZyb20gZXZlcnl0aGluZyBhYm92ZSwgc28gc25hcHNob3QoKVxuICAvLyBhbmQgZGlmZmVyc0Zyb21EZWZhdWx0cyBuZXZlciByZWFkIGl0LlxuICBwcml2YXRlIF90ZW1wb3JhcnkgPSBzaWduYWw8UmVwb3J0VGVtcG9yYXJ5U3RhdGU+KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIHB1YmxpYyBpbml0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNUaW1lem9uZSA9IHRoaXMudGltZXpvbmUoKTtcblxuICAgIC8vIFNldCBmaXJzdDogdGhlIGRlZmF1bHRzIHNlZWRlZCBiZWxvdyByZXNvbHZlIHRoZWlyIHJlbGF0aXZlIHByZXNldHMgaW4gaXQuXG4gICAgdGhpcy50aW1lem9uZS5zZXQocmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCkpO1xuICAgIHRoaXMuZm9ybWF0Q29udGV4dC5zZXQocmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0KSk7XG4gICAgLy8gQmVmb3JlIHRoZSBwcnVuaW5nOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgdGhpcy5fcHJ1bmUocmVwb3J0KTtcbiAgICB0aGlzLl9wcnVuZVBhZ2VTdGF0ZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIC8vIEEgYmFyJ3MgdmFsdWUgZm9yIGEgZ3JvdXAuIEEgZGF0ZSByYW5nZSBrZWVwcyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIG9ubHlcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHN0aWxsIHRoZSBzdG9yZWQgZGF5czogdGhlIGJhcnMgcmUtc2V0IGV2ZXJ5IGdyb3VwIHRoZXlcbiAgLy8gc2hvdyB3aGVuZXZlciBhbnkgb25lIG9mIHRoZW0gY2hhbmdlcywgYW5kIGFuIHVudG91Y2hlZCByb2xsaW5nIHJhbmdlIG11c3RcbiAgLy8ga2VlcCBpdHMgbmFtZSByYXRoZXIgdGhhbiB0dXJuIGludG8gdHdvIGZpeGVkIGRhdGVzLiBBbnkgb3RoZXIgcmFuZ2UsIGFcbiAgLy8gZGF0ZSBwaWNrZXIgcHJlc2V0IGluY2x1ZGVkLCBpcyBzdG9yZWQgYXMgdGhlIGZpeGVkIGRhdGVzIGl0IHNob3dzLlxuICBwdWJsaWMgc2V0VmFsdWUoZ3JvdXBJZDogbnVtYmVyLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG5cbiAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpPy5jb25maWc/LmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdGhpcy5fd2l0aFByZXNldCh0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpO1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IG5hbWUgYXMgdG9kYXkncyByYW5nZSBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgb3IgbnVsbCBmb3JcbiAgLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgLy8gRWFjaCB0YWJsZSB0aGF0IGZvbGxvd3MgdGhlIGdyb3VwLWJ5IGhhcyBpdHMgZmlsdGVyIG9uIHRoZSBncm91cC1ieSdzXG4gIC8vIGZpZWxkIG1vdmVkIHRvIHRoZSBuZXcgZ3JhaW4gZmlyc3QgKF9ncmFpbkdyaWRMYXlvdXRzKCkpLCBzbyBhIHRhYmxlIG9uXG4gIC8vIHNjcmVlbiByZWFkcyBvbmNlLCB3aXRoIGJvdGguXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9ncmFpbkdyaWRMYXlvdXRzKCk7XG4gICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIGdyb3VwLWJ5IGdyYWluIGNoYW5nZXMg4oCUIGV2ZXJ5IHRpbGUgdGhhdCBmb2xsb3dzIGl0XG4gIC8vIGxpc3RlbnMgc28gaXQgcmVmZXRjaGVzIGFuZCByZS1idWNrZXRzICh0aGUgb3ZlcnJpZGUgaXNuJ3Qgc2NvcGVkIHRvIGFueVxuICAvLyBmaWx0ZXIgZ3JvdXAsIHNvIGNoYW5nZXNGb3IoKSBjYW4ndCBjYXJyeSBpdCkuXG4gIHB1YmxpYyBmcmVxdWVuY3lDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzb3J0IHRoZSB2aWV3ZXIgbGFzdCBmZXRjaGVkIGEgbGlzdCB3aXRoLCBvciBudWxsIHdoZW4gaXQgaGFzbid0IHNvcnRlZFxuICAvLyAodGhlIGxpc3QgdGhlbiBmYWxscyBiYWNrIHRvIGl0cyBhdXRob3JlZCBzb3J0KS5cbiAgcHVibGljIGxpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNvcnQgd2hlbiBpdCBpcyB0aGUgdmlld2VyJ3Mgb3duOiBhIHNvcnQgdGhhdCBpcyB0aGVcbiAgLy8gbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHRlcm0gaXMgdGhlIGxpc3QncyBkZWZhdWx0LCBub3QgYSBjaG9pY2UsIHNvIGl0XG4gIC8vIGNsZWFycyB0aGUgZW50cnkgaW5zdGVhZCAodGhlIHJ1bGUgc25hcHNob3QoKSBhcHBsaWVzKS4gT3RoZXJ3aXNlIGFcbiAgLy8gbGlzdCdzIGZpcnN0IGZldGNoIHdvdWxkIHJlY29yZCBpdHMgc2VlZGVkIGF1dGhvcmVkIHRlcm0sIGFuZCBhIGxpc3QgdGhlXG4gIC8vIGFnZW50IHJlLXNvcnRzIGxhdGVyIGluIHRoZSBzZXNzaW9uIHdvdWxkIGtlZXAgc2VuZGluZyB0aGUgb2xkIHRlcm1cbiAgLy8gZmlyc3QuIERlbGliZXJhdGVseSBlbWl0cyBubyBjaGFuZ2U6IHRoZSBsaXN0IHNldHMgdGhpcyBmcm9tIHRoZSBmZXRjaFxuICAvLyB0aGF0IGFscmVhZHkgcmFuIHdpdGggdGhhdCBzb3J0LCBzbyBhIG5vdGlmaWNhdGlvbiB3b3VsZCBvbmx5IG1ha2UgaXRcbiAgLy8gcmVmZXRjaCB0aGUgc2FtZSByb3dzLiBPbmx5IGNoYW5nZXMoKSBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0IGEgbGlzdCBpcyBzZWFyY2hlZCBieSwgb3IgbnVsbCB3aGVuIGl0cyBzZWFyY2ggYm94IGlzIGVtcHR5LlxuICBwdWJsaWMgbGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgbGlzdCBzaG93cyB0aGUgc2VhcmNoIGJveCBvdmVyIGl0cyB0ZXh0IGNvbHVtbnM6IGl0IGRvZXMgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaCAoc2VlIF9zZXJ2ZXJTZWFyY2hlcyksIHVubGVzcyBvbmUgb2YgaXRzIGxpdmVcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIGEga2V5d29yZCBncm91cCBpdHMgaGVhZGVyIHNob3dzLiBBIGJhciBzaG93cyBvbmUgc2VhcmNoXG4gIC8vIGJveCAoaXRzIGxhc3Qga2V5d29yZCBpdGVtKSwgYW5kIHRoYXQgb25lIGlzIHRoZSBhdXRob3Incy4gVGhlIGhlYWRlciwgdGhlXG4gIC8vIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCBjaGFuZ2VzKCkgaGVhciBhYm91dCBpdCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB0ZXh0IGFjdHVhbGx5IGNoYW5nZWQuXG4gIHB1YmxpYyBzZXRMaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRleHQpO1xuXG4gICAgaWYgKHNlYXJjaCA9PT0gKHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/ICcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50SWQsIHNlYXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSBjb25maWcgY29sdW1uIG5hbWVzIGEgdmlld2VyIGhpZCBvbiBhIGxpc3Q7IG5vbmUgd2hlbiBpdCBzaG93cyB0aGVtIGFsbC5cbiAgcHVibGljIGhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SGlkZGVuKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdCwga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczpcbiAgLy8gbmFtZXMgdGhlIGxpc3QgY2Fubm90IGhpZGUgYXJlIGRyb3BwZWQsIGFuZCBub25lIChvciBldmVyeSBjb2x1bW4pIGNsZWFyc1xuICAvLyB0aGUgZW50cnkuIE9ubHkgY2hhbmdlcygpIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgbGlzdCdzIHNlYXJjaCB0ZXh0IGNoYW5nZXMsIHNvIHRoYXQgbGlzdCByZWZldGNoZXMuXG4gIHB1YmxpYyBsaXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwIHZhbHVlLCB0aGVcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgdGhlIHBhZ2UsIGEgbGlzdCBzb3J0LCBzZWFyY2ggb3IgaGlkZGVuIGNvbHVtbnMsIGFcbiAgLy8gZHJpbGwgcGF0aCwgYSByZXNldCBvciBhIChyZSlsb2FkIG9mIHRoZSByZXBvcnQuXG4gIHB1YmxpYyBjaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgLy8gVHVybmluZyBhIGtleXdvcmQgZmlsdGVyIGJhY2sgb24gdGFrZXMgaXRzIGxpc3QncyBzZWFyY2ggYm94IGF3YXksIGFuZFxuICAgIC8vIHRoZSBzZWFyY2ggd2l0aCBpdC4gVGhlIGxpc3QgcmVmZXRjaGVzIG9uIHRoZSBncm91cCBjaGFuZ2UgYmVsb3cuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gT05FIGNvbXBvbmVudDogYW55IGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiBpdHNcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIChvciBhIGZ1bGwgcmUtaW5pdCkuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBJZHMgPSBuZXcgU2V0KChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkKSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCkgPT4gZ3JvdXBJZCA9PT0gbnVsbCB8fCBncm91cElkcy5oYXMoZ3JvdXBJZCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gQU5ZIG9mIGEgc2V0IG9mIGNvbXBvbmVudHMgdGhhdCBjb21lcyBhbmQgZ29lc1xuICAvLyAoYSBwYWdlJ3MgdmFsdWVzKTogYSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgdGhlaXIgZmlsdGVycyBiZWxvbmdzIHRvLlxuICAvLyBVbmxpa2UgY2hhbmdlc0ZvciwgdGhlIHNldCBpcyByZWFkIG9uIGVhY2ggZXZlbnQgcmF0aGVyIHRoYW4gY2FwdHVyZWQgYXRcbiAgLy8gc3Vic2NyaWJlLCBzbyBvbmUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgdGhlIHNldCBhcyB0aGUgcmVwb3J0IHJlbG9hZHMuIEFcbiAgLy8gZnVsbCByZS1pbml0IChudWxsKSBpcyBub3QgcGFzc2VkIG9uOiBpbml0KCkgcnVucyBvbiBhIHJlcG9ydFxuICAvLyAocmUpbG9hZCwgYW5kIGEgY2FsbGVyIG9mIHRoaXMgY2hlY2tzIG9uIHRoYXQgcmVsb2FkIGl0c2VsZiB3aGV0aGVyIHRoZVxuICAvLyBmaWx0ZXIgdmFsdWVzIGl0cyBjb21wb25lbnRzIGFyZSByZWFkIHdpdGggbW92ZWQuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yQW55KGNvbXBvbmVudHM6ICgpID0+IFJlcG9ydENvbXBvbmVudFtdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCk6IGdyb3VwSWQgaXMgbnVtYmVyID0+IGdyb3VwSWQgIT09IG51bGxcbiAgICAgICAgICAmJiBjb21wb25lbnRzKCkuc29tZSgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pXG4gICAgICAgICAgICAuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCA9PT0gZ3JvdXBJZCkpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSB0aWxlJ3MgcmVzb2x2ZWQgdmFsdWVzIGluIG9uZSBhcnJheSDigJQgd2hhdCBhIHJlcG9ydC1sZXZlbCBleHBvcnRcbiAgLy8gY2FycmllcyBzbyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGlzLlxuICAvLyBGaWx0ZXIgaWRzIGFyZSB1bmlxdWUgcGVyIGNvbXBvbmVudCwgc28gdGhlIGJhY2tlbmQgcGlja3MgZWFjaCBjb21wb25lbnQnc1xuICAvLyBvd24gb3V0IG9mIHRoZSBwaWxlLiBPbmx5IGEgdGlsZSBiZWNvbWVzIGEgZmlsZSAoaXNUaWxlKSwgc28gbm8gb3RoZXJcbiAgLy8gY29tcG9uZW50J3MgZW50cmllcyByaWRlIGFsb25nLiBBIHBhZ2UgaWQgbmFycm93cyBpdCB0byB0aGF0IHBhZ2UuXG4gIHB1YmxpYyByZXNvbHZlRm9yUmVwb3J0KHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCBwYWdlcyA9IChyZXBvcnQucGFnZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZCk7XG5cbiAgICByZXR1cm4gcGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKVxuICAgICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB0aGlzLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSkpO1xuICB9XG5cbiAgcHVibGljIHNldFBhZ2UocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHBhZ2VJZCA9PT0gdGhpcy5fcGFnZUlkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYWdlSWQuc2V0KHBhZ2VJZCk7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIGNoYW5nZSBvZiBtYXRjaCBjYW4gY2hhbmdlIGV2ZXJ5IHRpbGUgYSBncm91cCB3aXRoIGEgdmFsdWUgbmFycm93cywgc29cbiAgLy8gZXZlcnkgdGlsZSBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldE1hdGNoKG1hdGNoOiBSZXBvcnRGaWx0ZXJNYXRjaCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQ6IFJlcG9ydEZpbHRlck1hdGNoID0gbWF0Y2ggPT09ICdhbnknID8gJ2FueScgOiAnYWxsJztcbiAgICBpZiAobmV4dCA9PT0gdGhpcy5fbWF0Y2goKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21hdGNoLnNldChuZXh0KTtcbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSBjaGFydCdzIGRyaWxsIHBhdGgsIHRvcCBmaXJzdDsgZW1wdHkgd2hpbGUgdGhlIGNoYXJ0IGlzIGF0IGl0cyB0b3AuXG4gIC8vIEl0IHJlYWRzIGEgc2lnbmFsLCBzbyBhIHRlbXBsYXRlIHRoYXQgc2hvd3MgaXQgcmVwYWludHMgd2hlbiBpdCBtb3Zlcy5cbiAgcHVibGljIGRyaWxsKGNvbXBvbmVudElkOiBudW1iZXIpOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RyaWxscygpLmdldChjb21wb25lbnRJZCkgPz8gW107XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgY2hhcnQncyBkcmlsbCBwYXRoLCBrZXB0IHRvIGNsZWFuRHJpbGxQYXRoOyBhbiBlbXB0eSBwYXRoIGlzXG4gIC8vIHRoZSBjaGFydCdzIHRvcC4gT25seSBhIGNoYXJ0IG9mIHRoZSBvcGVuIHJlcG9ydCBkcmlsbHM6IGEgcGF0aCBmb3IgYW55XG4gIC8vIG90aGVyIGNvbXBvbmVudCBpcyBpZ25vcmVkLiBPbmx5IHRoYXQgY2hhcnQgYW5kIGNoYW5nZXMoKSBoZWFyIGFib3V0IGl0LFxuICAvLyBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0RHJpbGwoY29tcG9uZW50SWQ6IG51bWJlciwgcGF0aDogcmVhZG9ubHkgUmVwb3J0RHJpbGxTdGVwW10pOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gY2xlYW5EcmlsbFBhdGgocGF0aCk7XG4gICAgaWYgKCF0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSB8fCBzYW1lRHJpbGxQYXRoKGtlcHQsIHRoaXMuZHJpbGwoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NldERyaWxsUGF0aChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgdGhpcy5fZHJpbGxDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIG9uZSBjaGFydCdzIGRyaWxsIHBhdGggY2hhbmdlcywgc28gdGhhdCBjaGFydCByZWZldGNoZXMuXG4gIHB1YmxpYyBkcmlsbENoYW5nZXMoY29tcG9uZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kcmlsbENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGlkKSA9PiBpZCA9PT0gY29tcG9uZW50SWQpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUYWtlcyB0aGUgZHJpbGwgcGF0aCBhIGNoYXJ0J3MgYW5zd2VyIGFwcGxpZWQgYXMgdGhlIGNoYXJ0J3Mgb3duOiB0aGVcbiAgLy8gc2VydmVyIGtlZXBzIHRoZSBsb25nZXN0IHBhcnQgb2YgYSBzZW50IHBhdGggaXQgY2FuIGFwcGx5LCBzbyBhIGxhdGVyXG4gIC8vIHNhdmUgaG9sZHMgdGhhdCBwYXJ0IG9ubHkuIFRoZSBjaGFydCBoYXMganVzdCByZWFkIHRoYXQgcGF0aCwgc28gb25seVxuICAvLyBjaGFuZ2VzKCkgaGVhcnMgYWJvdXQgaXQuIFRydWUgd2hlbiB0aGUgcGF0aCBjaGFuZ2VkLlxuICBwdWJsaWMgYWRvcHREcmlsbChjb21wb25lbnRJZDogbnVtYmVyLCBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtlcHQgPSBjbGVhbkRyaWxsUGF0aChwYXRoKTtcbiAgICBpZiAoIXRoaXMuX2lzQ2hhcnQoY29tcG9uZW50SWQpIHx8IHNhbWVEcmlsbFBhdGgoa2VwdCwgdGhpcy5kcmlsbChjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICB0aGlzLl9zdGF0ZUNoYW5nZWQkLm5leHQoKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gVGhlIGxheW91dCBhIHRhYmxlIHRpbGUgaXMgb24gc2NyZWVuIGluOiB0aGUgdmlld2VyJ3Mgb3duIHdoaWxlIHRoZXlcbiAgLy8gY2hhbmdlZCBpdCBmcm9tIHRoZSBsYXlvdXQgYXV0aG9yZWQgbm93LCBlbHNlIHRoZSBhdXRob3JlZCBvbmUuIEl0IHJlYWRzXG4gIC8vIGEgc2lnbmFsLCBzbyBhIHRpbGUgdGhhdCBzaG93cyBpdCByZWRyYXdzIHdoZW4gZWl0aGVyIG1vdmVzLlxuICBwdWJsaWMgZ3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRMYXlvdXQge1xuICAgIHJldHVybiB0aGlzLmdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudCkgPz8gYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCk7XG4gIH1cblxuICAvLyBUaGUgdmlld2VyJ3Mgb3duIGxheW91dCBvZiBhIHRhYmxlIHRpbGUgd2hpbGUgaXQgZGlmZmVycyBmcm9tIHRoZSBsYXlvdXRcbiAgLy8gYXV0aG9yZWQgbm93LCBlbHNlIG51bGw6IHRoZSB0aWxlIHNob3dzIGl0cyBzdG9yZWQgbGF5b3V0LiBUaGUgY2hhdFxuICAvLyBzZW5kcyBpdCBhcyB0aGUgdGlsZSdzIGxheW91dC5cbiAgcHVibGljIGdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogR3JpZExheW91dCB8IG51bGwge1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9ncmlkTGF5b3V0cygpLmdldChjb21wb25lbnQuaWQpO1xuXG4gICAgcmV0dXJuIHNlc3Npb24/LmJhc2UgPT09IGdyaWRMYXlvdXRLZXkoYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCkpXG4gICAgICA/IHNlc3Npb24ubGF5b3V0XG4gICAgICA6IG51bGw7XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBsYXlvdXQgYSB2aWV3ZXIgcHV0IGEgdGFibGUgdGlsZSBpbiAoYSByZS1waXZvdCwgYSBzb3J0LCBhXG4gIC8vIGNvbHVtbiBmaWx0ZXIpLiBPbmUgdGhhdCBkcmF3cyB0aGUgYXV0aG9yZWQgbGF5b3V0IGNsZWFycyB0aGUgZW50cnksIHNvXG4gIC8vIHRoZSB0aWxlIHJlYWRzIGFzIHN0b3JlZCBhZ2Fpbi4gZnMtZ3JpZCByZWFkcyB0aGUgY2hhbmdlIGl0c2VsZiwgc28gb25seVxuICAvLyBjaGFuZ2VzKCkgaGVhcnMgYWJvdXQgaXQsIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXRHcmlkTGF5b3V0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBsYXlvdXQ6IEdyaWRMYXlvdXQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHV0R3JpZExheW91dChjb21wb25lbnQsIGxheW91dCkpIHtcbiAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlZCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBjb2x1bW4gZmlsdGVyIGEgZ3JvdXAtYnkgY2hhbmdlIHRvb2sgb3V0IG9mIGEgdGFibGUgdGlsZSwgb3IgbnVsbFxuICAvLyAoX2dyaWRDbGVhcmVkRmlsdGVycykuXG4gIHB1YmxpYyBncmlkQ2xlYXJlZEZpbHRlcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRDbGVhcmVkRmlsdGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycygpLmdldChjb21wb25lbnQuaWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXBzIGEgdmlld2VyIGxlZnQgb3BlbiBpbiBhIHRhYmxlIHRpbGUsIG9yIHVuZGVmaW5lZDogdGhlIHRpbGVcbiAgLy8gb3BlbnMgYXMgaXRzIGxheW91dCBzYXlzLlxuICBwdWJsaWMgZ3JpZEV4cGFuc2lvbihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRFeHBhbnNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9ncmlkRXhwYW5zaW9ucygpLmdldChjb21wb25lbnQuaWQpO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgZ3JvdXBzIG9wZW4gaW4gYSB0YWJsZSB0aWxlLCBhcyBmcy1ncmlkIHdyaXRlcyB0aGVtIG91dC4gSXRcbiAgLy8gY2hhbmdlcyBubyByZWFkLCBzbyBub3RoaW5nIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0R3JpZEV4cGFuc2lvbihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZXhwYW5zaW9uOiBHcmlkRXhwYW5zaW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlICE9PSAnZ3JpZCcgfHwgIWV4cGFuc2lvbiB8fCB0aGlzLl9ncmlkRXhwYW5zaW9ucygpLmdldChjb21wb25lbnQuaWQpID09PSBleHBhbnNpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ncmlkRXhwYW5zaW9ucy5zZXQobmV3IE1hcCh0aGlzLl9ncmlkRXhwYW5zaW9ucygpKS5zZXQoY29tcG9uZW50LmlkLCBleHBhbnNpb24pKTtcbiAgfVxuXG4gIC8vIFRoZSBkdXJhYmxlIHN0YXRlIG9uIHNjcmVlbiBhcyBvbmUgZG9jdW1lbnQ6IHRoZSBwYWdlLCBldmVyeSBncm91cCB0aGVcbiAgLy8gcmVwb3J0IGhhcyAobnVsbCB3aGVuIGl0IGhvbGRzIG5vdGhpbmcsIGEgY2xlYXJlZCBkZWZhdWx0IGluY2x1ZGVkKSwgdGhlXG4gIC8vIG1hdGNoLCB0aGUgZ3JhaW4sIGFuZCBlYWNoIHRpbGUncyBzb3J0LCBzZWFyY2gsIGhpZGRlbiBjb2x1bW5zIGFuZCBkcmlsbFxuICAvLyBwYXRoIHdoZXJlIHRoZXkgZGlmZmVyIGZyb20gdGhlIGF1dGhvcmVkIHRpbGUuIEEgZGF0ZSByYW5nZSB0aGF0IHN0aWxsXG4gIC8vIGNhcnJpZXMgaXRzIHJlbGF0aXZlIHByZXNldCBpcyB3cml0dGVuIGFzIHRoYXQgcHJlc2V0LCB3aGF0ZXZlciB0b2RheSBpc1xuICAvLyAodG9TdG9yZWRHcm91cFZhbHVlKS4gVGhlIHRlbXBvcmFyeSBsYXllciBpcyBuZXZlciBwYXJ0IG9mIGl0LlxuICBwdWJsaWMgc25hcHNob3QoKTogUmVwb3J0U3RhdGVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFJlcG9ydFN0YXRlU25hcHNob3QgPSB7fTtcblxuICAgIGlmICh0aGlzLl9wYWdlSWQoKSkge1xuICAgICAgc25hcHNob3QucGFnZUlkID0gdGhpcy5fcGFnZUlkKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZyZXF1ZW5jeSkge1xuICAgICAgc25hcHNob3QuZ3JvdXBCeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWF0Y2goKSA9PT0gJ2FueScpIHtcbiAgICAgIHNuYXBzaG90Lm1hdGNoID0gJ2FueSc7XG4gICAgfVxuXG4gICAgc25hcHNob3QuZ3JvdXBzID0gdGhpcy5fc25hcHNob3RHcm91cHMoKTtcblxuICAgIGNvbnN0IHRpbGVzID0gdGhpcy5fc25hcHNob3RUaWxlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aWxlcykubGVuZ3RoKSB7XG4gICAgICBzbmFwc2hvdC50aWxlcyA9IHRpbGVzO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8vIFRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cyBhcyBhIHNuYXBzaG90OiBldmVyeSBncm91cCBhdCBpdHMgYXV0aG9yZWRcbiAgLy8gZGVmYXVsdCAobnVsbCB3aGVuIGl0IGhhcyBub25lKSwgbm8gbWF0Y2gsIGdyYWluIG9yIHRpbGUgc3RhdGUuXG4gIHB1YmxpYyBhdXRob3JlZENvbmZpZygpOiBSZXBvcnRTdGF0ZVNuYXBzaG90IHtcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxudW1iZXIsIEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGw+ID0ge307XG5cbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgIGdyb3Vwc1tncm91cC5pZF0gPSB0b1N0b3JlZEdyb3VwVmFsdWUoZ3JvdXAudHlwZSwgdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBncm91cHMgfTtcbiAgfVxuXG4gIC8vIFB1dHMgdGhlIHNjcmVlbiBiYWNrIG9uIHRoZSByZXBvcnQncyBhdXRob3JlZCBkZWZhdWx0cyBvbiB0aGUgcGFnZSBpdCBpc1xuICAvLyBvbjogZXZlcnkgZ3JvdXAgYXQgaXRzIGRlZmF1bHQsIG1hdGNoICdhbGwnLCBubyBncmFpbiwgYW5kIGV2ZXJ5IHRpbGUgYXRcbiAgLy8gaXRzIGF1dGhvcmVkIHNvcnQsIHNlYXJjaCwgY29sdW1ucyBhbmQgdG9wLiBDbGVhcnMgdGhlIHRlbXBvcmFyeSBsYXllci5cbiAgLy8gVGhlIHRpbGVzIHN0YXkgYW5kIHJlbG9hZCBpbiBwbGFjZSwgZXhjZXB0IGEgbGlzdCB3aG9zZSBzb3J0IHRoaXMgbW92ZWRcbiAgLy8gKGxpc3RTb3J0UmVzZXRzKS4gRXZlcnkgY2hhbmdlIGlzIGFubm91bmNlZCBvbmNlLCBhdCB0aGUgZW5kLlxuICBwdWJsaWMgcmVzZXRUb0RlZmF1bHRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZyZXF1ZW5jeTtcbiAgICBjb25zdCBzb3J0cyA9IG5ldyBNYXAodGhpcy5fbGlzdFNvcnRzKTtcblxuICAgIHRoaXMuX3RlbXBvcmFyeS5zZXQoZW1wdHlUZW1wb3JhcnlTdGF0ZSgpKTtcbiAgICB0aGlzLl9ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHRoaXMuX3NlZWRBdXRob3JlZChncm91cCkpO1xuICAgIHRoaXMuX21hdGNoLnNldCgnYWxsJyk7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gbnVsbDtcbiAgICB0aGlzLl9jbGVhclRpbGVzKCk7XG4gICAgdGhpcy5fY291bnRTb3J0UmVzZXRzKHNvcnRzKTtcbiAgICB0aGlzLl9ub3RpZnlSZXNldChmcmVxdWVuY3kpO1xuICB9XG5cbiAgLy8gUHV0cyBvbmx5IGBncm91cElkc2AgYmFjayBvbiB0aGVpciBhdXRob3JlZCBkZWZhdWx0cy4gQSB0aWxlIGhlYWRlcidzXG4gIC8vICdDbGVhciBmaWx0ZXJzJyBvd25zIG9ubHkgaXRzIG93biBncm91cHM7IHRoZSByZXBvcnQgYmFyJ3MgY2FsbHNcbiAgLy8gcmVzZXRUb0RlZmF1bHRzKCkuIEVhY2ggZ3JvdXAgaXMgYW5ub3VuY2VkIGFzIGEgdmlld2VyJ3MgY2hhbmdlIHRvIGl0IGlzLFxuICAvLyBzbyB0aGUgdGlsZXMgaW4gaXQgcmVmZXRjaCBhbmQgYSBiYXIgc2hvd2luZyBpdCB3aXRoIGFub3RoZXIgdmFsdWUgaXNcbiAgLy8gYnVpbHQgYWdhaW4uXG4gIHB1YmxpYyByZXNldEdyb3Vwc1RvRGVmYXVsdHMoZ3JvdXBJZHM6IHJlYWRvbmx5IG51bWJlcltdKTogdm9pZCB7XG4gICAgZ3JvdXBJZHMuZm9yRWFjaCgoZ3JvdXBJZCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpO1xuICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NlZWRBdXRob3JlZChncm91cCk7XG4gICAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIG9uZSBvZiBgZ3JvdXBJZHNgIHNob3dzIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgYXV0aG9yZWQgZGVmYXVsdCxcbiAgLy8gdGhlIHZhbHVlIHJlc2V0R3JvdXBzVG9EZWZhdWx0cygpIHB1dHMgYmFjay4gQSB0aWxlIGhlYWRlcidzIENsZWFyIGNoaXBcbiAgLy8gc2hvd3MgZXhhY3RseSB3aGlsZSBvbmUgb2YgaXRzIG93biBncm91cHMgZG9lcy4gSXQgcmVhZHMgdGhlIHJldmlzaW9uXG4gIC8vIGRpZmZlcnNGcm9tRGVmYXVsdHMgcmVhZHMsIHNvIGEgY2FsbGVyIG9uIGVhY2ggY2hlY2sgb2YgYW4gT25QdXNoIHZpZXdcbiAgLy8gc3RheXMgY3VycmVudC5cbiAgcHVibGljIGdyb3Vwc0RpZmZlckZyb21EZWZhdWx0cyhncm91cElkczogcmVhZG9ubHkgbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXZpc2lvbigpO1xuXG4gICAgcmV0dXJuIGdyb3VwSWRzLnNvbWUoKGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRob3JlZCA9IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApKTtcbiAgICAgIGNvbnN0IHNjcmVlbiA9IHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwSWQpID8gbnVsbCA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpKTtcblxuICAgICAgcmV0dXJuICFzYW1lU3RvcmVkR3JvdXBWYWx1ZShhdXRob3JlZCwgc2NyZWVuKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBpbnRlcmFjdGlvbiBzdGF0ZSBhIHRpbGUncyBkYXRhIHJlcXVlc3QgY2FycmllcyBub3c6IHRpbGVEYXRhU3RhdGVcbiAgLy8gb3ZlciB0aGUgb3BlbiByZXBvcnQgYW5kIHRoZSBzY3JlZW4ncyBzbmFwc2hvdCgpLlxuICBwdWJsaWMgdGlsZVN0YXRlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogQ29tcG9uZW50RGF0YVN0YXRlIHtcbiAgICByZXR1cm4gdGlsZURhdGFTdGF0ZSh0aGlzLl9yZXBvcnQoKSwgY29tcG9uZW50LCB0aGlzLnNuYXBzaG90KCkpO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZ3JvdXAncyB2YWx1ZSBzdGlsbCBpcywgYXMgYSBkYXRhIHJlcXVlc3QgbmFtZXMgaXRcbiAgLy8gKGl0cyBwcmVzZXQgd2hpbGUgaXRzIGRheXMgYXJlIHRoYXQgcmFuZ2UgcmVzb2x2ZWQgdG9kYXkpLCBvciBudWxsLiBUaGVcbiAgLy8gZXhwb3J0IHdvcmRpbmcgbmFtZXMgYSBsaXZlIHByZXNldCBieSBpdC5cbiAgcHVibGljIGxpdmVQcmVzZXQoZ3JvdXBJZDogbnVtYmVyKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcblxuICAgIHJldHVybiB2YWx1ZSA/IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpIDogbnVsbDtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAgdmFsdWUgYXMgdGhlIGZpZWxkcyBhIHJlcXVlc3QgY2FycmllczogZGF0ZSBib3VuZHMgYXMgY2FsZW5kYXJcbiAgLy8gZGF5cywgc2VsZWN0IHZhbHVlcyB3aGVuIGFueSBhcmUgcGlja2VkIChlbHNlIHRoZSB2YWx1ZXMgbGVmdCBvdXQpLFxuICAvLyBrZXl3b3JkIHRleHQgdHJpbW1lZCwgYSBudW1iZXIgcmFuZ2UncyBlbmRzLiBOdWxsIHdoZW4gYWxsIG9mIHRoZW0gYXJlXG4gIC8vIGVtcHR5LiBBIGRhdGUgcmFuZ2UgYWxzbyBuYW1lcyB0aGUgcmVsYXRpdmUgcmFuZ2UgaXQgc3RpbGwgaXNcbiAgLy8gKF9saXZlUHJlc2V0KSwgc28gdGhlIHNlcnZlciBrbm93cyB3aGljaCBwZXJpb2QgdGhlIGRheXMgY292ZXI7XG4gIC8vIHRoZSBkYXlzIHN0YXkgdGhlIHdpbmRvdyBlaXRoZXIgd2F5LiBDb21wb25lbnQgZGF0YSwgdGhlIHJlcG9ydCBhbmQgcGFnZVxuICAvLyBleHBvcnRzIGFuZCB0aGUgY2hhdCdzIHZpZXdlciBmaWx0ZXJzIGFsbCByZWFkIHRoZWlyIGZpZWxkcyBoZXJlLCBzbyBhbGxcbiAgLy8gdGhyZWUgY2FycnkgaXQuXG4gIHByaXZhdGUgX3Jlc29sdmVkRmllbGRzKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiB8IG51bGwge1xuICAgIGNvbnN0IGZpZWxkczogT21pdDxSZXNvbHZlZEZpbHRlclZhbHVlLCAnZmlsdGVySWQnPiA9IHt9O1xuICAgIGNvbnN0IHByZXNldCA9IHRoaXMuX2xpdmVQcmVzZXQodmFsdWUpO1xuXG4gICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICBmaWVsZHMuc3RhcnQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuZW5kKSB7XG4gICAgICBmaWVsZHMuZW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCk7XG4gICAgfVxuICAgIGlmIChwcmVzZXQpIHtcbiAgICAgIGZpZWxkcy5wcmVzZXQgPSBwcmVzZXQ7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgZmllbGRzLnZhbHVlcyA9IHZhbHVlLnZhbHVlcztcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgIGZpZWxkcy52YWx1ZSA9IHZhbHVlLnZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNvbHZlRXhjbHVkZUFuZFJhbmdlKHZhbHVlLCBmaWVsZHMpO1xuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICB8fCBmaWVsZHMuZXhjbHVkZVZhbHVlcyB8fCBmaWVsZHMubWluICE9PSB1bmRlZmluZWQgfHwgZmllbGRzLm1heCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIHJlbGF0aXZlIHJhbmdlIGEgZGF0ZSB2YWx1ZSBzdGlsbCBpczogdGhlIHByZXNldCBuYW1lIGl0IGNhcnJpZXMsXG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSB0aGF0IHJhbmdlIHJlc29sdmVkIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLiBBXG4gIC8vIHZhbHVlIHdob3NlIGRheXMgdGhlIHZpZXdlciBjaGFuZ2VkLCBvciBvbmUgc2VlZGVkIGJlZm9yZSBtaWRuaWdodCB0aGF0XG4gIC8vIGlzIG5vdyBhIGRheSBiZWhpbmQsIG5hbWVzIG5vbmUsIGFuZCB0aGUgc2VydmVyIHJlYWRzIGl0cyBkYXlzIGFsb25lLlxuICBwcml2YXRlIF9saXZlUHJlc2V0KHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogUmVwb3J0UmVsYXRpdmVSYW5nZSB8IG51bGwge1xuICAgIGlmICghdmFsdWUucHJlc2V0IHx8ICFpc1JlbGF0aXZlUmFuZ2UodmFsdWUucHJlc2V0KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCk7XG5cbiAgICByZXR1cm4gcmFuZ2UgJiYgc2FtZURheXModmFsdWUsIHJhbmdlKSA/IHZhbHVlLnByZXNldCA6IG51bGw7XG4gIH1cblxuICAvLyBTZWVkcyBvbmUgZ3JvdXAgb24gKHJlKWxvYWQ7IHNlZSBpbml0KCkuIGBwcmV2aW91c2AgaXMgdGhlIGdyb3VwIGFzIHRoZVxuICAvLyBsYXN0IGxvYWQgaGFkIGl0LCBvciBudWxsIHdoZW4gaXQgaXMgbmV3LlxuICBwcml2YXRlIF9zZWVkKFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICBwcmV2aW91czogUmVwb3J0RmlsdGVyR3JvdXAgfCBudWxsLFxuICAgIHRpbWV6b25lQ2hhbmdlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdENoYW5nZWQgPSAhc2FtZURlZmF1bHQocHJldmlvdXM/LmNvbmZpZz8uZGVmYXVsdCA/PyBudWxsLCBncm91cC5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCk7XG5cbiAgICBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwLmlkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKTtcbiAgICBjb25zdCBwcmVzZXRUb1Jlc29sdmUgPSB0aW1lem9uZUNoYW5nZWRcbiAgICAgICYmICEhdmFsdWU/LnByZXNldFxuICAgICAgJiYgdmFsdWUucHJlc2V0ID09PSBncm91cC5jb25maWc/LmRlZmF1bHQ/LnJlbGF0aXZlO1xuXG4gICAgaWYgKHZhbHVlICYmICFkZWZhdWx0Q2hhbmdlZCAmJiAhcHJlc2V0VG9SZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZGVmYXVsdFZhbHVlKGdyb3VwKTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIGRlZmF1bHRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0Q2hhbmdlZCkge1xuICAgICAgLy8gVGhlIGRlZmF1bHQgd2FzIGNsZWFyZWQsIHNvIHRoZSB2YWx1ZSBpdCBzZWVkZWQgZ29lcyB3aXRoIGl0LlxuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJvcHMgdGhlIHNlYXJjaCBvZiBldmVyeSBsaXN0IHRoYXQgbm8gbG9uZ2VyIHNob3dzIGEgc2VhcmNoIGJveDogb25lXG4gIC8vIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcywgb3Igb25lIHdob3NlIGhlYWRlciBub3cgaGFzIGEga2V5d29yZCBncm91cC5cbiAgcHJpdmF0ZSBfZHJvcFVuc2VhcmNoYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0U2VhcmNoZXMuZm9yRWFjaCgoc2VhcmNoLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSkge1xuICAgICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyb3BzIHN0YXRlIGtlcHQgZm9yIGdyb3VwcywgbGlzdHMgYW5kIGZpbHRlcnMgdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLlxuICAvLyBBIGxpc3Qgc29ydCBhbHNvIGdvZXMgd2hlbiBpdHMgY29sdW1uIGRvZXM6IHRoZSBhZ2VudCBjYW4gcmVtb3ZlIG9yIHJlbmFtZVxuICAvLyBpdCwgYW5kIHRoZSByZWNyZWF0ZWQgbGlzdCB3b3VsZCBzZW5kIGEgY29sdW1uIHRoZSBxdWVyeSBkb2VzIG5vdCBrbm93LlxuICAvLyBBIGxpc3Qgc2VhcmNoIGdvZXMgd2l0aCBpdHMgbGlzdCAob3Igd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlciBhXG4gIC8vIGxpc3QpLCBhbmQgd2hlbiB0aGUgbGlzdCBnYWlucyBhIGtleXdvcmQgZ3JvdXAgYW5kIHNvIGxvc2VzIGl0cyBib3guXG4gIC8vIEhpZGRlbiBjb2x1bW5zIGtlZXAgb25seSB0aGUgbmFtZXMgdGhlaXIgbGlzdCBzdGlsbCBoYXMgYXMgY29sdW1ucyAodGhlXG4gIC8vIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lIG9uZSwgb3IgdHVybiB0aGUgbGlzdCBpbnRvIGEgY3Jvc3MtdGFiKSwgYW5kIGdvXG4gIC8vIHdoZW4gd2hhdCBpcyBsZWZ0IHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9wcnVuZShyZXBvcnQ6IFJlcG9ydCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBvZiBbLi4udGhpcy5fdmFsdWVzLmtleXMoKSwgLi4udGhpcy5fY2xlYXJlZF0pIHtcbiAgICAgIGlmICghdGhpcy5fZ3JvdXBzLmhhcyhncm91cElkKSkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U29ydHMuZm9yRWFjaCgoc29ydCwgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk7XG5cbiAgICAgIGlmICghY29tcG9uZW50IHx8ICF0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBWYWx1ZXMgaW5jbHVkZWQ6IG9uZSBpcyBuZXZlciBkcmF3biwgYnV0IGl0cyBmaWx0ZXJzIGFyZSB0aGUgcmVwb3J0J3NcbiAgICAvLyBsaWtlIGFueSBvdGhlciBjb21wb25lbnQncywgYW5kIHNvIGFyZSB0aGVpciBzZXNzaW9uIHRvZ2dsZXMuXG4gICAgY29uc3QgZmlsdGVySWRzID0gbmV3IFNldChyZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5pZCkpKTtcblxuICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5mb3JFYWNoKChmaWx0ZXJJZCkgPT4ge1xuICAgICAgaWYgKCFmaWx0ZXJJZHMuaGFzKGZpbHRlcklkKSkge1xuICAgICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuX2Ryb3BVbnNlYXJjaGFibGUoKTtcblxuICAgIGNvbnN0IGhpZGRlbiA9IG5ldyBNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4oKTtcblxuICAgIHRoaXMubGlzdEhpZGRlbigpLmZvckVhY2goKG5hbWVzLCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3Qga2VwdCA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgICBpZiAoa2VwdC5sZW5ndGgpIHtcbiAgICAgICAgaGlkZGVuLnNldChjb21wb25lbnRJZCwga2VwdCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KGhpZGRlbik7XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgYSBiYXIgc2V0cywga2VlcGluZyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIHdoaWxlIHRoZSBkYXlzIGFyZVxuICAvLyBzdGlsbCB0aGUgc3RvcmVkIGRheXMgKHNlZSBzZXRWYWx1ZSkuXG4gIHByaXZhdGUgX3dpdGhQcmVzZXQoc3RvcmVkOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IEZpbHRlckdyb3VwVmFsdWUge1xuICAgIGNvbnN0IGZpeGVkOiBGaWx0ZXJHcm91cFZhbHVlID0geyAuLi52YWx1ZSB9O1xuICAgIGRlbGV0ZSBmaXhlZC5wcmVzZXQ7XG5cbiAgICByZXR1cm4gc3RvcmVkPy5wcmVzZXQgJiYgc2FtZURheXMoc3RvcmVkLCBmaXhlZClcbiAgICAgID8geyAuLi5maXhlZCwgcHJlc2V0OiBzdG9yZWQucHJlc2V0IH1cbiAgICAgIDogZml4ZWQ7XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gcmVwb3J0Q29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9leGNsdWRlT3JSYW5nZURlZmF1bHQoZ3JvdXBEZWZhdWx0KTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IGFzIGEgY2FsZW5kYXItZGF5IHJhbmdlLiBcIlRvZGF5XCIgaXMgdGhlIGRheSBpbiB0aGVcbiAgLy8gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUsIG5vdCB0aGUgYnJvd3NlcidzLCBzbyBldmVyeSB2aWV3ZXIgc2VlZHMgdGhlIHNhbWVcbiAgLy8gcmFuZ2UuIFRoZSBzZXJ2ZXIgdHdpbiBpcyBSZXBvcnRSZWxhdGl2ZVJhbmdlRW51bSAoZnJhbWV3b3JrL1JlcG9ydC9FbnVtKSxcbiAgLy8gYW5kIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtVGVzdCBwaW5zIHRoZSB0YWJsZSBib3RoIHNpZGVzIG11c3QgcHJvZHVjZS5cbiAgcHJpdmF0ZSBfcmVsYXRpdmVSYW5nZShyZWxhdGl2ZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICBjb25zdCBub3cgPSBnZXRab25lZE5vdyh0aGlzLnRpbWV6b25lKCkpO1xuXG4gICAgc3dpdGNoIChyZWxhdGl2ZSkge1xuICAgICAgLy8gQSBjYWxlbmRhciB3ZWVrLCBNb25kYXkgdG8gU3VuZGF5IChSRVBPUlRfV0VFS19TVEFSVFNfT04sIHRoZSBzYW1lIHdlZWtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIncyB3ZWVrbHkgYnVja2V0cyB1c2UpLCBpbiB3aG9sZSBkYXlzIOKAlCBub3QgdGhlIHJvbGxpbmdcbiAgICAgIC8vIHNldmVuIGRheXMgYGxhc3Q3RGF5c2AgZ2l2ZXMsIHdoaWNoIG5ldmVyIGxpbmVzIHVwIHdpdGggdGhlIHdlZWsgYVxuICAgICAgLy8gcGFydG5lciBoYXMgYWxyZWFkeSBiZWVuIHNlbnQuIGBsYXN0V2Vla2AgaXMgdGhlIG9uZSBhIHdlZWtseSByZXBvcnRcbiAgICAgIC8vIHdhbnRzOiBpdCBlbmRzIG9uIHRoZSBwcmV2aW91cyB3ZWVrJ3MgU3VuZGF5IHJhdGhlciB0aGFuIGF0IGBub3dgLFxuICAgICAgLy8gYmVjYXVzZSB0aGUgd2VlayBpdCBuYW1lcyBoYXMgY2xvc2VkLiBgdGhpc1dlZWtgIGZvbGxvd3MgZXZlcnkgb3RoZXJcbiAgICAgIC8vIHByZXNldCBoZXJlIGFuZCBydW5zIHVwIHRvIG5vdywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IGEgcGFydC1maW5pc2hlZFxuICAgICAgLy8gd2VlayAob24gYSBTdW5kYXkgaXQgaXMgdGhlIHdob2xlIE1vbmRheS10by1TdW5kYXkgd2VlaykuXG4gICAgICBjYXNlICd0aGlzV2Vlayc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mV2Vlayhub3csIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0V2Vlayc6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBzdWJXZWVrcyhub3csIDEpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZXZWVrKHByZXZpb3VzLCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLFxuICAgICAgICAgIGVuZDogZW5kT2ZXZWVrKHByZXZpb3VzLCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDdEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCA3KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzMERheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDMwKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QzTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDMpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDZNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgNiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MTJNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMTIpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc01vbnRoJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZNb250aChub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1F1YXJ0ZXInOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlF1YXJ0ZXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNZZWFyJzpcbiAgICAgIGNhc2UgJ3llYXJUb0RhdGUnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZlllYXIobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV2ZXJ5IGdyb3VwIGluIGl0cyBzdG9yZWQgc2hhcGU6IG51bGwgd2hlbiBpdCBob2xkcyBub3RoaW5nLCBhIGRlZmF1bHRcbiAgLy8gdGhlIHZpZXdlciBjbGVhcmVkIGluY2x1ZGVkLlxuICBwcml2YXRlIF9zbmFwc2hvdEdyb3VwcygpOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBzOiBSZWNvcmQ8bnVtYmVyLCBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsPiA9IHt9O1xuXG4gICAgdGhpcy5fZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgICBncm91cHNbZ3JvdXAuaWRdID0gdGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRvU3RvcmVkR3JvdXBWYWx1ZShncm91cC50eXBlLCB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG5cbiAgLy8gRWFjaCB0aWxlJ3Mgc3RhdGUgd2hlcmUgaXQgZGlmZmVycyBmcm9tIHRoZSBhdXRob3JlZCB0aWxlLiBBIGxpc3Qgc29ydFxuICAvLyB0aGF0IGlzIHRoZSBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyBpdHMgZGVmYXVsdCwgbm90IGEgY2hvaWNlLlxuICBwcml2YXRlIF9zbmFwc2hvdFRpbGVzKCk6IFJlY29yZDxudW1iZXIsIFJlcG9ydFRpbGVTdGF0ZT4ge1xuICAgIGNvbnN0IHRpbGVzOiBSZWNvcmQ8bnVtYmVyLCBSZXBvcnRUaWxlU3RhdGU+ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLl90aWxlcygpKSB7XG4gICAgICBjb25zdCB0aWxlOiBSZXBvcnRUaWxlU3RhdGUgPSB7fTtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGRyaWxsID0gdGhpcy5kcmlsbChjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgICB0aWxlLnNvcnQgPSB7IC4uLnNvcnQgfTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgdGlsZS5zZWFyY2ggPSBzZWFyY2g7XG4gICAgICB9XG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmhpZGRlbiA9IFsuLi5oaWRkZW5dO1xuICAgICAgfVxuICAgICAgaWYgKGRyaWxsLmxlbmd0aCkge1xuICAgICAgICB0aWxlLmRyaWxsID0gZHJpbGwubWFwKChzdGVwKSA9PiAoeyAuLi5zdGVwIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKE9iamVjdC5rZXlzKHRpbGUpLmxlbmd0aCkge1xuICAgICAgICB0aWxlc1tjb21wb25lbnQuaWRdID0gdGlsZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGlsZXM7XG4gIH1cblxuICAvLyBBIGdyb3VwIGJhY2sgYXQgaXRzIGF1dGhvcmVkIGRlZmF1bHQuXG4gIHByaXZhdGUgX3NlZWRBdXRob3JlZChncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXAuaWQsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgdGlsZSBiYWNrIGF0IGl0cyBhdXRob3JlZCBzdGF0ZS5cbiAgcHJpdmF0ZSBfY2xlYXJUaWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9saXN0U29ydHMuY2xlYXIoKTtcbiAgICB0aGlzLl9saXN0U2VhcmNoZXMuY2xlYXIoKTtcbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KG5ldyBNYXAoKSk7XG4gICAgdGhpcy5fZHJpbGxzLnNldChuZXcgTWFwKCkpO1xuICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChuZXcgTWFwKCkpO1xuICAgIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycy5zZXQobmV3IE1hcCgpKTtcbiAgfVxuXG4gIC8vIHNldEdyaWRMYXlvdXQoKSB3aXRob3V0IHRoZSBjaGFuZ2UgZXZlbnQ7IHRydWUgd2hlbiB0aGUgbGF5b3V0IGNoYW5nZWQuXG4gIHByaXZhdGUgX3B1dEdyaWRMYXlvdXQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxheW91dDogR3JpZExheW91dCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJhc2UgPSBncmlkTGF5b3V0S2V5KGF1dGhvcmVkR3JpZExheW91dChjb21wb25lbnQpKTtcbiAgICBjb25zdCBrZXkgPSBncmlkTGF5b3V0S2V5KGxheW91dCk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2dyaWRMYXlvdXRzKCkuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgY29uc3QgdW5jaGFuZ2VkID0ga2V5ID09PSBiYXNlXG4gICAgICA/ICFjdXJyZW50XG4gICAgICA6IGN1cnJlbnQ/LmJhc2UgPT09IGJhc2UgJiYgZ3JpZExheW91dEtleShjdXJyZW50LmxheW91dCkgPT09IGtleTtcblxuICAgIGlmIChjb21wb25lbnQudHlwZSAhPT0gJ2dyaWQnIHx8IHVuY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMuX2dyaWRMYXlvdXRzKCkpO1xuXG4gICAgaWYgKGtleSA9PT0gYmFzZSkge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50LmlkLCB7IGxheW91dCwgYmFzZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9ncmlkTGF5b3V0cy5zZXQobmV4dCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRhYmxlIHRoYXQgZm9sbG93cyB0aGUgZ3JvdXAtYnkgKGZvbGxvd3NHcm91cEJ5KSwgaXRzIGNvbHVtbiBmaWx0ZXJcbiAgLy8gb24gdGhlIGdyb3VwLWJ5J3MgZmllbGQgbW92ZWQgdG8gdGhlIGdyYWluIGl0IG5vdyByZWFkcyBhdDogdGhlIHZpZXdlcidzXG4gIC8vIHBpY2ssIGVsc2UgdGhlIHRhYmxlJ3Mgb3duIChncmFpbmVkR3JpZExheW91dCgpKS4gVGFibGVzIG9uIG90aGVyIHBhZ2VzXG4gIC8vIG1vdmUgdG9vLCBzbyB0aGVpciBmaWxlcywgdGhlIGNoYXQgYW5kIHRoZWlyIG5leHQgcGFpbnQgcmVhZCB0aGUgbW92ZWRcbiAgLy8gZmlsdGVyLiBBIGZpbHRlciB0YWtlbiBvdXQgaXMgbm90ZWQgb24gaXRzIHRpbGUgKGdyaWRDbGVhcmVkRmlsdGVyKCkpOyBhXG4gIC8vIG5vdGUgYWxyZWFkeSB0aGVyZSBuYW1lcyB0aGUgbmV3IGdyYWluLCB1bmxlc3MgdGhlIGZpZWxkIGlzIGZpbHRlcmVkXG4gIC8vIGFnYWluLCB3aGljaCBlbmRzIGl0LlxuICBwcml2YXRlIF9ncmFpbkdyaWRMYXlvdXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNsZWFyZWQgPSBuZXcgTWFwKHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycygpKTtcblxuICAgIHRoaXMuX3RpbGVzKCkuZm9yRWFjaCgoY29tcG9uZW50KSA9PiB7XG4gICAgICBjb25zdCBncm91cEJ5ID0gY29tcG9uZW50LnR5cGUgPT09ICdncmlkJyA/IGNvbXBvbmVudC5mb2xsb3dzR3JvdXBCeSA6IG51bGw7XG4gICAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuX2ZyZXF1ZW5jeSA/PyBncm91cEJ5Py5ncmFudWxhcml0eTtcbiAgICAgIGlmICghZ3JvdXBCeSB8fCAhZ3JhbnVsYXJpdHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBncmFpbmVkID0gZ3JhaW5lZEdyaWRMYXlvdXQodGhpcy5ncmlkTGF5b3V0KGNvbXBvbmVudCksIGdyb3VwQnkuZmllbGQsIGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gKGdyYWluZWQubGF5b3V0LmZpbHRlcnMgPz8gW10pLnNvbWUoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkID09PSBncm91cEJ5LmZpZWxkKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBncmFpbmVkLmNsZWFyZWQgPz8gKGZpbHRlcmVkID8gbnVsbCA6IGNsZWFyZWQuZ2V0KGNvbXBvbmVudC5pZCkpO1xuICAgICAgaWYgKG5vdGUpIHtcbiAgICAgICAgY2xlYXJlZC5zZXQoY29tcG9uZW50LmlkLCB7IC4uLm5vdGUsIGdyYW51bGFyaXR5OiBHUklEX0dSQU5VTEFSSVRJRVNbZ3JhbnVsYXJpdHldIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYXJlZC5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHV0R3JpZExheW91dChjb21wb25lbnQsIGdyYWluZWQubGF5b3V0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycy5zZXQoY2xlYXJlZCk7XG4gIH1cblxuICAvLyBPbmUgY2hhcnQncyBkcmlsbCBwYXRoOyBhbiBlbXB0eSBwYXRoIGlzIHRoZSBjaGFydCdzIHRvcC5cbiAgcHJpdmF0ZSBfc2V0RHJpbGxQYXRoKGNvbXBvbmVudElkOiBudW1iZXIsIHBhdGg6IHJlYWRvbmx5IFJlcG9ydERyaWxsU3RlcFtdKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5fZHJpbGxzKCkpO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgcGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kcmlsbHMuc2V0KG5leHQpO1xuICB9XG5cbiAgLy8gQWZ0ZXIgcmVzZXRUb0RlZmF1bHRzKCk6IGV2ZXJ5IGJhciBhbmQgdGlsZSByZXBhaW50cywgYW5kIHRoZSB0aWxlcyB0aGF0XG4gIC8vIGZvbGxvdyB0aGUgZ3JvdXAtYnkgcmVmZXRjaCB3aGVuIHRoZSBncmFpbiBtb3ZlZC5cbiAgcHJpdmF0ZSBfbm90aWZ5UmVzZXQoZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXRlVmVyc2lvbi51cGRhdGUoKHZlcnNpb24pID0+IHZlcnNpb24gKyAxKTtcbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KG51bGwpO1xuXG4gICAgaWYgKGZyZXF1ZW5jeSAhPT0gdGhpcy5fZnJlcXVlbmN5KSB7XG4gICAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGlsZXMgb2YgdGhlIHJlcG9ydCBpbml0KCkgbGFzdCByZWFkLlxuICBwcml2YXRlIF90aWxlcygpOiBSZXBvcnRDb21wb25lbnRbXSB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fcmVwb3J0KCk7XG5cbiAgICByZXR1cm4gcmVwb3J0XG4gICAgICA/IHJlcG9ydENvbXBvbmVudHMocmVwb3J0KS5maWx0ZXIoaXNUaWxlKVxuICAgICAgOiBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ2hhcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl90aWxlcygpXG4gICAgICAuc29tZSgoY29tcG9uZW50KSA9PiBjb21wb25lbnQuaWQgPT09IGNvbXBvbmVudElkICYmIGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnKTtcbiAgfVxuXG4gIC8vIERyb3BzIGVhY2ggdGFibGUgbGF5b3V0IGFuZCBleHBhbnNpb24gd2hvc2UgdGlsZSBpcyBnb25lIG9yIGlzIG5vIHRhYmxlXG4gIC8vIGFueSBtb3JlLiBBIGxheW91dCB3aG9zZSB0aWxlIGlzIG5vdyBhdXRob3JlZCBvdGhlcndpc2UgKGFuIGVkaXQsIHRoZVxuICAvLyBhZ2VudCdzKSBtb3ZlcyBvbnRvIHRoZSBuZXcgYXV0aG9yZWQgbGF5b3V0LCBrZWVwaW5nIHRoZSB2aWV3ZXIncyBmaWx0ZXJzXG4gIC8vIGFuZCBzb3J0IHRlcm1zIG9uIGZpZWxkcyBpdCBzdGlsbCBwbGFjZXMgKHJlYmFzZWRHcmlkTGF5b3V0KSwgc28gdGhlIHRpbGVcbiAgLy8gc2hvd3MgYm90aCBjaGFuZ2VzOyBvbmUgdGhhdCB0aGVuIGRyYXdzIHRoZSBhdXRob3JlZCBsYXlvdXQgaXMgZHJvcHBlZC5cbiAgcHJpdmF0ZSBfcHJ1bmVHcmlkTGF5b3V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBncmlkcyA9IG5ldyBNYXAodGhpcy5fdGlsZXMoKVxuICAgICAgLmZpbHRlcigoY29tcG9uZW50KSA9PiBjb21wb25lbnQudHlwZSA9PT0gJ2dyaWQnKVxuICAgICAgLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG4gICAgY29uc3Qga2VwdCA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRHcmlkU2Vzc2lvbkxheW91dD4oKTtcblxuICAgIHRoaXMuX2dyaWRMYXlvdXRzKCkuZm9yRWFjaCgoc2Vzc2lvbiwgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdyaWRzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcmVkID0gYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCk7XG4gICAgICBjb25zdCBiYXNlID0gZ3JpZExheW91dEtleShhdXRob3JlZCk7XG4gICAgICBjb25zdCBsYXlvdXQgPSBzZXNzaW9uLmJhc2UgPT09IGJhc2UgPyBzZXNzaW9uLmxheW91dCA6IHJlYmFzZWRHcmlkTGF5b3V0KHNlc3Npb24ubGF5b3V0LCBzZXNzaW9uLmJhc2UsIGF1dGhvcmVkKTtcblxuICAgICAgaWYgKGdyaWRMYXlvdXRLZXkobGF5b3V0KSAhPT0gYmFzZSkge1xuICAgICAgICBrZXB0LnNldChjb21wb25lbnRJZCwgeyBsYXlvdXQsIGJhc2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9ncmlkTGF5b3V0cy5zZXQoa2VwdCk7XG4gICAgdGhpcy5fZ3JpZEV4cGFuc2lvbnMuc2V0KG5ldyBNYXAoWy4uLnRoaXMuX2dyaWRFeHBhbnNpb25zKCldXG4gICAgICAuZmlsdGVyKChbY29tcG9uZW50SWRdKSA9PiBncmlkcy5oYXMoY29tcG9uZW50SWQpKSkpO1xuICAgIHRoaXMuX2dyaWRDbGVhcmVkRmlsdGVycy5zZXQobmV3IE1hcChbLi4udGhpcy5fZ3JpZENsZWFyZWRGaWx0ZXJzKCldXG4gICAgICAuZmlsdGVyKChbY29tcG9uZW50SWRdKSA9PiBncmlkcy5oYXMoY29tcG9uZW50SWQpKSkpO1xuICB9XG5cbiAgLy8gS2VlcHMgdGhlIHBhZ2UsIGRyaWxsIGFuZCB0YWJsZSBzdGF0ZSB0byB3aGF0IHRoZSByZXBvcnQgKHJlKWxvYWRlZCBieVxuICAvLyBpbml0KCkgc3RpbGwgaGFzOiBkcmlsbCBwYXRocyBvbiBjaGFydHMgaXQgc3RpbGwgaGFzLCB0aGUgcGFnZSB3aGlsZSBpdFxuICAvLyBoYXMgaXQsIGFuZCBlYWNoIHRhYmxlJ3MgbGF5b3V0IGFuZCBvcGVuIGdyb3VwcyB3aGlsZSBpdCBpcyBzdGlsbCBhIHRhYmxlXG4gIC8vIChfcHJ1bmVHcmlkTGF5b3V0cykuIE9uIGFub3RoZXIgcmVwb3J0IGl0IHN0YXJ0cyBhZ2FpbjogbWF0Y2ggJ2FsbCcsIG5vXG4gIC8vIGRyaWxsLCBldmVyeSB0YWJsZSBhcyBhdXRob3JlZCBhbmQgY2xvc2VkLCBhbmQgbm90aGluZyB0ZW1wb3JhcnkuXG4gIHByaXZhdGUgX3BydW5lUGFnZVN0YXRlKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JlcG9ydCgpPy5pZCAhPT0gcmVwb3J0LmlkKSB7XG4gICAgICB0aGlzLl9tYXRjaC5zZXQoJ2FsbCcpO1xuICAgICAgdGhpcy5fcGFnZUlkLnNldChudWxsKTtcbiAgICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcCgpKTtcbiAgICAgIHRoaXMuX2dyaWRMYXlvdXRzLnNldChuZXcgTWFwKCkpO1xuICAgICAgdGhpcy5fZ3JpZEV4cGFuc2lvbnMuc2V0KG5ldyBNYXAoKSk7XG4gICAgICB0aGlzLl9ncmlkQ2xlYXJlZEZpbHRlcnMuc2V0KG5ldyBNYXAoKSk7XG4gICAgICB0aGlzLl90ZW1wb3Jhcnkuc2V0KGVtcHR5VGVtcG9yYXJ5U3RhdGUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVwb3J0LnNldChyZXBvcnQpO1xuICAgIHRoaXMuX2RyaWxscy5zZXQobmV3IE1hcChbLi4udGhpcy5fZHJpbGxzKCldXG4gICAgICAuZmlsdGVyKChbY29tcG9uZW50SWRdKSA9PiB0aGlzLl9pc0NoYXJ0KGNvbXBvbmVudElkKSkpKTtcbiAgICB0aGlzLl9wcnVuZUdyaWRMYXlvdXRzKCk7XG4gICAgLy8gQSB0YWJsZSB0aGUgcmVwb3J0IG5vdyBhdXRob3JzIG90aGVyd2lzZSByZWFkcyBhdCB0aGUgZ3JhaW4gb24gc2NyZWVuLlxuICAgIHRoaXMuX2dyYWluR3JpZExheW91dHMoKTtcblxuICAgIGlmICh0aGlzLl9wYWdlSWQoKSAmJiAhKHJlcG9ydC5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gcGFnZS5pZCA9PT0gdGhpcy5fcGFnZUlkKCkpKSB7XG4gICAgICB0aGlzLl9wYWdlSWQuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgc2VsZWN0J3MgdmFsdWVzIHRvIGxlYXZlIG91dCAob25seSB3aGVuIGl0IGtlZXBzIG5vbmUpIGFuZCBhIG51bWJlclxuICAvLyByYW5nZSdzIGVuZHMsIGFuIG9wZW4gZW5kIGxlZnQgb3V0IGFuZCAwIGtlcHQsIHdyaXR0ZW4gb250byBgZmllbGRzYC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZUV4Y2x1ZGVBbmRSYW5nZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSwgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aCAmJiAhZmllbGRzLnZhbHVlcykge1xuICAgICAgZmllbGRzLmV4Y2x1ZGVWYWx1ZXMgPSB2YWx1ZS5leGNsdWRlVmFsdWVzO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbiA9IGZpbml0ZU51bWJlcih2YWx1ZS5taW4pO1xuICAgIGNvbnN0IG1heCA9IGZpbml0ZU51bWJlcih2YWx1ZS5tYXgpO1xuXG4gICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWVsZHMubWluID0gbWluO1xuICAgIH1cbiAgICBpZiAobWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpZWxkcy5tYXggPSBtYXg7XG4gICAgfVxuICB9XG5cbiAgLy8gQW4gYXV0aG9yZWQgZGVmYXVsdCB0aGF0IGxlYXZlcyBzZWxlY3QgdmFsdWVzIG91dCwgb3IgYSBudW1iZXIgcmFuZ2Unc1xuICAvLyBlbmRzICgwIGtlcHQpLCBhcyBhIHNlc3Npb24gdmFsdWU7IG51bGwgd2hlbiBpdCBob2xkcyBuZWl0aGVyLlxuICBwcml2YXRlIF9leGNsdWRlT3JSYW5nZURlZmF1bHQoZ3JvdXBEZWZhdWx0OiBGaWx0ZXJHcm91cERlZmF1bHQpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gICAgaWYgKGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGV4Y2x1ZGVWYWx1ZXM6IGdyb3VwRGVmYXVsdC5leGNsdWRlVmFsdWVzIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWluID0gZmluaXRlTnVtYmVyKGdyb3VwRGVmYXVsdC5taW4pO1xuICAgIGNvbnN0IG1heCA9IGZpbml0ZU51bWJlcihncm91cERlZmF1bHQubWF4KTtcblxuICAgIGlmIChtaW4gPT09IHVuZGVmaW5lZCAmJiBtYXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihtaW4gIT09IHVuZGVmaW5lZCA/IHsgbWluIH0gOiB7fSksXG4gICAgICAuLi4obWF4ICE9PSB1bmRlZmluZWQgPyB7IG1heCB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBDb3VudHMgYSByZXNldCBmb3IgZWFjaCBsaXN0IHdob3NlIHNvcnQgaXMgbm90IHRoZSBvbmUgaXQgaGFkIChgYmVmb3JlYCxcbiAgLy8gdGhlIHNvcnRzIGJ5IGxpc3QgYmVmb3JlIHRoZSByZXNldCkuIEEgc29ydCBhIGxpc3QgbG9zdCBhbmQgb25lIGl0XG4gIC8vIGdhaW5lZCBib3RoIGNvdW50OyB0aGUgYXV0aG9yZWQgc29ydCBpcyBubyBlbnRyeSBlaXRoZXIgc2lkZS5cbiAgcHJpdmF0ZSBfY291bnRTb3J0UmVzZXRzKGJlZm9yZTogUmVhZG9ubHlNYXA8bnVtYmVyLCBSZXBvcnRTb3J0Pik6IHZvaWQge1xuICAgIGNvbnN0IG1vdmVkID0gWy4uLm5ldyBTZXQoWy4uLmJlZm9yZS5rZXlzKCksIC4uLnRoaXMuX2xpc3RTb3J0cy5rZXlzKCldKV1cbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgIGNvbnN0IHdhcyA9IGJlZm9yZS5nZXQoY29tcG9uZW50SWQpO1xuICAgICAgICBjb25zdCBub3cgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuXG4gICAgICAgIHJldHVybiB3YXMgPyAhc2FtZVNvcnQod2FzLCBub3cpIDogbm93ICE9PSBudWxsO1xuICAgICAgfSk7XG5cbiAgICBpZiAoIW1vdmVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50cyA9IG5ldyBNYXAodGhpcy5fbGlzdFNvcnRSZXNldHMoKSk7XG4gICAgbW92ZWQuZm9yRWFjaCgoY29tcG9uZW50SWQpID0+IGNvdW50cy5zZXQoY29tcG9uZW50SWQsIChjb3VudHMuZ2V0KGNvbXBvbmVudElkKSA/PyAwKSArIDEpKTtcbiAgICB0aGlzLl9saXN0U29ydFJlc2V0cy5zZXQoY291bnRzKTtcbiAgfVxufVxuIl19