@firestitch/report 18.21.1 → 18.21.2

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.
@@ -7,7 +7,7 @@ import * as i0 from "@angular/core";
7
7
  export declare class ComponentGridComponent implements OnInit {
8
8
  readonly reportId: import("@angular/core").InputSignal<number>;
9
9
  readonly component: import("@angular/core").InputSignal<ReportComponent>;
10
- readonly params: import("@angular/core").WritableSignal<ReportGridParams>;
10
+ readonly params: import("@angular/core").Signal<ReportGridParams>;
11
11
  readonly controls: import("@angular/core").Signal<import("@firestitch/grid").GridControls>;
12
12
  readonly source: import("@angular/core").Signal<ReportGridSource>;
13
13
  readonly layout: import("@angular/core").Signal<GridLayout>;
@@ -24,6 +24,7 @@ export declare class ComponentGridComponent implements OnInit {
24
24
  private _isPruned;
25
25
  private _paramsVersion;
26
26
  private _reportLoads;
27
+ private readonly _paramsRead;
27
28
  ngOnInit(): void;
28
29
  setLayout(layout: GridLayout): void;
29
30
  setExpansion(expansion: GridExpansion | undefined): void;
@@ -75,7 +75,7 @@ export declare class ReportFilterStateService {
75
75
  changes(): Observable<void>;
76
76
  isFilterDisabled(filterId: number): boolean;
77
77
  toggleFilter(filterId: number, groupId: number): void;
78
- changesFor(component: ReportComponent): Observable<number | null>;
78
+ changesFor(component: () => ReportComponent): Observable<number | null>;
79
79
  changesForAny(components: () => ReportComponent[]): Observable<number>;
80
80
  resolveForComponent(component: ReportComponent): ResolvedFilterValue[];
81
81
  viewerFilters(): ReportChatViewerFilter[];
@@ -24,9 +24,14 @@ import * as i0 from "@angular/core";
24
24
  // re-init the filter state) reads the table again at once, even when its
25
25
  // filters did not move: the rows behind it, or its own query, may have.
26
26
  // The load is counted into the params (reportLoads), since fs-grid reads
27
- // only when they move. The new params land in the same tick as the
28
- // reloaded tile, so a load that also moves the authored layout costs one
29
- // read.
27
+ // only when they move. The params are derived from the tile as it is
28
+ // drawn (params), so the read of a load carries the filters the load
29
+ // brought, a filter added since the report opened included, and lands in
30
+ // the same tick as the reloaded tile: a load that also moves the authored
31
+ // layout costs one read.
32
+ // - Which filter groups and whether the group-by reach the tile is read
33
+ // from the tile as it stands at each change, never as it was drawn: a
34
+ // filter added while the report is open reads on its first pick.
30
35
  // - The layout on screen is the state service's (gridLayout): the viewer's
31
36
  // own while they changed it from the layout authored now, else the
32
37
  // authored one. It outlives a page switch, and the chat reads it. So do
@@ -50,7 +55,16 @@ import * as i0 from "@angular/core";
50
55
  export class ComponentGridComponent {
51
56
  reportId = input.required();
52
57
  component = input.required();
53
- params = signal(null);
58
+ // What fs-grid reads with: the tile's params (_readParams) for the
59
+ // component drawn now, read again at each settled change (_paramsRead).
60
+ // A load re-inits the filter state a tick before the tile gets the
61
+ // component it brought, so deriving them here is what puts a filter added
62
+ // by that load into its read.
63
+ params = computed(() => {
64
+ const component = this.component();
65
+ this._paramsRead();
66
+ return untracked(() => this._readParams(component));
67
+ });
54
68
  controls = computed(() => this.component().config?.controls ?? {});
55
69
  source = computed(() => new ReportGridSource(this._reportData, this.reportId(), this._componentId(), {
56
70
  locale: () => this._filterState.formatContext().locale,
@@ -77,6 +91,8 @@ export class ComponentGridComponent {
77
91
  _paramsVersion = 0;
78
92
  // The report loads seen since the tile was drawn (ReportGridParams).
79
93
  _reportLoads = 0;
94
+ // Moves each time a settled change has the params read again.
95
+ _paramsRead = signal(0);
80
96
  ngOnInit() {
81
97
  this.expansion.set(this._filterState.gridExpansion(this.component()));
82
98
  this._init();
@@ -90,16 +106,14 @@ export class ComponentGridComponent {
90
106
  }
91
107
  _init() {
92
108
  this._paramsVersion = this._filterState.stateVersion();
93
- this.params.set(this._readParams());
94
109
  // A null group is a full re-init: a report load, or a reset.
95
- this._filterState.changesFor(this.component())
110
+ this._filterState.changesFor(this.component)
96
111
  .pipe(switchMap((groupId) => this._settled$(groupId === null)), tap((isLoad) => this._applyParams(isLoad)), takeUntilDestroyed(this._destroyRef))
97
112
  .subscribe();
98
- if (followsGroupBy(this.component())) {
99
- this._filterState.frequencyChanges()
100
- .pipe(takeUntilDestroyed(this._destroyRef))
101
- .subscribe(() => this._applyParams());
102
- }
113
+ // A load can make the table follow the group-by, or stop.
114
+ this._filterState.frequencyChanges()
115
+ .pipe(filter(() => followsGroupBy(this.component())), tap(() => this._applyParams()), takeUntilDestroyed(this._destroyRef))
116
+ .subscribe();
103
117
  }
104
118
  // Once the tile's first read is in, its notes prune the viewer's layout
105
119
  // (prunedGridLayout). A tile showing its authored layout has nothing to
@@ -140,12 +154,11 @@ export class ComponentGridComponent {
140
154
  this._reportLoads++;
141
155
  }
142
156
  this._paramsVersion = this._filterState.stateVersion();
143
- this.params.set(this._readParams());
157
+ this._paramsRead.update((count) => count + 1);
144
158
  }
145
159
  // The tile's report filters, 'any' groups and group-by grain as they stand
146
160
  // (tileState()), and the report loads it has seen.
147
- _readParams() {
148
- const component = this.component();
161
+ _readParams(component) {
149
162
  const { matchAnyGroupIds, frequency } = this._filterState.tileState(component);
150
163
  return {
151
164
  filters: this._filterState.resolveForComponent(component),
@@ -155,7 +168,7 @@ export class ComponentGridComponent {
155
168
  };
156
169
  }
157
170
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
158
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentGridComponent, isStandalone: true, selector: "app-report-component-grid", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: true, transformFunction: null }, component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <!-- A cell that says why (a missing or zero prior) opens it on a\n click; no cell carries a native tooltip. -->\n @if (shown.title) {\n <span\n class=\"explained\"\n fsPopover\n trigger=\"click\"\n [template]=\"explanation\"\n [indication]=\"false\"\n [maxWidth]=\"320\">\n {{ shown.text }}\n </span>\n <ng-template #explanation>{{ shown.title }}</ng-template>\n } @else {\n <span>{{ shown.text }}</span>\n }\n }\n </ng-template>\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}.explained{cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}\n"], dependencies: [{ kind: "component", type: FsGridComponent, selector: "fs-grid", inputs: ["source", "layout", "controls", "params", "expansion", "panel", "editorOpen", "formatter", "clearedFilter"], outputs: ["layoutChange", "expansionChange", "panelChange", "editorOpenChange"] }, { kind: "directive", type: FsGridCellDirective, selector: "[fsGridCell]" }, { kind: "directive", type: FsPopoverDirective, selector: "[fsPopover]", inputs: ["text", "template", "data", "leaveDelay", "showDelay", "maxWidth", "maxHeight", "wrapperClass", "autoShow", "autoClose", "loadingDiameter", "loading", "indication", "position", "theme", "size", "trigger", "enabled", "panel"], outputs: ["closed"], exportAs: ["fsPopover"] }, { kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "pipe", type: ReportGridCellPipe, name: "fsReportGridCell" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
171
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentGridComponent, isStandalone: true, selector: "app-report-component-grid", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: true, transformFunction: null }, component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are read from the tile drawn (params), from its first\n render on, so every read carries the tile's report filters. -->\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params()\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <!-- A cell that says why (a missing or zero prior) opens it on a\n click; no cell carries a native tooltip. -->\n @if (shown.title) {\n <span\n class=\"explained\"\n fsPopover\n trigger=\"click\"\n [template]=\"explanation\"\n [indication]=\"false\"\n [maxWidth]=\"320\">\n {{ shown.text }}\n </span>\n <ng-template #explanation>{{ shown.title }}</ng-template>\n } @else {\n <span>{{ shown.text }}</span>\n }\n }\n </ng-template>\n </fs-grid>\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}.explained{cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}\n"], dependencies: [{ kind: "component", type: FsGridComponent, selector: "fs-grid", inputs: ["source", "layout", "controls", "params", "expansion", "panel", "editorOpen", "formatter", "clearedFilter"], outputs: ["layoutChange", "expansionChange", "panelChange", "editorOpenChange"] }, { kind: "directive", type: FsGridCellDirective, selector: "[fsGridCell]" }, { kind: "directive", type: FsPopoverDirective, selector: "[fsPopover]", inputs: ["text", "template", "data", "leaveDelay", "showDelay", "maxWidth", "maxHeight", "wrapperClass", "autoShow", "autoClose", "loadingDiameter", "loading", "indication", "position", "theme", "size", "trigger", "enabled", "panel"], outputs: ["closed"], exportAs: ["fsPopover"] }, { kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "pipe", type: ReportGridCellPipe, name: "fsReportGridCell" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
159
172
  }
160
173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentGridComponent, decorators: [{
161
174
  type: Component,
@@ -165,6 +178,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
165
178
  FsPopoverDirective,
166
179
  ComponentNoteComponent,
167
180
  ReportGridCellPipe,
168
- ], template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <!-- A cell that says why (a missing or zero prior) opens it on a\n click; no cell carries a native tooltip. -->\n @if (shown.title) {\n <span\n class=\"explained\"\n fsPopover\n trigger=\"click\"\n [template]=\"explanation\"\n [indication]=\"false\"\n [maxWidth]=\"320\">\n {{ shown.text }}\n </span>\n <ng-template #explanation>{{ shown.title }}</ng-template>\n } @else {\n <span>{{ shown.text }}</span>\n }\n }\n </ng-template>\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}.explained{cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}\n"] }]
181
+ ], template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are read from the tile drawn (params), from its first\n render on, so every read carries the tile's report filters. -->\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params()\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <!-- A cell that says why (a missing or zero prior) opens it on a\n click; no cell carries a native tooltip. -->\n @if (shown.title) {\n <span\n class=\"explained\"\n fsPopover\n trigger=\"click\"\n [template]=\"explanation\"\n [indication]=\"false\"\n [maxWidth]=\"320\">\n {{ shown.text }}\n </span>\n <ng-template #explanation>{{ shown.title }}</ng-template>\n } @else {\n <span>{{ shown.text }}</span>\n }\n }\n </ng-template>\n </fs-grid>\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}.explained{cursor:pointer;text-decoration:underline dotted;text-underline-offset:2px}\n"] }]
169
182
  }] });
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxHQUNySCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUF1QyxNQUFNLGtCQUFrQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE9BQU8sRUFBYyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFB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bkMsSUFBSSxXQUNQO3dCQUNQLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixrQkFBa0I7d0JBQ2xCLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3FCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIEluamVjdG9yLCBPbkluaXQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCwgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgRnNHcmlkQ2VsbERpcmVjdGl2ZSwgRnNHcmlkQ29tcG9uZW50LCBHcmlkRXhwYW5zaW9uLCBHcmlkTGF5b3V0LCBHcmlkTm90ZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2dyaWQnO1xuaW1wb3J0IHsgRnNQb3BvdmVyRGlyZWN0aXZlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcG9wb3Zlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZpbHRlciwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YXAsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydEdyaWRTb3VyY2UgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC1ncmlkLXNvdXJjZSc7XG5pbXBvcnQgeyBmb2xsb3dzR3JvdXBCeSB9IGZyb20gJy4uLy4uL2dyb3VwLWJ5JztcbmltcG9ydCB7IFJlcG9ydEdyaWRQYXJhbXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1ncmlkLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGF1dGhvcmVkR3JpZExheW91dCwgcHJ1bmVkR3JpZExheW91dCB9IGZyb20gJy4uLy4uL3JlcG9ydC1ncmlkLWxheW91dCc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TIH0gZnJvbSAnLi4vLi4vdGlsZS1sb2Fkcyc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuaW1wb3J0IHsgUmVwb3J0R3JpZENlbGxQaXBlIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1jZWxsLnBpcGUnO1xuaW1wb3J0IHsgcmVwb3J0R3JpZEZvcm1hdHRlciB9IGZyb20gJy4vcmVwb3J0LWdyaWQtZm9ybWF0dGVyJztcblxuXG4vLyBBIGdyaWQgdGlsZTogZnMtZ3JpZCBvdmVyIHRoZSB0aWxlJ3Mgcm93cywgcmVhZCB0aHJvdWdoIFJlcG9ydEdyaWRTb3VyY2UuXG4vL1xuLy8gLSBUaGUgcGFyYW1zICh0aGUgcmVwb3J0IGZpbHRlcnMgdGhlIHRpbGUgcmVzb2x2ZXMgdG8gYW5kIHRoZSAnYW55J1xuLy8gICBncm91cHMpIGFyZSBzZWVkZWQgYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHNvIG5vIHJlYWQgZ29lcyBvdXQgd2l0aG91dFxuLy8gICB0aGVtLiBBZnRlciB0aGF0IGEgY2hhbmdlIHRvIG9uZSBvZiB0aGUgdGlsZSdzIGZpbHRlciBncm91cHMgc2V0dGxlcyBmb3Jcbi8vICAgVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TLCBzbyBhIHN3ZWVwIG9mIGNoYW5nZXMgY29zdHMgb25lIHJlYWQ7IG9uZSBzZW50XG4vLyAgIHVuZGVyIGFuIG9sZGVyIHN0YXRlIHZlcnNpb24gaXMgZHJvcHBlZC5cbi8vIC0gQSByZXBvcnQgbG9hZCAoYSBSZWZyZXNoLCBhIGNoYXQgZWRpdCwgYSBzZXR0aW5ncyBzYXZlLCBhbGwgb2Ygd2hpY2hcbi8vICAgcmUtaW5pdCB0aGUgZmlsdGVyIHN0YXRlKSByZWFkcyB0aGUgdGFibGUgYWdhaW4gYXQgb25jZSwgZXZlbiB3aGVuIGl0c1xuLy8gICBmaWx0ZXJzIGRpZCBub3QgbW92ZTogdGhlIHJvd3MgYmVoaW5kIGl0LCBvciBpdHMgb3duIHF1ZXJ5LCBtYXkgaGF2ZS5cbi8vICAgVGhlIGxvYWQgaXMgY291bnRlZCBpbnRvIHRoZSBwYXJhbXMgKHJlcG9ydExvYWRzKSwgc2luY2UgZnMtZ3JpZCByZWFkc1xuLy8gICBvbmx5IHdoZW4gdGhleSBtb3ZlLiBUaGUgbmV3IHBhcmFtcyBsYW5kIGluIHRoZSBzYW1lIHRpY2sgYXMgdGhlXG4vLyAgIHJlbG9hZGVkIHRpbGUsIHNvIGEgbG9hZCB0aGF0IGFsc28gbW92ZXMgdGhlIGF1dGhvcmVkIGxheW91dCBjb3N0cyBvbmVcbi8vICAgcmVhZC5cbi8vIC0gVGhlIGxheW91dCBvbiBzY3JlZW4gaXMgdGhlIHN0YXRlIHNlcnZpY2UncyAoZ3JpZExheW91dCk6IHRoZSB2aWV3ZXInc1xuLy8gICBvd24gd2hpbGUgdGhleSBjaGFuZ2VkIGl0IGZyb20gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGVsc2UgdGhlXG4vLyAgIGF1dGhvcmVkIG9uZS4gSXQgb3V0bGl2ZXMgYSBwYWdlIHN3aXRjaCwgYW5kIHRoZSBjaGF0IHJlYWRzIGl0LiBTbyBkb1xuLy8gICB0aGUgZ3JvdXBzIHRoZSB2aWV3ZXIgbGVmdCBvcGVuIChncmlkRXhwYW5zaW9uKSwgd2hpY2ggYSBDbGVhciBsZWF2ZXMuXG4vLyAtIEEgc3RhdGUgdmVyc2lvbiBtb3ZlIChDbGVhciBmaWx0ZXJzLCBhIHNhdmVkIGZpbHRlcikgc2tpcHMgdGhlIHdhaXQ7IHRoZVxuLy8gICByZXNldCBoYXMgcHV0IHRoZSBhdXRob3JlZCBsYXlvdXQgYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyBpdCBjb3N0cyBvbmVcbi8vICAgcmVhZC5cbi8vIC0gQSB0YWJsZSB0aGF0IGZvbGxvd3MgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IChmb2xsb3dzR3JvdXBCeSkgc2VuZHMgaXRzXG4vLyAgIGdyYWluLCBhbmQgcmVhZHMgYWdhaW4gYXQgb25jZSB3aGVuIGl0IGNoYW5nZXMuIFRoZSBzdGF0ZSBzZXJ2aWNlIGhhc1xuLy8gICBtb3ZlZCBpdHMgZmlsdGVyIG9uIHRoZSBncm91cC1ieSdzIGZpZWxkIHRvIHRoZSBuZXcgZ3JhaW4gYnkgdGhlbiwgb3Jcbi8vICAgdGFrZW4gaXQgb3V0IChjbGVhcmVkRmlsdGVyLCB3aGljaCB0aGUgc3RhdHVzIGxpbmUgbmFtZXMpLCBzbyBvbmUgcmVhZFxuLy8gICBnb2VzIG91dCBhbmQgbm90aGluZyBwYWludHMgdW5maWx0ZXJlZC5cbi8vIC0gZnMtZ3JpZCBjb21wYXJlcyB0aGUgbGF5b3V0IGFuZCBwYXJhbXMgYnkgdmFsdWU6IGEgY2xvbmVkIHZhbHVlIG5ldmVyXG4vLyAgIHJlYWRzIGFnYWluLlxuLy8gLSBBbiBvdXRwdXQncyBkZXRhaWwgY2VsbCBpcyBkcmF3biBieSBmc1JlcG9ydEdyaWRDZWxsLCBzbyBhIGNoYW5nZSB0ZWxsc1xuLy8gICBhIG1pc3NpbmcgcHJpb3IgZnJvbSBhIHplcm8gb25lLCBhcyBhIGxpc3QgZG9lczsgYSBjbGljayBvbiBpdCBvcGVuc1xuLy8gICB3aHksIGFzIG5vIGNlbGwgY2FycmllcyBhIG5hdGl2ZSB0b29sdGlwLlxuLy8gLSBBZnRlciB0aGUgdGlsZSdzIGZpcnN0IHJlYWQsIHRoZSB2aWV3ZXIncyBsYXlvdXQgbG9zZXMgdGhlIGZpbHRlcnMgYW5kXG4vLyAgIHNvcnQgdGVybXMgdGhhdCByZWFkIHJlZnVzZWQgKHBydW5lZEdyaWRMYXlvdXQpLCBzbyBzdGFsZSB0aWxlIHN0YXRlXG4vLyAgIChhIGZpZWxkIHRoZSBBSSB0b29rIG91dCBvZiB0aGUgcXVlcnkpIGRvZXMgbm90IGxpbmdlci5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtZ3JpZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZzR3JpZENvbXBvbmVudCxcbiAgICBGc0dyaWRDZWxsRGlyZWN0aXZlLFxuICAgIEZzUG9wb3ZlckRpcmVjdGl2ZSxcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIFJlcG9ydEdyaWRDZWxsUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50R3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbXMgPSBzaWduYWw8UmVwb3J0R3JpZFBhcmFtcyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXBvbmVudCgpLmNvbmZpZz8uY29udHJvbHMgPz8ge30pO1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlID0gY29tcHV0ZWQoKCkgPT4gbmV3IFJlcG9ydEdyaWRTb3VyY2UodGhpcy5fcmVwb3J0RGF0YSwgdGhpcy5yZXBvcnRJZCgpLCB0aGlzLl9jb21wb25lbnRJZCgpLCB7XG4gICAgbG9jYWxlOiAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkubG9jYWxlLFxuICB9KSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxheW91dCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRMYXlvdXQodGhpcy5jb21wb25lbnQoKSkpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXJlZEZpbHRlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRDbGVhcmVkRmlsdGVyKHRoaXMuY29tcG9uZW50KCkpKTtcbiAgLy8gUmVhZCBvbmNlOiBmcy1ncmlkIG93bnMgdGhlIG9wZW4gZ3JvdXBzIGZyb20gdGhlbiBvbiBhbmQgd3JpdGVzIHRoZW0gb3V0LlxuICBwdWJsaWMgcmVhZG9ubHkgZXhwYW5zaW9uID0gc2lnbmFsPEdyaWRFeHBhbnNpb24gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGVEYXRhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zb3VyY2UoKS5yZXBvcnQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdHRlciA9IGNvbXB1dGVkKCgpID0+IHJlcG9ydEdyaWRGb3JtYXR0ZXIoe1xuICAgIGZvcm1hdDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgIHRpbWV6b25lOiB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgIHJlcG9ydDogdGhpcy5zb3VyY2UoKS5yZXBvcnQoKSxcbiAgfSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wb25lbnQoKS5pZCk7XG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgLy8gV2hldGhlciB0aGUgZmlyc3QgcmVhZCdzIG5vdGVzIGhhdmUgcHJ1bmVkIHRoZSB2aWV3ZXIncyBsYXlvdXQuXG4gIHByaXZhdGUgX2lzUHJ1bmVkID0gZmFsc2U7XG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBwYXJhbXMgb24gc2NyZWVuIHdlcmUgcmVhZCB1bmRlci5cbiAgcHJpdmF0ZSBfcGFyYW1zVmVyc2lvbiA9IDA7XG4gIC8vIFRoZSByZXBvcnQgbG9hZHMgc2VlbiBzaW5jZSB0aGUgdGlsZSB3YXMgZHJhd24gKFJlcG9ydEdyaWRQYXJhbXMpLlxuICBwcml2YXRlIF9yZXBvcnRMb2FkcyA9IDA7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5zaW9uLnNldCh0aGlzLl9maWx0ZXJTdGF0ZS5ncmlkRXhwYW5zaW9uKHRoaXMuY29tcG9uZW50KCkpKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gICAgdGhpcy5fcHJ1bmVBZnRlckZpcnN0UmVhZCgpO1xuICB9XG5cbiAgcHVibGljIHNldExheW91dChsYXlvdXQ6IEdyaWRMYXlvdXQpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRHcmlkTGF5b3V0KHRoaXMuY29tcG9uZW50KCksIGxheW91dCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RXhwYW5zaW9uKGV4cGFuc2lvbjogR3JpZEV4cGFuc2lvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEdyaWRFeHBhbnNpb24odGhpcy5jb21wb25lbnQoKSwgZXhwYW5zaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyYW1zVmVyc2lvbiA9IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpO1xuICAgIHRoaXMucGFyYW1zLnNldCh0aGlzLl9yZWFkUGFyYW1zKCkpO1xuXG4gICAgLy8gQSBudWxsIGdyb3VwIGlzIGEgZnVsbCByZS1pbml0OiBhIHJlcG9ydCBsb2FkLCBvciBhIHJlc2V0LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGdyb3VwSWQpID0+IHRoaXMuX3NldHRsZWQkKGdyb3VwSWQgPT09IG51bGwpKSxcbiAgICAgICAgdGFwKChpc0xvYWQpID0+IHRoaXMuX2FwcGx5UGFyYW1zKGlzTG9hZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZm9sbG93c0dyb3VwQnkodGhpcy5jb21wb25lbnQoKSkpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeUNoYW5nZXMoKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fYXBwbHlQYXJhbXMoKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gT25jZSB0aGUgdGlsZSdzIGZpcnN0IHJlYWQgaXMgaW4sIGl0cyBub3RlcyBwcnVuZSB0aGUgdmlld2VyJ3MgbGF5b3V0XG4gIC8vIChwcnVuZWRHcmlkTGF5b3V0KS4gQSB0aWxlIHNob3dpbmcgaXRzIGF1dGhvcmVkIGxheW91dCBoYXMgbm90aGluZyB0b1xuICAvLyBwcnVuZS5cbiAgcHJpdmF0ZSBfcHJ1bmVBZnRlckZpcnN0UmVhZCgpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuc291cmNlKCkuc3VtbWFyeSgpO1xuICAgICAgaWYgKCFzdW1tYXJ5IHx8IHRoaXMuX2lzUHJ1bmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNQcnVuZWQgPSB0cnVlO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3BydW5lKHN1bW1hcnkubm90ZXMgPz8gW10pKTtcbiAgICB9LCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciwgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcnVuZShub3RlczogR3JpZE5vdGVbXSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRTZXNzaW9uTGF5b3V0KGNvbXBvbmVudCk7XG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJ1bmVkID0gcHJ1bmVkR3JpZExheW91dChzZXNzaW9uLCBub3RlcywgdGhpcy5jb250cm9scygpLmZpbHRlciwgYXV0aG9yZWRHcmlkTGF5b3V0KGNvbXBvbmVudCkuZmlsdGVycyk7XG4gICAgaWYgKHBydW5lZCAhPT0gc2Vzc2lvbikge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0R3JpZExheW91dChjb21wb25lbnQsIHBydW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBjaGFuZ2UsIG9uY2UgaXQgaGFzIHNldHRsZWQsIHBhc3Npbmcgb24gd2hldGhlciBpdCB3YXMgYSByZXBvcnQgbG9hZDpcbiAgLy8gYXQgb25jZSBmb3IgYSBsb2FkIChvbmUgZXZlbnQsIG5vdCBhIHN3ZWVwKSBvciB3aGVuIHRoZSBzdGF0ZSB2ZXJzaW9uXG4gIC8vIG1vdmVkLCBlbHNlIGFmdGVyIHRoZSBkZWJvdW5jZTsgZHJvcHBlZCB3aGVuIHRoZSB2ZXJzaW9uIG1vdmVzIHdoaWxlIGl0XG4gIC8vIHdhaXRzLCBzaW5jZSB0aGF0IG1vdmUgYnJpbmdzIGl0cyBvd24gY2hhbmdlLlxuICBwcml2YXRlIF9zZXR0bGVkJChpc0xvYWQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG4gICAgY29uc3QgbW92ZWQgPSB2ZXJzaW9uICE9PSB0aGlzLl9wYXJhbXNWZXJzaW9uO1xuXG4gICAgcmV0dXJuIChpc0xvYWQgfHwgbW92ZWQgPyBvZigwKSA6IHRpbWVyKFRJTEVfUkVGUkVTSF9ERUJPVU5DRV9NUykpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpID09PSB2ZXJzaW9uKSxcbiAgICAgICAgbWFwKCgpID0+IGlzTG9hZCksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlQYXJhbXMoaXNMb2FkID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoaXNMb2FkKSB7XG4gICAgICB0aGlzLl9yZXBvcnRMb2FkcysrO1xuICAgIH1cblxuICAgIHRoaXMuX3BhcmFtc1ZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcbiAgICB0aGlzLnBhcmFtcy5zZXQodGhpcy5fcmVhZFBhcmFtcygpKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlJ3MgcmVwb3J0IGZpbHRlcnMsICdhbnknIGdyb3VwcyBhbmQgZ3JvdXAtYnkgZ3JhaW4gYXMgdGhleSBzdGFuZFxuICAvLyAodGlsZVN0YXRlKCkpLCBhbmQgdGhlIHJlcG9ydCBsb2FkcyBpdCBoYXMgc2Vlbi5cbiAgcHJpdmF0ZSBfcmVhZFBhcmFtcygpOiBSZXBvcnRHcmlkUGFyYW1zIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIGNvbnN0IHsgbWF0Y2hBbnlHcm91cElkcywgZnJlcXVlbmN5IH0gPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCksXG4gICAgICAuLi4obWF0Y2hBbnlHcm91cElkcz8ubGVuZ3RoID8geyBtYXRjaEFueUdyb3VwSWRzIH0gOiB7fSksXG4gICAgICAuLi4oZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9yZXBvcnRMb2FkcyA/IHsgcmVwb3J0TG9hZHM6IHRoaXMuX3JlcG9ydExvYWRzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG59XG4iLCI8IS0tIFRoZSBjb21wYXJpc29uIGFuZCB3aW5kb3cgbm90ZSBzdHJpcCBhYm92ZSB0aGUgdGFibGUsIGZyb20gdGhlIHJlcG9ydFxuICAgICBsaW5lIG9mIHRoZSBsYXRlc3QgcmVhZDsgdGhlIHdpbmRvd3MnIGRlc2NyaXB0aW9ucyBhbmQgbm90ZXMgZ28gaW4gZWFjaFxuICAgICBjb2x1bW4ncyBcIkFib3V0IHRoaXMgY29sdW1uXCIgaW5zdGVhZC4gLS0+XG48ZGl2IGNsYXNzPVwiZnMtY29sdW1uIGdyaWQtcGFuZVwiPlxuICA8YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICAgIFtkYXRhXT1cIm5vdGVEYXRhKClcIlxuICAgIFt3aW5kb3dOb3Rlc109XCJmYWxzZVwiPlxuICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG4gIDwhLS0gVGhlIHBhcmFtcyBhcmUgc2VlZGVkIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCBzbyB0aGUgZ3JpZCdzIGZpcnN0IHJlYWRcbiAgICAgICBjYXJyaWVzIHRoZSB0aWxlJ3MgcmVwb3J0IGZpbHRlcnMuIC0tPlxuICBAaWYgKHBhcmFtcygpOyBhcyBwYXJhbXMpIHtcbiAgICA8ZnMtZ3JpZFxuICAgICAgY2xhc3M9XCJmcy1mbGV4XCJcbiAgICAgIFtzb3VyY2VdPVwic291cmNlKClcIlxuICAgICAgW2xheW91dF09XCJsYXlvdXQoKVwiXG4gICAgICBbZXhwYW5zaW9uXT1cImV4cGFuc2lvbigpXCJcbiAgICAgIFtjbGVhcmVkRmlsdGVyXT1cImNsZWFyZWRGaWx0ZXIoKVwiXG4gICAgICAoZXhwYW5zaW9uQ2hhbmdlKT1cInNldEV4cGFuc2lvbigkZXZlbnQpXCJcbiAgICAgIFtwYXJhbXNdPVwicGFyYW1zXCJcbiAgICAgIFtjb250cm9sc109XCJjb250cm9scygpXCJcbiAgICAgIFtmb3JtYXR0ZXJdPVwiZm9ybWF0dGVyKClcIlxuICAgICAgKGxheW91dENoYW5nZSk9XCJzZXRMYXlvdXQoJGV2ZW50KVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIGZzR3JpZENlbGwgbGV0LXZhbHVlIGxldC1maWVsZD1cImZpZWxkXCIgbGV0LXJlY29yZD1cInJlY29yZFwiIGxldC10ZXh0PVwidGV4dFwiPlxuICAgICAgICBAaWYgKHZhbHVlIHwgZnNSZXBvcnRHcmlkQ2VsbDogZmllbGQgOiByZWNvcmQgOiB0ZXh0IDogbm90ZURhdGEoKSA6IGZvcm1hdENvbnRleHQoKTsgYXMgc2hvd24pIHtcbiAgICAgICAgICA8IS0tIEEgY2VsbCB0aGF0IHNheXMgd2h5IChhIG1pc3Npbmcgb3IgemVybyBwcmlvcikgb3BlbnMgaXQgb24gYVxuICAgICAgICAgICAgICAgY2xpY2s7IG5vIGNlbGwgY2FycmllcyBhIG5hdGl2ZSB0b29sdGlwLiAtLT5cbiAgICAgICAgICBAaWYgKHNob3duLnRpdGxlKSB7XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhwbGFpbmVkXCJcbiAgICAgICAgICAgICAgICBmc1BvcG92ZXJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJleHBsYW5hdGlvblwiXG4gICAgICAgICAgICAgICAgW2luZGljYXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCIzMjBcIj5cbiAgICAgICAgICAgICAge3sgc2hvd24udGV4dCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNleHBsYW5hdGlvbj57eyBzaG93bi50aXRsZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8c3Bhbj57eyBzaG93bi50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWdyaWQ+XG4gIH1cbjwvZGl2PlxuIl19
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxHQUNySCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUF1QyxNQUFNLGtCQUFrQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE9BQU8sRUFBYyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFB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LEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxDQUFDO0lBQ0osQ0FBQzt3R0FuSlUsc0JBQXNCOzRGQUF0QixzQkFBc0Isb1dDN0VuQyxvcERBMkNBLDBPRDJCSSxlQUFlLDJQQUNmLG1CQUFtQix5REFDbkIsa0JBQWtCLGlWQUNsQixzQkFBc0IsbUlBQ3RCLGtCQUFrQjs7NEZBR1Qsc0JBQXNCO2tCQWRsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsc0JBQXNCO3dCQUN0QixrQkFBa0I7cUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5qZWN0b3IsIE9uSW5pdCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBGc0dyaWRDZWxsRGlyZWN0aXZlLCBGc0dyaWRDb21wb25lbnQsIEdyaWRFeHBhbnNpb24sIEdyaWRMYXlvdXQsIEdyaWROb3RlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5pbXBvcnQgeyBGc1BvcG92ZXJEaXJlY3RpdmUgfSBmcm9tICdAZmlyZXN0aXRjaC9wb3BvdmVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlsdGVyLCBtYXAsIG9mLCBzd2l0Y2hNYXAsIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZFNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWdyaWQtc291cmNlJztcbmltcG9ydCB7IGZvbGxvd3NHcm91cEJ5IH0gZnJvbSAnLi4vLi4vZ3JvdXAtYnknO1xuaW1wb3J0IHsgUmVwb3J0R3JpZFBhcmFtcyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWdyaWQtcGFyYW1zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgYXV0aG9yZWRHcmlkTGF5b3V0LCBwcnVuZWRHcmlkTGF5b3V0IH0gZnJvbSAnLi4vLi4vcmVwb3J0LWdyaWQtbGF5b3V0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMgfSBmcm9tICcuLi8uLi90aWxlLWxvYWRzJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyBSZXBvcnRHcmlkQ2VsbFBpcGUgfSBmcm9tICcuL3JlcG9ydC1ncmlkLWNlbGwucGlwZSc7XG5pbXBvcnQgeyByZXBvcnRHcmlkRm9ybWF0dGVyIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1mb3JtYXR0ZXInO1xuXG5cbi8vIEEgZ3JpZCB0aWxlOiBmcy1ncmlkIG92ZXIgdGhlIHRpbGUncyByb3dzLCByZWFkIHRocm91Z2ggUmVwb3J0R3JpZFNvdXJjZS5cbi8vXG4vLyAtIFRoZSBwYXJhbXMgKHRoZSByZXBvcnQgZmlsdGVycyB0aGUgdGlsZSByZXNvbHZlcyB0byBhbmQgdGhlICdhbnknXG4vLyAgIGdyb3VwcykgYXJlIHNlZWRlZCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciwgc28gbm8gcmVhZCBnb2VzIG91dCB3aXRob3V0XG4vLyAgIHRoZW0uIEFmdGVyIHRoYXQgYSBjaGFuZ2UgdG8gb25lIG9mIHRoZSB0aWxlJ3MgZmlsdGVyIGdyb3VwcyBzZXR0bGVzIGZvclxuLy8gICBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMsIHNvIGEgc3dlZXAgb2YgY2hhbmdlcyBjb3N0cyBvbmUgcmVhZDsgb25lIHNlbnRcbi8vICAgdW5kZXIgYW4gb2xkZXIgc3RhdGUgdmVyc2lvbiBpcyBkcm9wcGVkLlxuLy8gLSBBIHJlcG9ydCBsb2FkIChhIFJlZnJlc2gsIGEgY2hhdCBlZGl0LCBhIHNldHRpbmdzIHNhdmUsIGFsbCBvZiB3aGljaFxuLy8gICByZS1pbml0IHRoZSBmaWx0ZXIgc3RhdGUpIHJlYWRzIHRoZSB0YWJsZSBhZ2FpbiBhdCBvbmNlLCBldmVuIHdoZW4gaXRzXG4vLyAgIGZpbHRlcnMgZGlkIG5vdCBtb3ZlOiB0aGUgcm93cyBiZWhpbmQgaXQsIG9yIGl0cyBvd24gcXVlcnksIG1heSBoYXZlLlxuLy8gICBUaGUgbG9hZCBpcyBjb3VudGVkIGludG8gdGhlIHBhcmFtcyAocmVwb3J0TG9hZHMpLCBzaW5jZSBmcy1ncmlkIHJlYWRzXG4vLyAgIG9ubHkgd2hlbiB0aGV5IG1vdmUuIFRoZSBwYXJhbXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgdGlsZSBhcyBpdCBpc1xuLy8gICBkcmF3biAocGFyYW1zKSwgc28gdGhlIHJlYWQgb2YgYSBsb2FkIGNhcnJpZXMgdGhlIGZpbHRlcnMgdGhlIGxvYWRcbi8vICAgYnJvdWdodCwgYSBmaWx0ZXIgYWRkZWQgc2luY2UgdGhlIHJlcG9ydCBvcGVuZWQgaW5jbHVkZWQsIGFuZCBsYW5kcyBpblxuLy8gICB0aGUgc2FtZSB0aWNrIGFzIHRoZSByZWxvYWRlZCB0aWxlOiBhIGxvYWQgdGhhdCBhbHNvIG1vdmVzIHRoZSBhdXRob3JlZFxuLy8gICBsYXlvdXQgY29zdHMgb25lIHJlYWQuXG4vLyAtIFdoaWNoIGZpbHRlciBncm91cHMgYW5kIHdoZXRoZXIgdGhlIGdyb3VwLWJ5IHJlYWNoIHRoZSB0aWxlIGlzIHJlYWRcbi8vICAgZnJvbSB0aGUgdGlsZSBhcyBpdCBzdGFuZHMgYXQgZWFjaCBjaGFuZ2UsIG5ldmVyIGFzIGl0IHdhcyBkcmF3bjogYVxuLy8gICBmaWx0ZXIgYWRkZWQgd2hpbGUgdGhlIHJlcG9ydCBpcyBvcGVuIHJlYWRzIG9uIGl0cyBmaXJzdCBwaWNrLlxuLy8gLSBUaGUgbGF5b3V0IG9uIHNjcmVlbiBpcyB0aGUgc3RhdGUgc2VydmljZSdzIChncmlkTGF5b3V0KTogdGhlIHZpZXdlcidzXG4vLyAgIG93biB3aGlsZSB0aGV5IGNoYW5nZWQgaXQgZnJvbSB0aGUgbGF5b3V0IGF1dGhvcmVkIG5vdywgZWxzZSB0aGVcbi8vICAgYXV0aG9yZWQgb25lLiBJdCBvdXRsaXZlcyBhIHBhZ2Ugc3dpdGNoLCBhbmQgdGhlIGNoYXQgcmVhZHMgaXQuIFNvIGRvXG4vLyAgIHRoZSBncm91cHMgdGhlIHZpZXdlciBsZWZ0IG9wZW4gKGdyaWRFeHBhbnNpb24pLCB3aGljaCBhIENsZWFyIGxlYXZlcy5cbi8vIC0gQSBzdGF0ZSB2ZXJzaW9uIG1vdmUgKENsZWFyIGZpbHRlcnMsIGEgc2F2ZWQgZmlsdGVyKSBza2lwcyB0aGUgd2FpdDsgdGhlXG4vLyAgIHJlc2V0IGhhcyBwdXQgdGhlIGF1dGhvcmVkIGxheW91dCBiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIGl0IGNvc3RzIG9uZVxuLy8gICByZWFkLlxuLy8gLSBBIHRhYmxlIHRoYXQgZm9sbG93cyB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgKGZvbGxvd3NHcm91cEJ5KSBzZW5kcyBpdHNcbi8vICAgZ3JhaW4sIGFuZCByZWFkcyBhZ2FpbiBhdCBvbmNlIHdoZW4gaXQgY2hhbmdlcy4gVGhlIHN0YXRlIHNlcnZpY2UgaGFzXG4vLyAgIG1vdmVkIGl0cyBmaWx0ZXIgb24gdGhlIGdyb3VwLWJ5J3MgZmllbGQgdG8gdGhlIG5ldyBncmFpbiBieSB0aGVuLCBvclxuLy8gICB0YWtlbiBpdCBvdXQgKGNsZWFyZWRGaWx0ZXIsIHdoaWNoIHRoZSBzdGF0dXMgbGluZSBuYW1lcyksIHNvIG9uZSByZWFkXG4vLyAgIGdvZXMgb3V0IGFuZCBub3RoaW5nIHBhaW50cyB1bmZpbHRlcmVkLlxuLy8gLSBmcy1ncmlkIGNvbXBhcmVzIHRoZSBsYXlvdXQgYW5kIHBhcmFtcyBieSB2YWx1ZTogYSBjbG9uZWQgdmFsdWUgbmV2ZXJcbi8vICAgcmVhZHMgYWdhaW4uXG4vLyAtIEFuIG91dHB1dCdzIGRldGFpbCBjZWxsIGlzIGRyYXduIGJ5IGZzUmVwb3J0R3JpZENlbGwsIHNvIGEgY2hhbmdlIHRlbGxzXG4vLyAgIGEgbWlzc2luZyBwcmlvciBmcm9tIGEgemVybyBvbmUsIGFzIGEgbGlzdCBkb2VzOyBhIGNsaWNrIG9uIGl0IG9wZW5zXG4vLyAgIHdoeSwgYXMgbm8gY2VsbCBjYXJyaWVzIGEgbmF0aXZlIHRvb2x0aXAuXG4vLyAtIEFmdGVyIHRoZSB0aWxlJ3MgZmlyc3QgcmVhZCwgdGhlIHZpZXdlcidzIGxheW91dCBsb3NlcyB0aGUgZmlsdGVycyBhbmRcbi8vICAgc29ydCB0ZXJtcyB0aGF0IHJlYWQgcmVmdXNlZCAocHJ1bmVkR3JpZExheW91dCksIHNvIHN0YWxlIHRpbGUgc3RhdGVcbi8vICAgKGEgZmllbGQgdGhlIEFJIHRvb2sgb3V0IG9mIHRoZSBxdWVyeSkgZG9lcyBub3QgbGluZ2VyLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNHcmlkQ29tcG9uZW50LFxuICAgIEZzR3JpZENlbGxEaXJlY3RpdmUsXG4gICAgRnNQb3BvdmVyRGlyZWN0aXZlLFxuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgUmVwb3J0R3JpZENlbGxQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRHcmlkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gV2hhdCBmcy1ncmlkIHJlYWRzIHdpdGg6IHRoZSB0aWxlJ3MgcGFyYW1zIChfcmVhZFBhcmFtcykgZm9yIHRoZVxuICAvLyBjb21wb25lbnQgZHJhd24gbm93LCByZWFkIGFnYWluIGF0IGVhY2ggc2V0dGxlZCBjaGFuZ2UgKF9wYXJhbXNSZWFkKS5cbiAgLy8gQSBsb2FkIHJlLWluaXRzIHRoZSBmaWx0ZXIgc3RhdGUgYSB0aWNrIGJlZm9yZSB0aGUgdGlsZSBnZXRzIHRoZVxuICAvLyBjb21wb25lbnQgaXQgYnJvdWdodCwgc28gZGVyaXZpbmcgdGhlbSBoZXJlIGlzIHdoYXQgcHV0cyBhIGZpbHRlciBhZGRlZFxuICAvLyBieSB0aGF0IGxvYWQgaW50byBpdHMgcmVhZC5cbiAgcHVibGljIHJlYWRvbmx5IHBhcmFtcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIHRoaXMuX3BhcmFtc1JlYWQoKTtcblxuICAgIHJldHVybiB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fcmVhZFBhcmFtcyhjb21wb25lbnQpKTtcbiAgfSk7XG4gIHB1YmxpYyByZWFkb25seSBjb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcG9uZW50KCkuY29uZmlnPy5jb250cm9scyA/PyB7fSk7XG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2UgPSBjb21wdXRlZCgoKSA9PiBuZXcgUmVwb3J0R3JpZFNvdXJjZSh0aGlzLl9yZXBvcnREYXRhLCB0aGlzLnJlcG9ydElkKCksIHRoaXMuX2NvbXBvbmVudElkKCksIHtcbiAgICBsb2NhbGU6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUsXG4gIH0pKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGF5b3V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZExheW91dCh0aGlzLmNvbXBvbmVudCgpKSk7XG4gIHB1YmxpYyByZWFkb25seSBjbGVhcmVkRmlsdGVyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZENsZWFyZWRGaWx0ZXIodGhpcy5jb21wb25lbnQoKSkpO1xuICAvLyBSZWFkIG9uY2U6IGZzLWdyaWQgb3ducyB0aGUgb3BlbiBncm91cHMgZnJvbSB0aGVuIG9uIGFuZCB3cml0ZXMgdGhlbSBvdXQuXG4gIHB1YmxpYyByZWFkb25seSBleHBhbnNpb24gPSBzaWduYWw8R3JpZEV4cGFuc2lvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNvdXJjZSgpLnJlcG9ydCgpKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0dGVyID0gY29tcHV0ZWQoKCkgPT4gcmVwb3J0R3JpZEZvcm1hdHRlcih7XG4gICAgZm9ybWF0OiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCksXG4gICAgdGltZXpvbmU6IHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCksXG4gICAgcmVwb3J0OiB0aGlzLnNvdXJjZSgpLnJlcG9ydCgpLFxuICB9KSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY29tcG9uZW50SWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXBvbmVudCgpLmlkKTtcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAvLyBXaGV0aGVyIHRoZSBmaXJzdCByZWFkJ3Mgbm90ZXMgaGF2ZSBwcnVuZWQgdGhlIHZpZXdlcidzIGxheW91dC5cbiAgcHJpdmF0ZSBfaXNQcnVuZWQgPSBmYWxzZTtcbiAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIHBhcmFtcyBvbiBzY3JlZW4gd2VyZSByZWFkIHVuZGVyLlxuICBwcml2YXRlIF9wYXJhbXNWZXJzaW9uID0gMDtcbiAgLy8gVGhlIHJlcG9ydCBsb2FkcyBzZWVuIHNpbmNlIHRoZSB0aWxlIHdhcyBkcmF3biAoUmVwb3J0R3JpZFBhcmFtcykuXG4gIHByaXZhdGUgX3JlcG9ydExvYWRzID0gMDtcbiAgLy8gTW92ZXMgZWFjaCB0aW1lIGEgc2V0dGxlZCBjaGFuZ2UgaGFzIHRoZSBwYXJhbXMgcmVhZCBhZ2Fpbi5cbiAgcHJpdmF0ZSByZWFkb25seSBfcGFyYW1zUmVhZCA9IHNpZ25hbCgwKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBhbnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRFeHBhbnNpb24odGhpcy5jb21wb25lbnQoKSkpO1xuICAgIHRoaXMuX2luaXQoKTtcbiAgICB0aGlzLl9wcnVuZUFmdGVyRmlyc3RSZWFkKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0TGF5b3V0KGxheW91dDogR3JpZExheW91dCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEdyaWRMYXlvdXQodGhpcy5jb21wb25lbnQoKSwgbGF5b3V0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHBhbnNpb24oZXhwYW5zaW9uOiBHcmlkRXhwYW5zaW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0R3JpZEV4cGFuc2lvbih0aGlzLmNvbXBvbmVudCgpLCBleHBhbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbXNWZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG5cbiAgICAvLyBBIG51bGwgZ3JvdXAgaXMgYSBmdWxsIHJlLWluaXQ6IGEgcmVwb3J0IGxvYWQsIG9yIGEgcmVzZXQuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcih0aGlzLmNvbXBvbmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGdyb3VwSWQpID0+IHRoaXMuX3NldHRsZWQkKGdyb3VwSWQgPT09IG51bGwpKSxcbiAgICAgICAgdGFwKChpc0xvYWQpID0+IHRoaXMuX2FwcGx5UGFyYW1zKGlzTG9hZCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBBIGxvYWQgY2FuIG1ha2UgdGhlIHRhYmxlIGZvbGxvdyB0aGUgZ3JvdXAtYnksIG9yIHN0b3AuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5Q2hhbmdlcygpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IGZvbGxvd3NHcm91cEJ5KHRoaXMuY29tcG9uZW50KCkpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2FwcGx5UGFyYW1zKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBPbmNlIHRoZSB0aWxlJ3MgZmlyc3QgcmVhZCBpcyBpbiwgaXRzIG5vdGVzIHBydW5lIHRoZSB2aWV3ZXIncyBsYXlvdXRcbiAgLy8gKHBydW5lZEdyaWRMYXlvdXQpLiBBIHRpbGUgc2hvd2luZyBpdHMgYXV0aG9yZWQgbGF5b3V0IGhhcyBub3RoaW5nIHRvXG4gIC8vIHBydW5lLlxuICBwcml2YXRlIF9wcnVuZUFmdGVyRmlyc3RSZWFkKCk6IHZvaWQge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5zb3VyY2UoKS5zdW1tYXJ5KCk7XG4gICAgICBpZiAoIXN1bW1hcnkgfHwgdGhpcy5faXNQcnVuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc1BydW5lZCA9IHRydWU7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fcHJ1bmUoc3VtbWFyeS5ub3RlcyA/PyBbXSkpO1xuICAgIH0sIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yLCBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3BydW5lKG5vdGVzOiBHcmlkTm90ZVtdKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KTtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcnVuZWQgPSBwcnVuZWRHcmlkTGF5b3V0KHNlc3Npb24sIG5vdGVzLCB0aGlzLmNvbnRyb2xzKCkuZmlsdGVyLCBhdXRob3JlZEdyaWRMYXlvdXQoY29tcG9uZW50KS5maWx0ZXJzKTtcbiAgICBpZiAocHJ1bmVkICE9PSBzZXNzaW9uKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRHcmlkTGF5b3V0KGNvbXBvbmVudCwgcHJ1bmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGNoYW5nZSwgb25jZSBpdCBoYXMgc2V0dGxlZCwgcGFzc2luZyBvbiB3aGV0aGVyIGl0IHdhcyBhIHJlcG9ydCBsb2FkOlxuICAvLyBhdCBvbmNlIGZvciBhIGxvYWQgKG9uZSBldmVudCwgbm90IGEgc3dlZXApIG9yIHdoZW4gdGhlIHN0YXRlIHZlcnNpb25cbiAgLy8gbW92ZWQsIGVsc2UgYWZ0ZXIgdGhlIGRlYm91bmNlOyBkcm9wcGVkIHdoZW4gdGhlIHZlcnNpb24gbW92ZXMgd2hpbGUgaXRcbiAgLy8gd2FpdHMsIHNpbmNlIHRoYXQgbW92ZSBicmluZ3MgaXRzIG93biBjaGFuZ2UuXG4gIHByaXZhdGUgX3NldHRsZWQkKGlzTG9hZDogYm9vbGVhbik6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcbiAgICBjb25zdCBtb3ZlZCA9IHZlcnNpb24gIT09IHRoaXMuX3BhcmFtc1ZlcnNpb247XG5cbiAgICByZXR1cm4gKGlzTG9hZCB8fCBtb3ZlZCA/IG9mKDApIDogdGltZXIoVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkgPT09IHZlcnNpb24pLFxuICAgICAgICBtYXAoKCkgPT4gaXNMb2FkKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVBhcmFtcyhpc0xvYWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmIChpc0xvYWQpIHtcbiAgICAgIHRoaXMuX3JlcG9ydExvYWRzKys7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFyYW1zVmVyc2lvbiA9IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpO1xuICAgIHRoaXMuX3BhcmFtc1JlYWQudXBkYXRlKChjb3VudCkgPT4gY291bnQgKyAxKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlJ3MgcmVwb3J0IGZpbHRlcnMsICdhbnknIGdyb3VwcyBhbmQgZ3JvdXAtYnkgZ3JhaW4gYXMgdGhleSBzdGFuZFxuICAvLyAodGlsZVN0YXRlKCkpLCBhbmQgdGhlIHJlcG9ydCBsb2FkcyBpdCBoYXMgc2Vlbi5cbiAgcHJpdmF0ZSBfcmVhZFBhcmFtcyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlcG9ydEdyaWRQYXJhbXMge1xuICAgIGNvbnN0IHsgbWF0Y2hBbnlHcm91cElkcywgZnJlcXVlbmN5IH0gPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCksXG4gICAgICAuLi4obWF0Y2hBbnlHcm91cElkcz8ubGVuZ3RoID8geyBtYXRjaEFueUdyb3VwSWRzIH0gOiB7fSksXG4gICAgICAuLi4oZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9yZXBvcnRMb2FkcyA/IHsgcmVwb3J0TG9hZHM6IHRoaXMuX3JlcG9ydExvYWRzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG59XG4iLCI8IS0tIFRoZSBjb21wYXJpc29uIGFuZCB3aW5kb3cgbm90ZSBzdHJpcCBhYm92ZSB0aGUgdGFibGUsIGZyb20gdGhlIHJlcG9ydFxuICAgICBsaW5lIG9mIHRoZSBsYXRlc3QgcmVhZDsgdGhlIHdpbmRvd3MnIGRlc2NyaXB0aW9ucyBhbmQgbm90ZXMgZ28gaW4gZWFjaFxuICAgICBjb2x1bW4ncyBcIkFib3V0IHRoaXMgY29sdW1uXCIgaW5zdGVhZC4gLS0+XG48ZGl2IGNsYXNzPVwiZnMtY29sdW1uIGdyaWQtcGFuZVwiPlxuICA8YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICAgIFtkYXRhXT1cIm5vdGVEYXRhKClcIlxuICAgIFt3aW5kb3dOb3Rlc109XCJmYWxzZVwiPlxuICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG4gIDwhLS0gVGhlIHBhcmFtcyBhcmUgcmVhZCBmcm9tIHRoZSB0aWxlIGRyYXduIChwYXJhbXMpLCBmcm9tIGl0cyBmaXJzdFxuICAgICAgIHJlbmRlciBvbiwgc28gZXZlcnkgcmVhZCBjYXJyaWVzIHRoZSB0aWxlJ3MgcmVwb3J0IGZpbHRlcnMuIC0tPlxuICA8ZnMtZ3JpZFxuICAgIGNsYXNzPVwiZnMtZmxleFwiXG4gICAgW3NvdXJjZV09XCJzb3VyY2UoKVwiXG4gICAgW2xheW91dF09XCJsYXlvdXQoKVwiXG4gICAgW2V4cGFuc2lvbl09XCJleHBhbnNpb24oKVwiXG4gICAgW2NsZWFyZWRGaWx0ZXJdPVwiY2xlYXJlZEZpbHRlcigpXCJcbiAgICAoZXhwYW5zaW9uQ2hhbmdlKT1cInNldEV4cGFuc2lvbigkZXZlbnQpXCJcbiAgICBbcGFyYW1zXT1cInBhcmFtcygpXCJcbiAgICBbY29udHJvbHNdPVwiY29udHJvbHMoKVwiXG4gICAgW2Zvcm1hdHRlcl09XCJmb3JtYXR0ZXIoKVwiXG4gICAgKGxheW91dENoYW5nZSk9XCJzZXRMYXlvdXQoJGV2ZW50KVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBmc0dyaWRDZWxsIGxldC12YWx1ZSBsZXQtZmllbGQ9XCJmaWVsZFwiIGxldC1yZWNvcmQ9XCJyZWNvcmRcIiBsZXQtdGV4dD1cInRleHRcIj5cbiAgICAgIEBpZiAodmFsdWUgfCBmc1JlcG9ydEdyaWRDZWxsOiBmaWVsZCA6IHJlY29yZCA6IHRleHQgOiBub3RlRGF0YSgpIDogZm9ybWF0Q29udGV4dCgpOyBhcyBzaG93bikge1xuICAgICAgICA8IS0tIEEgY2VsbCB0aGF0IHNheXMgd2h5IChhIG1pc3Npbmcgb3IgemVybyBwcmlvcikgb3BlbnMgaXQgb24gYVxuICAgICAgICAgICAgIGNsaWNrOyBubyBjZWxsIGNhcnJpZXMgYSBuYXRpdmUgdG9vbHRpcC4gLS0+XG4gICAgICAgIEBpZiAoc2hvd24udGl0bGUpIHtcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImV4cGxhaW5lZFwiXG4gICAgICAgICAgICAgIGZzUG9wb3ZlclxuICAgICAgICAgICAgICB0cmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiZXhwbGFuYXRpb25cIlxuICAgICAgICAgICAgICBbaW5kaWNhdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhXaWR0aF09XCIzMjBcIj5cbiAgICAgICAgICAgIHt7IHNob3duLnRleHQgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNleHBsYW5hdGlvbj57eyBzaG93bi50aXRsZSB9fTwvbmctdGVtcGxhdGU+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuPnt7IHNob3duLnRleHQgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWdyaWQ+XG48L2Rpdj5cbiJdfQ==
@@ -138,9 +138,10 @@ export class ComponentListComponent {
138
138
  this._initListConfig(config);
139
139
  this._observePinOffsets();
140
140
  // A change to any group this list's filters belong to (from the report bar
141
- // or the component header strip) re-runs the list.
142
- // So does a change of the text in its search box (in the component header).
143
- merge(this._filterState.changesFor(component), this._filterState.listSearchChanges(component.id))
141
+ // or the component header strip) re-runs the list, a filter added since
142
+ // the list was drawn included. So does a change of the text in its search
143
+ // box (in the component header).
144
+ merge(this._filterState.changesFor(this.component), this._filterState.listSearchChanges(component.id))
144
145
  .pipe(tap(() => this.listComponent()?.reload()), takeUntilDestroyed(this._destroyRef))
145
146
  .subscribe();
146
147
  }
@@ -348,4 +349,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
348
349
  ReportOutputPipe,
349
350
  ], template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<!-- The windows a comparison compares, and why it reads as it does. A\n windowed column's own notes are in its header's tooltip. -->\n<app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n</app-report-component-note>\n\n<!-- fs-list reads a column's footer template once, as a direct child of\n fs-list-column, so a list with totals renders its columns in a branch of\n their own rather than wrapping the footer in an @if. Its header template too,\n which every column carries: an output column's tooltip says what it holds.\n Columns are tracked by alignment as well as name, since fs-list reads a\n column's alignment only when it builds the column. -->\n<fs-list\n [config]=\"listConfig\"\n [class.report-totals-empty]=\"!totals()\">\n @if (showTotals()) {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n <ng-template fs-list-footer>\n @if (totals()?.[column.column] !== undefined) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: totals()?.[column.column], row: totals(), column: column }\">\n </ng-container>\n } @else if (column.column === totalsLabelColumn()) {\n {{ totalLabel }}\n }\n </ng-template>\n </fs-list-column>\n }\n } @else {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n </fs-list-column>\n }\n }\n</fs-list>\n\n@if (caption()) {\n <div class=\"list-caption small\">\n {{ caption() }}\n </div>\n}\n\n<!-- A column's heading, with what an output column holds as its tooltip (an\n empty one never shows). -->\n<ng-template\n #headerTpl\n let-column=\"column\">\n <span [matTooltip]=\"columnNotes()[column.column] ?? ''\">{{ column.label || column.column }}</span>\n</ng-template>\n\n<!-- One cell, in the body and the totals row alike: an output column by what\n it holds (its row gives a change its prior), a date column as a day in the\n report's zone and locale, any other through its number format. -->\n<ng-template\n #cellTpl\n let-value\n let-row=\"row\"\n let-column=\"column\">\n @if (outputColumns()[column.column]; as output) {\n @if (row | fsReportOutput: column : output : formatContext(); as cell) {\n <span [attr.title]=\"cell.title\">{{ cell.text }}</span>\n }\n } @else if (column.format === ReportListColumnFormat.Date) {\n {{ value | fsReportDate: timezone() : formatContext().locale }}\n } @else {\n {{ value | fsReportNumber: column : formatContext() }}\n }\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;flex:1 1 auto;height:auto;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list .fs-list-table tfoot td{position:sticky;bottom:0;z-index:1;background-color:#fff;font-weight:500;box-shadow:inset 0 1px #0000001f}:host ::ng-deep fs-list.report-totals-empty tfoot{display:none}:host ::ng-deep fs-list .report-pinned{position:sticky;left:var(--report-pin-left, 0px);z-index:1;background-color:#fff}:host ::ng-deep fs-list .report-pin-0{--report-pin-left: var(--report-pin-left-0, 0px)}:host ::ng-deep fs-list .report-pin-1{--report-pin-left: var(--report-pin-left-1, 0px)}:host ::ng-deep fs-list .report-pin-2{--report-pin-left: var(--report-pin-left-2, 0px)}:host ::ng-deep fs-list .report-pin-last{box-shadow:inset -1px 0 #0000001f}:host ::ng-deep fs-list .fs-list-table thead th.report-pinned{z-index:3}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pinned{z-index:2}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pin-last{box-shadow:inset -1px 0 #0000001f,inset 0 1px #0000001f}:host ::ng-deep fs-list th.report-nowrap,:host ::ng-deep fs-list td.report-nowrap{white-space:nowrap}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.list-caption{flex:0 0 auto;padding-top:4px}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"] }]
350
351
  }], ctorParameters: () => [] });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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QztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nKS4gZnMtbGlzdFxuICAvLyBoaWRlcyBhbmQgc2hvd3MgdGhlbSBpbiBwbGFjZSB0aHJvdWdoIFtzaG93XSwgc28gdGhlIHJvd3NcbiAgLy8gYWxyZWFkeSBmZXRjaGVkIHN0YW5kLlxuICBwdWJsaWMgcmVhZG9ubHkgaGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gbmV3IFNldCh0aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50KCkuaWQpKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsTGFiZWwgPSBMSVNUX1RPVEFMX0xBQkVMO1xuXG4gIC8vIFRoZSBjb2x1bW5zIHRoYXQgaG9sZCBhIGNvbXBhcmVkLCB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQsIGJ5XG4gIC8vIG5hbWU7IHRoZSByZXN0IGFyZSB3cml0dGVuIGFzIGJlZm9yZS5cbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dENvbHVtbnMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBMaXN0T3V0cHV0Q29sdW1uPj4oKCkgPT4gbGlzdE91dHB1dENvbHVtbnMoXG4gICAgdGhpcy5jb2x1bW5zKCksXG4gICAgdGhpcy5ub3RlRGF0YSgpLFxuICAgICgodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWcpLmNvbHVtbnMgPz8gW10sXG4gICkpO1xuXG4gIC8vIEVhY2ggY29sdW1uJ3MgaGVhZGVyIHRvb2x0aXA6IHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyAoJycgZm9yIGFueVxuICAvLyBvdGhlcikuXG4gIHB1YmxpYyByZWFkb25seSBjb2x1bW5Ob3RlcyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY29sdW1ucygpXG4gICAgICAubWFwKChjb2x1bW4pID0+IFtjb2x1bW4uY29sdW1uLCBvdXRwdXRDb2x1bW5Ob3RlKGNvbHVtbi5jb2x1bW4sIHRoaXMubm90ZURhdGEoKSwgbG9jYWxlKV0pKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbHVtbiB3aG9zZSBmb290ZXIgY2VsbCByZWFkcyAnVG90YWwnOiB0aGUgZmlyc3Qgb25lIHNob3duLCB1bmxlc3NcbiAgLy8gaXQgaG9sZHMgYSB0b3RhbCBpdHNlbGYuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNMYWJlbENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IGxpc3RUb3RhbHNMYWJlbENvbHVtbihcbiAgICB0aGlzLmNvbHVtbnMoKS5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMuaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pKSxcbiAgICB0aGlzLnRvdGFscygpLFxuICApKTtcblxuICAvLyBUaGUgbGluZSB1bmRlciB0aGUgbGlzdDogaXRzIHJvdyBjb3VudCwgdGhlbiB3aHkgaXQgaGFzIG5vIHRvdGFscyBhbmQgd2h5XG4gIC8vIGl0cyBzZWFyY2ggbmFycm93ZWQgbm90aGluZy4gVGhlIGRpZ2l0cyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gbG9jYWxlLCBuZXZlciB0aGUgYXBwJ3MuXG4gIHB1YmxpYyByZWFkb25seSBjYXB0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dDb3VudCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb3VudCkge1xuICAgICAgY29uc3QgdG90YWwgPSBmb3JtYXRQbGFpbk51bWJlcihjb3VudC50b3RhbCwgbG9jYWxlKTtcbiAgICAgIHBhcnRzLnB1c2goY291bnQuc2hvd24gPCBjb3VudC50b3RhbFxuICAgICAgICA/IGBTaG93aW5nICR7Zm9ybWF0UGxhaW5OdW1iZXIoY291bnQuc2hvd24sIGxvY2FsZSl9IG9mICR7dG90YWx9YFxuICAgICAgICA6IGAke3RvdGFsfSByb3cocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLnBhcnRzLCB0aGlzLnRvdGFsc05vdGUoKSwgdGhpcy5zZWFyY2hOb3RlKCldXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gISFwYXJ0KVxuICAgICAgLmpvaW4oJyDCtyAnKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBfcGluT2Zmc2V0c1JlZjogQWZ0ZXJSZW5kZXJSZWYgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBIaWRpbmcgb3Igc2hvd2luZyBhIGNvbHVtbiBtb3ZlcyB0aGUgcGlubmVkIGNvbHVtbnMgYWZ0ZXIgaXQuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZGVuKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuc2hvd1RvdGFscy5zZXQoY29uZmlnLnRvdGFscyA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5jb2x1bW5zLnNldCgoY29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSk7XG5cbiAgICB0aGlzLl9pbml0TGlzdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX29ic2VydmVQaW5PZmZzZXRzKCk7XG5cbiAgICAvLyBBIGNoYW5nZSB0byBhbnkgZ3JvdXAgdGhpcyBsaXN0J3MgZmlsdGVycyBiZWxvbmcgdG8gKGZyb20gdGhlIHJlcG9ydCBiYXJcbiAgICAvLyBvciB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcCkgcmUtcnVucyB0aGUgbGlzdC5cbiAgICAvLyBTbyBkb2VzIGEgY2hhbmdlIG9mIHRoZSB0ZXh0IGluIGl0cyBzZWFyY2ggYm94IChpbiB0aGUgY29tcG9uZW50IGhlYWRlcikuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcihjb21wb25lbnQpLCB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnQuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQoKT8ucmVsb2FkKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0TGlzdENvbmZpZyhjb25maWc6IExpc3RDb25maWcpOiB2b2lkIHtcbiAgICAvLyBUaGUgdmlld2VyJ3MgbGFzdCBzb3J0IHdpbnMgb3ZlciB0aGUgYXV0aG9yZWQgb25lLCBzbyBhIGxpc3QgcmVjcmVhdGVkXG4gICAgLy8gaW4gdGhlIHNhbWUgc2Vzc2lvbiAocGFnZSBzd2l0Y2gsIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBrZWVwcyBpdC5cbiAgICAvLyBmcy1saXN0IGhvbGRzIG9uZSBzb3J0aW5nIGNvbHVtbiwgc28gaXQgc2hvd3MgdGhlIGF1dGhvcmVkIHNvcnQncyBmaXJzdFxuICAgIC8vIHRlcm07IHRoZSByZXF1ZXN0IHNlbmRzIG9ubHkgdGhhdCB0ZXJtIGFuZCB0aGUgc2VydmVyIGFwcGVuZHMgdGhlIHJlc3QuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50KCkuaWQpXG4gICAgICA/PyBsaXN0U29ydFRlcm1zKGNvbmZpZylbMF07XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICAvLyBJbnNpZGUgYSByZXBvcnQgY29tcG9uZW50IHRoZSBsaXN0IGlzIGEgY2xlYW4gZGF0YSBwYW5lIOKAlCBubyBzdGF0dXNcbiAgICAgIC8vIGJhciwgbm8gcmVsb2FkIGJ1dHRvbiAoZmlsdGVyIGNoYW5nZXMgYWxyZWFkeSByZWZldGNoKS5cbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRnNMaXN0IG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBzb3J0L3BhZ2luZyBzdGF0ZS4gVGhlIHNvcnRcbiAgICAgIC8vIGlzIGtlcHQgaW4gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIChzZXRMaXN0U29ydCksIGFuZCBwYWdpbmcgc3RheXNcbiAgICAgIC8vIG91dCBvZiBpdC5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBzb3J0OiBzb3J0XG4gICAgICAgID8geyB2YWx1ZTogc29ydC5jb2x1bW4sIGRpcmVjdGlvbjogc29ydC5kaXJlY3Rpb24gPz8gJ2FzYycgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIExvYWQtbW9yZTogdGhlIGxpc3Qga2VlcHMgYSBmaXhlZCwgc2Nyb2xsYWJsZSBoZWlnaHQgYW5kIGFwcGVuZHMgdGhlXG4gICAgICAvLyBuZXh0IHBhZ2UgaW4gcGxhY2UgaW5zdGVhZCBvZiBzd2FwcGluZyBwYWdlcy4gVGhlIGJ1dHRvbiBpcyBwaW5uZWQgdG9cbiAgICAgIC8vIHRoZSBib3R0b20gb2YgdGhlIHNjcm9sbCBwYW5lIChzZWUgY29tcG9uZW50IFNDU1MpLlxuICAgICAgLy9cbiAgICAgIC8vIFVzZXMgdGhlIE9mZnNldCBzdHJhdGVneSAob2Zmc2V0ICsgbGltaXQpIHJhdGhlciB0aGFuIE1hbnk6IGluXG4gICAgICAvLyBAZmlyZXN0aXRjaC9saXN0IHRoZSBwYWdpbmF0aW9uIHRlbXBsYXRlIHJlc29sdmVzIGBoYXNNYW55U3RyYXRlZ3lgXG4gICAgICAvLyBCRUZPUkUgYGxvYWRNb3JlRW5hYmxlZGAsIGFuZCBNYW55IHJlbmRlcnMgYSBmb3J3YXJkLW9ubHkgcGFnZSBwYWdlciDigJRcbiAgICAgIC8vIHNvIE1hbnkgd291bGQgc3VwcHJlc3MgdGhlIGxvYWQtbW9yZSBidXR0b24gZW50aXJlbHkuIE9mZnNldCArIGxvYWRNb3JlXG4gICAgICAvLyBpcyB0aGUgY29tYmluYXRpb24gdGhhdCBhY3R1YWxseSByZW5kZXJzIGFuZCBhcHBlbmRzLiBgX2ZldGNoYCBhbHJlYWR5XG4gICAgICAvLyBkZXJpdmVzIGBwYWdlYCBmcm9tIGBvZmZzZXRgLCBzbyB0aGUgc2VydmVyLXNpZGUgd3JhcCBpcyB1bmFmZmVjdGVkLlxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIGxpbWl0OiBjb25maWcucGFnZVNpemUgPz8gMjUsXG4gICAgICAgIHN0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3kuT2Zmc2V0LFxuICAgICAgfSxcbiAgICAgIGxvYWRNb3JlOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnTG9hZCBtb3JlJyxcbiAgICAgICAgYnV0dG9uVHlwZTogJ3N0cm9rZWQnLFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAocXVlcnk6IGFueSkgPT4gdGhpcy5fZmV0Y2gocXVlcnkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldExpc3RTb3J0KGNvbXBvbmVudCwgc3RhdGUuc29ydCA/PyBudWxsKTtcblxuICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2goY29tcG9uZW50LmlkKTtcbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICBzdGF0ZS5zZWFyY2ggPSBzZWFyY2g7XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyb3VwcyB0aGF0IG1hdGNoICdhbnknLCBhcyBldmVyeSBvdGhlciByZWFkIG9mIHRoaXMgdGlsZSBzZW5kc1xuICAgIC8vIHRoZW0gKHRpbGVEYXRhU3RhdGUpLiBUaGUgc29ydCBhbmQgcGFnaW5nIGFib3ZlIGFyZSBGc0xpc3QncyBvd24uXG4gICAgY29uc3QgeyBtYXRjaEFueUdyb3VwSWRzIH0gPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUoY29tcG9uZW50KTtcbiAgICBpZiAobWF0Y2hBbnlHcm91cElkcykge1xuICAgICAgc3RhdGUubWF0Y2hBbnlHcm91cElkcyA9IG1hdGNoQW55R3JvdXBJZHM7XG4gICAgfVxuXG4gICAgLy8gT25lIHNvdXJjZSBmb3IgZmlsdGVyIHZhbHVlcywgdGhlIHNhbWUgb25lIGNoYXJ0cywgS1BJcyBhbmQgdGhlIGV4cG9ydHNcbiAgICAvLyByZWFkLCBzbyB0aGUgbGlzdCBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIGl0cyBoZWFkZXIgc3RyaXAgc2hvd3MuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkKCksIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiB7XG4gICAgICAgICAgLy8gQSBjcm9zcy10YWIncyBoZWFkZXJzIGNvbWUgYmFjayB3aXRoIHRoZSByb3dzOiB0aGUgcm93LWtleSBjb2x1bW5cbiAgICAgICAgICAvLyBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlLiBSZS1yZWFkIHRoZW0gb24gZXZlcnkgZmV0Y2gsIHNpbmNlXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgY2hhbmdlIGNhbiBhZGQgb3IgcmVtb3ZlIGEgY29sdW1uLlxuICAgICAgICAgIGlmICh0aGlzLnBpdm90ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNldCh0aGlzLl9waXZvdENvbHVtbnMoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy50cnVuY2F0ZWQuc2V0KCEhZGF0YS50cnVuY2F0ZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE9ubHkgcGFnZSAxIGNhcnJpZXMgdGhlIG5vdGVzIGFuZCB0aGUgdG90YWxzOyBhIGxvYWQtbW9yZSBwYWdlXG4gICAgICAgICAgLy8gbGVhdmVzIHRoZW0gYXMgdGhleSBhcmUuXG4gICAgICAgICAgaWYgKHN0YXRlLnBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoTm90ZS5zZXQoZGF0YS5zZWFyY2hOb3RlID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy50b3RhbHMuc2V0KGRhdGEudG90YWxzID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy50b3RhbHNOb3RlLnNldChkYXRhLnRvdGFsc05vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLm5vdGVEYXRhLnNldCh0aGlzLl9ub3RlRGF0YShkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLl9hbGlnbk91dHB1dENvbHVtbnMoZGF0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGhlIHNlcnZlcidzIHBhZ2Ugc2l6ZSB3aGVuIGl0IHNlbmRzIG9uZSAoaXQgY2xhbXBzIHRoZSByZXF1ZXN0KSxcbiAgICAgICAgICAvLyB0aGUgc2l6ZSB0aGUgcGFnaW5nIGJlbG93IGhhbmRzIGZzLWxpc3QgdG9vLlxuICAgICAgICAgIGNvbnN0IHNpemUgPSBkYXRhLnBhZ2luZz8ucGFnZVNpemUgPz8gc3RhdGUucGFnZVNpemU7XG4gICAgICAgICAgY29uc3Qgc2hvd24gPSAoc3RhdGUucGFnZSAtIDEpICogc2l6ZSArIChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKTtcbiAgICAgICAgICB0aGlzLnJvd0NvdW50LnNldCh7IHNob3duLCB0b3RhbDogZGF0YS5wYWdpbmc/LnRvdGFsID8/IHNob3duIH0pO1xuXG4gICAgICAgICAgLy8gTmV3IHJvd3MgY2FuIHdpZGVuIGEgcGlubmVkIGNvbHVtbiwgd2hpY2ggbW92ZXMgdGhlIG9uZXMgYWZ0ZXIgaXQuXG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogZGF0YS5yb3dzID8/IFtdLFxuICAgICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAgIGxpbWl0OiBkYXRhLnBhZ2luZz8ucGFnZVNpemUgPz8gc3RhdGUucGFnZVNpemUsXG4gICAgICAgICAgICAgIHJlY29yZHM6IGRhdGEucGFnaW5nPy50b3RhbCA/PyAoZGF0YS5yb3dzPy5sZW5ndGggPz8gMCksXG4gICAgICAgICAgICAgIHBhZ2U6IGRhdGEucGFnaW5nPy5wYWdlID8/IHN0YXRlLnBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucywgYnVpbHQgZnJvbSB0aGUgd2lyZSBieSBwaXZvdENvbHVtblNwZWNzKCk6IHRoZSBzYW1lXG4gIC8vIGhlYWRpbmdzIGFuZCBjZWxsIGZvcm1hdCB0aGUgUERGIGFuZCBQb3dlclBvaW50IGV4cG9ydHMgdXNlLiBBIGNlbGwgY29sdW1uXG4gIC8vIHdob3NlIG1lYXN1cmUgaXMgYSByYW5rIG9yIGEgc2hhcmUgKGNlbGxNZWFzdXJlcyBuYW1lcyBpdCkgaG9sZHMgbnVtYmVyc1xuICAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgZ3JpZCBuYW1lcyBhIGNlbGwgZm9ybWF0LlxuICBwcml2YXRlIF9waXZvdENvbHVtbnMoZGF0YTogQ29tcG9uZW50RGF0YSk6IChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10ge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICBjb25zdCBvdXRwdXRDZWxscyA9IE9iamVjdC5rZXlzKGxpc3RPdXRwdXRDb2x1bW5zKFxuICAgICAgKGRhdGEuY29sdW1ucyA/PyBbXSkuc2xpY2UoMSkubWFwKChjb2x1bW4pID0+ICh7IGNvbHVtbiB9KSksXG4gICAgICBkYXRhLFxuICAgICAgW10sXG4gICAgKSk7XG5cbiAgICByZXR1cm4gcGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBjb2x1bW4ubnVtZXJpYyB8fCBvdXRwdXRDZWxscy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9ub3RlRGF0YShkYXRhOiBDb21wb25lbnREYXRhKTogQ29tcG9uZW50Tm90ZURhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJpc29uOiBkYXRhLmNvbXBhcmlzb24sXG4gICAgICB0aW1lZnJhbWU6IGRhdGEudGltZWZyYW1lLFxuICAgICAgb3V0cHV0czogZGF0YS5vdXRwdXRzLFxuICAgICAgY2VsbE1lYXN1cmVzOiBkYXRhLmNlbGxNZWFzdXJlcyxcbiAgICAgIHdpbmRvd3M6IGRhdGEud2luZG93cyxcbiAgICAgIGdyYW51bGFyaXR5OiBkYXRhLmdyYW51bGFyaXR5LFxuICAgIH07XG4gIH1cblxuICAvLyBBIHBsYWluIGxpc3QncyBjb2x1bW5zIGFyZSBidWlsdCBiZWZvcmUgYW55IGRhdGEgYXJyaXZlcywgc28gYW4gb3V0cHV0XG4gIC8vIGNvbHVtbiB0aGF0IG5hbWVzIG5vIGZvcm1hdCBvZiBpdHMgb3duIChhIHJhbmssIGEgc2hhcmUsIGEgcHJpb3IgdGhhdCB0YWtlc1xuICAvLyBpdHMgbWVhc3VyZSdzIGZvcm1hdCkgbGVhcm5zIGl0IGhvbGRzIG51bWJlcnMgZnJvbSBwYWdlIDEuIGZzLWxpc3QgcmVhZHMgYVxuICAvLyBjb2x1bW4ncyBhbGlnbm1lbnQgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGUgY29sdW1uLCBzbyBhIGNvbHVtbiB3aG9zZVxuICAvLyBhbGlnbm1lbnQgY2hhbmdlcyBpcyByZWJ1aWx0ICh0aGUgdGVtcGxhdGUgdHJhY2tzIGNvbHVtbnMgYnkgYm90aCkuXG4gIHByaXZhdGUgX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGl2b3RlZCgpIHx8ICFkYXRhLm91dHB1dHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zKCk7XG4gICAgY29uc3QgYWxpZ25lZCA9IGNvbHVtbnMubWFwKChjb2x1bW4pID0+ICh7XG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB8fCAhIWRhdGEub3V0cHV0c1tjb2x1bW4uY29sdW1uXSxcbiAgICB9KSk7XG5cbiAgICBpZiAoYWxpZ25lZC5zb21lKChjb2x1bW4sIGluZGV4KSA9PiBjb2x1bW4ubnVtZXJpYyAhPT0gY29sdW1uc1tpbmRleF0ubnVtZXJpYykpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5zZXQoYWxpZ25lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSB0aWxlIHJlc2l6ZSByZWZsb3dzIHRoZSB0YWJsZSdzIGF1dG8gbGF5b3V0LCBzbyB0aGUgcGlubmVkIGNvbHVtbnMnXG4gIC8vIHdpZHRocywgYW5kIHdpdGggdGhlbSB0aGVpciBvZmZzZXRzLCBjaGFuZ2UuXG4gIHByaXZhdGUgX29ic2VydmVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KCkpO1xuICB9XG5cbiAgLy8gTWVhc3VyZXMgdGhlIHBpbm5lZCBvZmZzZXRzIG9uY2UgdGhlIG5leHQgcmVuZGVyIGhhcyBsYWlkIHRoZSB0YWJsZSBvdXQuXG4gIC8vIE9uZSBwZW5kaW5nIG1lYXN1cmVtZW50IGNvdmVycyBldmVyeSByZXF1ZXN0IG1hZGUgYmVmb3JlIGl0IHJ1bnMuIE9ubHlcbiAgLy8gYWZ0ZXJOZXh0UmVuZGVyIGV4aXN0cyBpbiBldmVyeSBBbmd1bGFyIHZlcnNpb24gdGhpcyBsaWJyYXJ5IHJ1bnMgb24uXG4gIHByaXZhdGUgX3NjaGVkdWxlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waW5uZWQoKSA8IDIgfHwgdGhpcy5fcGluT2Zmc2V0c1JlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Bpbk9mZnNldHNSZWYgPSBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IG51bGw7XG4gICAgICB0aGlzLl91cGRhdGVQaW5PZmZzZXRzKCk7XG4gICAgfSwgeyBpbmplY3RvcjogdGhpcy5faW5qZWN0b3IgfSk7XG4gIH1cblxuICAvLyBFYWNoIHBpbm5lZCBjb2x1bW4gc3RpY2tzIGF0IHRoZSBzdW1tZWQgd2lkdGggb2YgdGhlIHZpc2libGUgcGlubmVkXG4gIC8vIGNvbHVtbnMgYmVmb3JlIGl0LiBBIGhpZGRlbiBjb2x1bW4gcmVuZGVycyBubyBoZWFkZXIsIHNvIHRoZSBuZXh0IHBpbm5lZFxuICAvLyBvbmUgdGFrZXMgaXRzIHBsYWNlLiBBIHZhcmlhYmxlIGlzIHdyaXR0ZW4gb25seSB3aGVuIGl0cyB2YWx1ZSBjaGFuZ2VkLFxuICAvLyB3aGljaCBrZWVwcyBhIHJlc2l6ZSBmcm9tIHJlc3R5bGluZyB0aGUgdGFibGUgZm9yIG5vdGhpbmcuXG4gIHByaXZhdGUgX3VwZGF0ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgbGVmdCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5waW5uZWQoKTsgaW5kZXgrKykge1xuICAgICAgY29uc3QgaGVhZGVyID0gaG9zdC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgdGhlYWQgdGgucmVwb3J0LXBpbi0ke2luZGV4fWApO1xuXG4gICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmFtZSA9IGAtLXJlcG9ydC1waW4tbGVmdC0ke2luZGV4fWA7XG4gICAgICBjb25zdCB2YWx1ZSA9IGAke01hdGgucm91bmQobGVmdCAqIDEwMCkgLyAxMDB9cHhgO1xuXG4gICAgICBpZiAoaG9zdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpICE9PSB2YWx1ZSkge1xuICAgICAgICBob3N0LnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgbGVmdCArPSBoZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuICB9XG59XG4iLCJAaWYgKHRydW5jYXRlZCgpKSB7XG4gIDxkaXYgY2xhc3M9XCJwaXZvdC10cnVuY2F0ZWRcIj5cbiAgICBUaGlzIGdyaWQgd2FzIGJ1aWx0IGZyb20gYSBwYXJ0aWFsIHJlc3VsdCwgc28gc29tZSBjb2x1bW5zIG9yIHZhbHVlcyBtYXkgYmUgbWlzc2luZy4gTmFycm93IGl0IHdpdGggYSBmaWx0ZXIuXG4gIDwvZGl2PlxufVxuXG48IS0tIFRoZSB3aW5kb3dzIGEgY29tcGFyaXNvbiBjb21wYXJlcywgYW5kIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLiBBXG4gICAgIHdpbmRvd2VkIGNvbHVtbidzIG93biBub3RlcyBhcmUgaW4gaXRzIGhlYWRlcidzIHRvb2x0aXAuIC0tPlxuPGFwcC1yZXBvcnQtY29tcG9uZW50LW5vdGVcbiAgW2RhdGFdPVwibm90ZURhdGEoKVwiXG4gIFt3aW5kb3dOb3Rlc109XCJmYWxzZVwiPlxuPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlPlxuXG48IS0tIGZzLWxpc3QgcmVhZHMgYSBjb2x1bW4ncyBmb290ZXIgdGVtcGxhdGUgb25jZSwgYXMgYSBkaXJlY3QgY2hpbGQgb2ZcbiAgICAgZnMtbGlzdC1jb2x1bW4sIHNvIGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zIGluIGEgYnJhbmNoIG9mXG4gICAgIHRoZWlyIG93biByYXRoZXIgdGhhbiB3cmFwcGluZyB0aGUgZm9vdGVyIGluIGFuIEBpZi4gSXRzIGhlYWRlciB0ZW1wbGF0ZSB0b28sXG4gICAgIHdoaWNoIGV2ZXJ5IGNvbHVtbiBjYXJyaWVzOiBhbiBvdXRwdXQgY29sdW1uJ3MgdG9vbHRpcCBzYXlzIHdoYXQgaXQgaG9sZHMuXG4gICAgIENvbHVtbnMgYXJlIHRyYWNrZWQgYnkgYWxpZ25tZW50IGFzIHdlbGwgYXMgbmFtZSwgc2luY2UgZnMtbGlzdCByZWFkcyBhXG4gICAgIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4uIC0tPlxuPGZzLWxpc3RcbiAgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCJcbiAgW2NsYXNzLnJlcG9ydC10b3RhbHMtZW1wdHldPVwiIXRvdGFscygpXCI+XG4gIEBpZiAoc2hvd1RvdGFscygpKSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWZvb3Rlcj5cbiAgICAgICAgICBAaWYgKHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiB0b3RhbHMoKT8uW2NvbHVtbi5jb2x1bW5dLCByb3c6IHRvdGFscygpLCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9IEBlbHNlIGlmIChjb2x1bW4uY29sdW1uID09PSB0b3RhbHNMYWJlbENvbHVtbigpKSB7XG4gICAgICAgICAgICB7eyB0b3RhbExhYmVsIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICB9XG4gIH0gQGVsc2Uge1xuICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zKCk7IHRyYWNrIGNvbHVtbi5jb2x1bW4gKyAnOicgKyBjb2x1bW4ubnVtZXJpYykge1xuICAgICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICAgIFtuYW1lXT1cImNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbc2hvd109XCIhaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pXCJcbiAgICAgICAgW3NvcnRhYmxlXT1cIiFwaXZvdGVkKCkgfHwgJGZpcnN0XCJcbiAgICAgICAgW2FsaWduXT1cImNvbHVtbi5udW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzc109XCJjb2x1bW5DbGFzc2VzKGNvbHVtbiwgJGluZGV4LCBwaW5uZWQoKSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlclRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93W2NvbHVtbi5jb2x1bW5dLCByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICB9XG4gIH1cbjwvZnMtbGlzdD5cblxuQGlmIChjYXB0aW9uKCkpIHtcbiAgPGRpdiBjbGFzcz1cImxpc3QtY2FwdGlvbiBzbWFsbFwiPlxuICAgIHt7IGNhcHRpb24oKSB9fVxuICA8L2Rpdj5cbn1cblxuPCEtLSBBIGNvbHVtbidzIGhlYWRpbmcsIHdpdGggd2hhdCBhbiBvdXRwdXQgY29sdW1uIGhvbGRzIGFzIGl0cyB0b29sdGlwIChhblxuICAgICBlbXB0eSBvbmUgbmV2ZXIgc2hvd3MpLiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjaGVhZGVyVHBsXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPHNwYW4gW21hdFRvb2x0aXBdPVwiY29sdW1uTm90ZXMoKVtjb2x1bW4uY29sdW1uXSA/PyAnJ1wiPnt7IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBPbmUgY2VsbCwgaW4gdGhlIGJvZHkgYW5kIHRoZSB0b3RhbHMgcm93IGFsaWtlOiBhbiBvdXRwdXQgY29sdW1uIGJ5IHdoYXRcbiAgICAgaXQgaG9sZHMgKGl0cyByb3cgZ2l2ZXMgYSBjaGFuZ2UgaXRzIHByaW9yKSwgYSBkYXRlIGNvbHVtbiBhcyBhIGRheSBpbiB0aGVcbiAgICAgcmVwb3J0J3Mgem9uZSBhbmQgbG9jYWxlLCBhbnkgb3RoZXIgdGhyb3VnaCBpdHMgbnVtYmVyIGZvcm1hdC4gLS0+XG48bmctdGVtcGxhdGVcbiAgI2NlbGxUcGxcbiAgbGV0LXZhbHVlXG4gIGxldC1yb3c9XCJyb3dcIlxuICBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIEBpZiAob3V0cHV0Q29sdW1ucygpW2NvbHVtbi5jb2x1bW5dOyBhcyBvdXRwdXQpIHtcbiAgICBAaWYgKHJvdyB8IGZzUmVwb3J0T3V0cHV0OiBjb2x1bW4gOiBvdXRwdXQgOiBmb3JtYXRDb250ZXh0KCk7IGFzIGNlbGwpIHtcbiAgICAgIDxzcGFuIFthdHRyLnRpdGxlXT1cImNlbGwudGl0bGVcIj57eyBjZWxsLnRleHQgfX08L3NwYW4+XG4gICAgfVxuICB9IEBlbHNlIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0RGF0ZTogdGltZXpvbmUoKSA6IGZvcm1hdENvbnRleHQoKS5sb2NhbGUgfX1cbiAgfSBAZWxzZSB7XG4gICAge3sgdmFsdWUgfCBmc1JlcG9ydE51bWJlcjogY29sdW1uIDogZm9ybWF0Q29udGV4dCgpIH19XG4gIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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SUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcscUJBQXFCLEtBQUssRUFBRSxDQUFDO1lBQzFDLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFFbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUVELElBQUksSUFBSSxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7d0dBOVhVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLG1aQUtTLGVBQWUsZ0VDdEYzRCwrNUlBcUhBLHNnRUQ3Q0ksc0JBQXNCLHVJQUN0QixZQUFZLCt5QkFDWixVQUFVLGlSQUNWLGdCQUFnQiwrSUFDaEIsY0FBYyxnREFDZCxnQkFBZ0Isa0RBQ2hCLGdCQUFnQjs7NEZBR1Asc0JBQXNCO2tCQWhCbEMsU0FBUzsrQkFDRSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLHNCQUFzQjt3QkFDdEIsWUFBWTt3QkFDWixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLGdCQUFnQjtxQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyUmVuZGVyUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgT25Jbml0LFxuICBhZnRlck5leHRSZW5kZXIsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZywgRnNMaXN0TW9kdWxlLCBQYWdpbmF0aW9uU3RyYXRlZ3kgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwLCBtZXJnZSwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgZm9ybWF0UGxhaW5OdW1iZXIsIGhhc051bWJlckZvcm1hdCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIExpc3RDb2x1bW4sXG4gIExpc3RDb25maWcsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0U29ydCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIExJU1RfVE9UQUxfTEFCRUwsXG4gIExpc3RPdXRwdXRDb2x1bW4sXG4gIGNvbHVtbkNsYXNzZXMsXG4gIGxpc3RPdXRwdXRDb2x1bW5zLFxuICBsaXN0UGlubmVkQ29sdW1ucyxcbiAgbGlzdFNvcnRUZXJtcyxcbiAgbGlzdFRvdGFsc0xhYmVsQ29sdW1uLFxufSBmcm9tICcuLi8uLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQgeyBwaXZvdENvbHVtblNwZWNzIH0gZnJvbSAnLi4vLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZURhdGEsIG91dHB1dENvbHVtbk5vdGUgfSBmcm9tICcuLi8uLi9vdXRwdXQtbm90ZXMnO1xuaW1wb3J0IHsgUmVwb3J0RGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtZGF0ZS5waXBlJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0T3V0cHV0UGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1vdXRwdXQucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cblxuLy8gQSBsaXN0IGNvbXBvbmVudDogYW4gRnNMaXN0IHJlbmRlcmVkIGZyb20gdGhlIGNvbXBvbmVudCdzIGNvbmZpZy4gSXQgaGFzIG5vXG4vLyBmaWx0ZXIgYmFyIG9mIGl0cyBvd246IGl0cyBmaWx0ZXJzIGFyZSBncm91cC1rZXllZCBsaWtlIGV2ZXJ5IG90aGVyXG4vLyBjb21wb25lbnQncywgc28gY29tcG9uZW50LWxldmVsIGdyb3VwcyByZW5kZXIgaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIgc3RyaXBcbi8vIChSZXBvcnRDb21wb25lbnRDb21wb25lbnQpIGFuZCByZXBvcnQtbGV2ZWwgZ3JvdXBzIGluIHRoZSByZXBvcnQgYmFyLCBhbmRcbi8vIGV2ZXJ5IHJlcXVlc3QgdGFrZXMgaXRzIHZhbHVlcyBmcm9tIHRoZSBzaGFyZWQgZmlsdGVyLXN0YXRlIHNlcnZpY2UuXG4vLyBQYWdpbmcgYW5kIHNvcnRpbmcgYXJlIHB1c2hlZCBpbnRvIHRoZSBTUUwgd3JhcCBzZXJ2ZXItc2lkZS5cbi8vXG4vLyBBIGxpc3Qgd2hvc2UgcXVlcnkgY29tcGFyZXMsIHdpbmRvd3MsIHJhbmtzIG9yIHNoYXJlcyBzYXlzIHNvOiB0aGUgc2hhcmVkXG4vLyBub3RlIGFib3ZlIGl0IG5hbWVzIHRoZSB3aW5kb3dzIGEgY29tcGFyaXNvbiBjb21wYXJlcywgZWFjaCBzdWNoIGNvbHVtbidzXG4vLyBoZWFkZXIgdG9vbHRpcCBzYXlzIHdoYXQgaXQgaG9sZHMsIGFuZCBpdHMgY2VsbHMgKHRvdGFscyBpbmNsdWRlZCwgd2hpY2ggdGhlXG4vLyBzZXJ2ZXIgY29tcHV0ZXMpIGFyZSB3cml0dGVuIGJ5IHdoYXQgdGhleSBob2xkLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCxcbiAgICBGc0xpc3RNb2R1bGUsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFJlcG9ydERhdGVQaXBlLFxuICAgIFJlcG9ydE51bWJlclBpcGUsXG4gICAgUmVwb3J0T3V0cHV0UGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0Q29tcG9uZW50ID0gdmlld0NoaWxkKEZzTGlzdENvbXBvbmVudCk7XG5cbiAgcHVibGljIGxpc3RDb25maWc6IEZzTGlzdENvbmZpZztcblxuICAvLyBBIHBsYWluIGxpc3QncyBjb2x1bW5zIGFyZSBhdXRob3JlZCBhbmQgZml4ZWQgYXQgaW5pdC4gQSBjcm9zcy10YWIncyBhcmVcbiAgLy8gdGhlIHBpdm90IGRpbWVuc2lvbidzIFZBTFVFUywgc28gdGhleSBhcnJpdmUgd2l0aCB0aGUgcm93cyBhbmQgY2hhbmdlXG4gIC8vIHdoZW5ldmVyIHRoZSBmaWx0ZXJzIGRvIOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBhIHNpZ25hbCByYXRoZXIgdGhhbiB0aGVcbiAgLy8gb25lLXNob3QgcmVhZCBpdCB1c2VkIHRvIGJlLiBgbnVtZXJpY2AgbWFya3MgYSBjb2x1bW4gd2hvc2UgY2VsbHMgYXJlXG4gIC8vIGZvcm1hdHRlZCBudW1iZXJzLCBkZWNpZGVkIG9uY2UgaGVyZSByYXRoZXIgdGhhbiBwZXIgY2VsbCwgc28gdGhlIGNvbHVtblxuICAvLyBhbmQgaXRzIGhlYWRlciBhcmUgcmlnaHQtYWxpZ25lZC5cbiAgcHVibGljIGNvbHVtbnMgPSBzaWduYWw8KExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXT4oW10pO1xuXG4gIC8vIEEgY3Jvc3MtdGFiIHNvcnRzIG9ubHkgYnkgaXRzIHJvdy1rZXkgY29sdW1uOiBldmVyeSBvdGhlciBoZWFkZXIgaXMgYVxuICAvLyBwaXZvdCB2YWx1ZSwgYW5kIHRoZSBzZXJ2ZXIgb3JkZXJzIHRoZSBsb25nIHJvd3MgYmVmb3JlIHBpdm90aW5nLCBzbyBhXG4gIC8vIGNsaWNrIG9uIFwiTWFyIDIwMjZcIiBoYXMgbm90aGluZyB0byBvcmRlciBieS5cbiAgcHVibGljIHBpdm90ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIEEgY3V0IHJlc3VsdCBpcyB3b3JzZSBmb3IgYSBncmlkIHRoYW4gZm9yIGEgbGlzdDogdGhlIGN1dCBsYW5kcyBvbiB0aGUgTE9OR1xuICAvLyByb3dzIGJlZm9yZSB0aGUgcmVzaGFwZSwgc28gYSBwaXZvdCB2YWx1ZSBsaXZpbmcgb25seSBpbiB0aGUgdGFpbCB2YW5pc2hlc1xuICAvLyBhcyBhIHdob2xlIENPTFVNTiBhbmQgc3RyYWRkbGVkIGNlbGxzIGNvbWUgYmFjayBibGFuaywgaW5kaXN0aW5ndWlzaGFibGVcbiAgLy8gZnJvbSBhIHJlYWwgemVyby4gVGhlIHBhcmVudCdzIHRydW5jYXRpb24gYmFubmVyIG5ldmVyIGZpcmVzIGZvciBhIGxpc3RcbiAgLy8gKGl0IG9ubHkgcmVuZGVycyB3aGF0IF9sb2FkKCkgZmV0Y2hlZCwgd2hpY2ggbGlzdHMgc2tpcCksIHNvIHRoZSB3YXJuaW5nXG4gIC8vIGJlbG9uZ3MgaGVyZS5cbiAgcHVibGljIHRydW5jYXRlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gV2h5IHRoZSBzZWFyY2ggYm94IGRpZCBub3QgbmFycm93IHRoZSByb3dzICh0aGUgbGlzdCBoYXMgbm8gdGV4dCBjb2x1bW4gdG9cbiAgLy8gc2VhcmNoKSwgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMTsgbnVsbCB3aGVuIHRoZSBzZWFyY2ggYXBwbGllZCBvciBub25lIHdhc1xuICAvLyBtYWRlLlxuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoTm90ZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBjb25maWcudG90YWxzLCByZWFkIG9uY2UgYXQgaW5pdDogYSBsaXN0IHdpdGggdG90YWxzIHJlbmRlcnMgaXRzIGNvbHVtbnNcbiAgLy8gd2l0aCBhIGZvb3RlciB0ZW1wbGF0ZSwgd2hpY2ggZnMtbGlzdCByZWFkcyBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZW0uXG4gIHB1YmxpYyByZWFkb25seSBzaG93VG90YWxzID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBUaGUgdG90YWxzIHJvdyBmcm9tIHRoZSBsYXRlc3QgcGFnZSAxLCByYXcgdmFsdWVzIGtleWVkIGxpa2UgdGhlIGNvbHVtbnM7XG4gIC8vIG51bGwgd2hlbiB0aGUgbGlzdCBoYXMgbm9uZSwgb3IgdGhlIHNlcnZlciBzYXlzIHdoeSBpbiB0b3RhbHNOb3RlLlxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbD4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsc05vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIGxhdGVzdCBwYWdlIDEncyBjb21wYXJpc29uIHdpbmRvd3MsIHRpbWVmcmFtZSBhbmQgb3V0cHV0IG1ldGFkYXRhLCBmb3JcbiAgLy8gdGhlIG5vdGUgYWJvdmUgdGhlIGxpc3QsIHRoZSBoZWFkZXIgdG9vbHRpcHMgYW5kIHRoZSBvdXRwdXQgY2VsbHM7IG51bGxcbiAgLy8gdW50aWwgaXQgYXJyaXZlcywgYW5kIGVtcHR5IG9mIGV2ZXJ5IGtleSBmb3IgYSBsaXN0IHRoYXQgaGFzIG5vbmUuXG4gIHB1YmxpYyByZWFkb25seSBub3RlRGF0YSA9IHNpZ25hbDxDb21wb25lbnROb3RlRGF0YSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEhvdyBtYW55IHJvd3MgdGhlIGxpc3Qgc2hvd3MgKGxvYWQgbW9yZSBhcHBlbmRzKSBvdXQgb2YgaG93IG1hbnkgaXRzXG4gIC8vIGZpbHRlcnMga2VlcC4gQSBjcm9zcy10YWIgY291bnRzIGdyaWQgcm93cy5cbiAgcHVibGljIHJlYWRvbmx5IHJvd0NvdW50ID0gc2lnbmFsPHsgc2hvd246IG51bWJlcjsgdG90YWw6IG51bWJlciB9IHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lLCB3aGljaCBkYXRlIGNlbGxzIHJlbmRlciBpbi4gSW5qZWN0ZWQgcmlnaHRcbiAgLy8gaGVyZSByYXRoZXIgdGhhbiByZWFkIG9mZiBfZmlsdGVyU3RhdGUsIHdoaWNoIGlzIGRlY2xhcmVkIGZ1cnRoZXIgZG93biBhbmRcbiAgLy8gaXMgc3RpbGwgdW5kZWZpbmVkIHdoaWxlIHRoaXMgaW5pdGlhbGl6ZXIgcnVucy5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkudGltZXpvbmU7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZm9ybWF0IGNvbnRleHQ6IGRhdGUgY2VsbHMsIG51bWJlciBjZWxscyBhbmQgYVxuICAvLyBjcm9zcy10YWIncyBwZXJpb2QgaGVhZGluZ3MgYXJlIHdyaXR0ZW4gaW4gaXRzIGxvY2FsZSAoYW5kIG1vbmV5IGluIGl0c1xuICAvLyBjdXJyZW5jeSkuIEluamVjdGVkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKS5mb3JtYXRDb250ZXh0O1xuXG4gIHB1YmxpYyByZWFkb25seSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0ID0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdDtcblxuICAvLyBIb3cgbWFueSBsZWFkaW5nIGNvbHVtbnMgc3RheSBpbiB2aWV3IHdoaWxlIHRoZSBsaXN0IHNjcm9sbHMgc2lkZXdheXMuXG4gIHB1YmxpYyByZWFkb25seSBwaW5uZWQgPSBjb21wdXRlZCgoKSA9PiBsaXN0UGlubmVkQ29sdW1ucyh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZykpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb2x1bW5DbGFzc2VzID0gY29sdW1uQ2xhc3NlcztcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgb24gdGhpcyBsaXN0ICh0aGUgQ29sdW1ucyBkaWFsb2cpLiBmcy1saXN0XG4gIC8vIGhpZGVzIGFuZCBzaG93cyB0aGVtIGluIHBsYWNlIHRocm91Z2ggW3Nob3ddLCBzbyB0aGUgcm93c1xuICAvLyBhbHJlYWR5IGZldGNoZWQgc3RhbmQuXG4gIHB1YmxpYyByZWFkb25seSBoaWRkZW4gPSBjb21wdXRlZCgoKSA9PiBuZXcgU2V0KHRoaXMuX2ZpbHRlclN0YXRlLmhpZGRlbkNvbHVtbnModGhpcy5jb21wb25lbnQoKS5pZCkpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxMYWJlbCA9IExJU1RfVE9UQUxfTEFCRUw7XG5cbiAgLy8gVGhlIGNvbHVtbnMgdGhhdCBob2xkIGEgY29tcGFyZWQsIHdpbmRvd2VkLCByYW5rZWQgb3Igc2hhcmVkIG91dHB1dCwgYnlcbiAgLy8gbmFtZTsgdGhlIHJlc3QgYXJlIHdyaXR0ZW4gYXMgYmVmb3JlLlxuICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0Q29sdW1ucyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIExpc3RPdXRwdXRDb2x1bW4+PigoKSA9PiBsaXN0T3V0cHV0Q29sdW1ucyhcbiAgICB0aGlzLmNvbHVtbnMoKSxcbiAgICB0aGlzLm5vdGVEYXRhKCksXG4gICAgKCh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZykuY29sdW1ucyA/PyBbXSxcbiAgKSk7XG5cbiAgLy8gRWFjaCBjb2x1bW4ncyBoZWFkZXIgdG9vbHRpcDogd2hhdCBhbiBvdXRwdXQgY29sdW1uIGhvbGRzICgnJyBmb3IgYW55XG4gIC8vIG90aGVyKS5cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbk5vdGVzID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jb2x1bW5zKClcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gW2NvbHVtbi5jb2x1bW4sIG91dHB1dENvbHVtbk5vdGUoY29sdW1uLmNvbHVtbiwgdGhpcy5ub3RlRGF0YSgpLCBsb2NhbGUpXSkpO1xuICB9KTtcblxuICAvLyBUaGUgY29sdW1uIHdob3NlIGZvb3RlciBjZWxsIHJlYWRzICdUb3RhbCc6IHRoZSBmaXJzdCBvbmUgc2hvd24sIHVubGVzc1xuICAvLyBpdCBob2xkcyBhIHRvdGFsIGl0c2VsZi5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsc0xhYmVsQ29sdW1uID0gY29tcHV0ZWQoKCkgPT4gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKFxuICAgIHRoaXMuY29sdW1ucygpLmZpbHRlcigoY29sdW1uKSA9PiAhdGhpcy5oaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbikpLFxuICAgIHRoaXMudG90YWxzKCksXG4gICkpO1xuXG4gIC8vIFRoZSBsaW5lIHVuZGVyIHRoZSBsaXN0OiBpdHMgcm93IGNvdW50LCB0aGVuIHdoeSBpdCBoYXMgbm8gdG90YWxzIGFuZCB3aHlcbiAgLy8gaXRzIHNlYXJjaCBuYXJyb3dlZCBub3RoaW5nLiBUaGUgZGlnaXRzIGFyZSB3cml0dGVuIGluIHRoZSByZXBvcnQnc1xuICAvLyBsb2NhbGUsIG5ldmVyIHRoZSBhcHAncy5cbiAgcHVibGljIHJlYWRvbmx5IGNhcHRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLnJvd0NvdW50KCk7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlO1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBjb25zdCB0b3RhbCA9IGZvcm1hdFBsYWluTnVtYmVyKGNvdW50LnRvdGFsLCBsb2NhbGUpO1xuICAgICAgcGFydHMucHVzaChjb3VudC5zaG93biA8IGNvdW50LnRvdGFsXG4gICAgICAgID8gYFNob3dpbmcgJHtmb3JtYXRQbGFpbk51bWJlcihjb3VudC5zaG93biwgbG9jYWxlKX0gb2YgJHt0b3RhbH1gXG4gICAgICAgIDogYCR7dG90YWx9IHJvdyhzKWApO1xuICAgIH1cblxuICAgIHJldHVybiBbLi4ucGFydHMsIHRoaXMudG90YWxzTm90ZSgpLCB0aGlzLnNlYXJjaE5vdGUoKV1cbiAgICAgIC5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiAhIXBhcnQpXG4gICAgICAuam9pbignIMK3ICcpO1xuICB9KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIF9waW5PZmZzZXRzUmVmOiBBZnRlclJlbmRlclJlZiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEhpZGluZyBvciBzaG93aW5nIGEgY29sdW1uIG1vdmVzIHRoZSBwaW5uZWQgY29sdW1ucyBhZnRlciBpdC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRkZW4oKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcbiAgICB0aGlzLnBpdm90ZWQuc2V0KCEhY29uZmlnLnBpdm90Qnk/LmNvbHVtbik7XG4gICAgdGhpcy5zaG93VG90YWxzLnNldChjb25maWcudG90YWxzID09PSB0cnVlKTtcbiAgICB0aGlzLmNvbHVtbnMuc2V0KChjb25maWcuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfSkpKTtcblxuICAgIHRoaXMuX2luaXRMaXN0Q29uZmlnKGNvbmZpZyk7XG4gICAgdGhpcy5fb2JzZXJ2ZVBpbk9mZnNldHMoKTtcblxuICAgIC8vIEEgY2hhbmdlIHRvIGFueSBncm91cCB0aGlzIGxpc3QncyBmaWx0ZXJzIGJlbG9uZyB0byAoZnJvbSB0aGUgcmVwb3J0IGJhclxuICAgIC8vIG9yIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwKSByZS1ydW5zIHRoZSBsaXN0LCBhIGZpbHRlciBhZGRlZCBzaW5jZVxuICAgIC8vIHRoZSBsaXN0IHdhcyBkcmF3biBpbmNsdWRlZC4gU28gZG9lcyBhIGNoYW5nZSBvZiB0aGUgdGV4dCBpbiBpdHMgc2VhcmNoXG4gICAgLy8gYm94IChpbiB0aGUgY29tcG9uZW50IGhlYWRlcikuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcih0aGlzLmNvbXBvbmVudCksIHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudC5pZCkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHRoaXMubGlzdENvbXBvbmVudCgpPy5yZWxvYWQoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRMaXN0Q29uZmlnKGNvbmZpZzogTGlzdENvbmZpZyk6IHZvaWQge1xuICAgIC8vIFRoZSB2aWV3ZXIncyBsYXN0IHNvcnQgd2lucyBvdmVyIHRoZSBhdXRob3JlZCBvbmUsIHNvIGEgbGlzdCByZWNyZWF0ZWRcbiAgICAvLyBpbiB0aGUgc2FtZSBzZXNzaW9uIChwYWdlIHN3aXRjaCwgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGtlZXBzIGl0LlxuICAgIC8vIGZzLWxpc3QgaG9sZHMgb25lIHNvcnRpbmcgY29sdW1uLCBzbyBpdCBzaG93cyB0aGUgYXV0aG9yZWQgc29ydCdzIGZpcnN0XG4gICAgLy8gdGVybTsgdGhlIHJlcXVlc3Qgc2VuZHMgb25seSB0aGF0IHRlcm0gYW5kIHRoZSBzZXJ2ZXIgYXBwZW5kcyB0aGUgcmVzdC5cbiAgICBjb25zdCBzb3J0OiBSZXBvcnRTb3J0IHwgdW5kZWZpbmVkID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQodGhpcy5jb21wb25lbnQoKS5pZClcbiAgICAgID8/IGxpc3RTb3J0VGVybXMoY29uZmlnKVswXTtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBGc0xpc3QgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIHNvcnQvcGFnaW5nIHN0YXRlLiBUaGUgc29ydFxuICAgICAgLy8gaXMga2VwdCBpbiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgKHNldExpc3RTb3J0KSwgYW5kIHBhZ2luZyBzdGF5c1xuICAgICAgLy8gb3V0IG9mIGl0LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICAgICAgPyB7IHZhbHVlOiBzb3J0LmNvbHVtbiwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPHsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgcGFnaW5nOiBhbnkgfT4ge1xuICAgIC8vIE1hbnkvbG9hZC1tb3JlIHNlbmRzIGBvZmZzZXRgICsgYGxpbWl0YCAobm90IGBwYWdlYCk7IGRlcml2ZSB0aGUgcGFnZSBzb1xuICAgIC8vIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkLiBQYWdlIHN0cmF0ZWd5IHN0aWxsIHNlbmRzXG4gICAgLy8gYHBhZ2VgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHBhZ2VTaXplID0gcXVlcnkubGltaXQgPz8gMjU7XG4gICAgY29uc3QgcGFnZSA9IHF1ZXJ5LnBhZ2VcbiAgICAgID8/IChxdWVyeS5vZmZzZXQgIT0gbnVsbCA/IE1hdGguZmxvb3IocXVlcnkub2Zmc2V0IC8gcGFnZVNpemUpICsgMSA6IDEpO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHtcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JkZXIgPSBTdHJpbmcocXVlcnkub3JkZXIgPz8gJycpO1xuICAgIGlmIChvcmRlcikge1xuICAgICAgY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSA9IG9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICBzdGF0ZS5zb3J0ID0geyBjb2x1bW4sIGRpcmVjdGlvbjogZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNvcnQoY29tcG9uZW50LCBzdGF0ZS5zb3J0ID8/IG51bGwpO1xuXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaChjb21wb25lbnQuaWQpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXBzIHRoYXQgbWF0Y2ggJ2FueScsIGFzIGV2ZXJ5IG90aGVyIHJlYWQgb2YgdGhpcyB0aWxlIHNlbmRzXG4gICAgLy8gdGhlbSAodGlsZURhdGFTdGF0ZSkuIFRoZSBzb3J0IGFuZCBwYWdpbmcgYWJvdmUgYXJlIEZzTGlzdCdzIG93bi5cbiAgICBjb25zdCB7IG1hdGNoQW55R3JvdXBJZHMgfSA9IHRoaXMuX2ZpbHRlclN0YXRlLnRpbGVTdGF0ZShjb21wb25lbnQpO1xuICAgIGlmIChtYXRjaEFueUdyb3VwSWRzKSB7XG4gICAgICBzdGF0ZS5tYXRjaEFueUdyb3VwSWRzID0gbWF0Y2hBbnlHcm91cElkcztcbiAgICB9XG5cbiAgICAvLyBPbmUgc291cmNlIGZvciBmaWx0ZXIgdmFsdWVzLCB0aGUgc2FtZSBvbmUgY2hhcnRzLCBLUElzIGFuZCB0aGUgZXhwb3J0c1xuICAgIC8vIHJlYWQsIHNvIHRoZSBsaXN0IGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgaXRzIGhlYWRlciBzdHJpcCBzaG93cy5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGFcbiAgICAgIC5jb21wb25lbnREYXRhKHRoaXMucmVwb3J0SWQoKSwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICAvLyBBIGNyb3NzLXRhYidzIGhlYWRlcnMgY29tZSBiYWNrIHdpdGggdGhlIHJvd3M6IHRoZSByb3cta2V5IGNvbHVtblxuICAgICAgICAgIC8vIGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUuIFJlLXJlYWQgdGhlbSBvbiBldmVyeSBmZXRjaCwgc2luY2VcbiAgICAgICAgICAvLyBhIGZpbHRlciBjaGFuZ2UgY2FuIGFkZCBvciByZW1vdmUgYSBjb2x1bW4uXG4gICAgICAgICAgaWYgKHRoaXMucGl2b3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc2V0KHRoaXMuX3Bpdm90Q29sdW1ucyhkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnRydW5jYXRlZC5zZXQoISFkYXRhLnRydW5jYXRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSBwYWdlIDEgY2FycmllcyB0aGUgbm90ZXMgYW5kIHRoZSB0b3RhbHM7IGEgbG9hZC1tb3JlIHBhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgdGhlbSBhcyB0aGV5IGFyZS5cbiAgICAgICAgICBpZiAoc3RhdGUucGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hOb3RlLnNldChkYXRhLnNlYXJjaE5vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFscy5zZXQoZGF0YS50b3RhbHMgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFsc05vdGUuc2V0KGRhdGEudG90YWxzTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMubm90ZURhdGEuc2V0KHRoaXMuX25vdGVEYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc2VydmVyJ3MgcGFnZSBzaXplIHdoZW4gaXQgc2VuZHMgb25lIChpdCBjbGFtcHMgdGhlIHJlcXVlc3QpLFxuICAgICAgICAgIC8vIHRoZSBzaXplIHRoZSBwYWdpbmcgYmVsb3cgaGFuZHMgZnMtbGlzdCB0b28uXG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZTtcbiAgICAgICAgICBjb25zdCBzaG93biA9IChzdGF0ZS5wYWdlIC0gMSkgKiBzaXplICsgKGRhdGEucm93cz8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgIHRoaXMucm93Q291bnQuc2V0KHsgc2hvd24sIHRvdGFsOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gc2hvd24gfSk7XG5cbiAgICAgICAgICAvLyBOZXcgcm93cyBjYW4gd2lkZW4gYSBwaW5uZWQgY29sdW1uLCB3aGljaCBtb3ZlcyB0aGUgb25lcyBhZnRlciBpdC5cbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlIGJ5IHBpdm90Q29sdW1uU3BlY3MoKTogdGhlIHNhbWVcbiAgLy8gaGVhZGluZ3MgYW5kIGNlbGwgZm9ybWF0IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgZXhwb3J0cyB1c2UuIEEgY2VsbCBjb2x1bW5cbiAgLy8gd2hvc2UgbWVhc3VyZSBpcyBhIHJhbmsgb3IgYSBzaGFyZSAoY2VsbE1lYXN1cmVzIG5hbWVzIGl0KSBob2xkcyBudW1iZXJzXG4gIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBncmlkIG5hbWVzIGEgY2VsbCBmb3JtYXQuXG4gIHByaXZhdGUgX3Bpdm90Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogKExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXSB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIGNvbnN0IG91dHB1dENlbGxzID0gT2JqZWN0LmtleXMobGlzdE91dHB1dENvbHVtbnMoXG4gICAgICAoZGF0YS5jb2x1bW5zID8/IFtdKS5zbGljZSgxKS5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBbXSxcbiAgICApKTtcblxuICAgIHJldHVybiBwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGNvbHVtbi5udW1lcmljIHx8IG91dHB1dENlbGxzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vdGVEYXRhKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb21wb25lbnROb3RlRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmlzb246IGRhdGEuY29tcGFyaXNvbixcbiAgICAgIHRpbWVmcmFtZTogZGF0YS50aW1lZnJhbWUsXG4gICAgICBvdXRwdXRzOiBkYXRhLm91dHB1dHMsXG4gICAgICBjZWxsTWVhc3VyZXM6IGRhdGEuY2VsbE1lYXN1cmVzLFxuICAgICAgd2luZG93czogZGF0YS53aW5kb3dzLFxuICAgICAgZ3JhbnVsYXJpdHk6IGRhdGEuZ3JhbnVsYXJpdHksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGJ1aWx0IGJlZm9yZSBhbnkgZGF0YSBhcnJpdmVzLCBzbyBhbiBvdXRwdXRcbiAgLy8gY29sdW1uIHRoYXQgbmFtZXMgbm8gZm9ybWF0IG9mIGl0cyBvd24gKGEgcmFuaywgYSBzaGFyZSwgYSBwcmlvciB0aGF0IHRha2VzXG4gIC8vIGl0cyBtZWFzdXJlJ3MgZm9ybWF0KSBsZWFybnMgaXQgaG9sZHMgbnVtYmVycyBmcm9tIHBhZ2UgMS4gZnMtbGlzdCByZWFkcyBhXG4gIC8vIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4sIHNvIGEgY29sdW1uIHdob3NlXG4gIC8vIGFsaWdubWVudCBjaGFuZ2VzIGlzIHJlYnVpbHQgKHRoZSB0ZW1wbGF0ZSB0cmFja3MgY29sdW1ucyBieSBib3RoKS5cbiAgcHJpdmF0ZSBfYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waXZvdGVkKCkgfHwgIWRhdGEub3V0cHV0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoKTtcbiAgICBjb25zdCBhbGlnbmVkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIHx8ICEhZGF0YS5vdXRwdXRzW2NvbHVtbi5jb2x1bW5dLFxuICAgIH0pKTtcblxuICAgIGlmIChhbGlnbmVkLnNvbWUoKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbi5udW1lcmljICE9PSBjb2x1bW5zW2luZGV4XS5udW1lcmljKSkge1xuICAgICAgdGhpcy5jb2x1bW5zLnNldChhbGlnbmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRpbGUgcmVzaXplIHJlZmxvd3MgdGhlIHRhYmxlJ3MgYXV0byBsYXlvdXQsIHNvIHRoZSBwaW5uZWQgY29sdW1ucydcbiAgLy8gd2lkdGhzLCBhbmQgd2l0aCB0aGVtIHRoZWlyIG9mZnNldHMsIGNoYW5nZS5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuX2Rlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICAvLyBNZWFzdXJlcyB0aGUgcGlubmVkIG9mZnNldHMgb25jZSB0aGUgbmV4dCByZW5kZXIgaGFzIGxhaWQgdGhlIHRhYmxlIG91dC5cbiAgLy8gT25lIHBlbmRpbmcgbWVhc3VyZW1lbnQgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgbWFkZSBiZWZvcmUgaXQgcnVucy4gT25seVxuICAvLyBhZnRlck5leHRSZW5kZXIgZXhpc3RzIGluIGV2ZXJ5IEFuZ3VsYXIgdmVyc2lvbiB0aGlzIGxpYnJhcnkgcnVucyBvbi5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0aGlzLl9waW5PZmZzZXRzUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVBpbk9mZnNldHMoKTtcbiAgICB9LCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgfVxuXG4gIC8vIEVhY2ggcGlubmVkIGNvbHVtbiBzdGlja3MgYXQgdGhlIHN1bW1lZCB3aWR0aCBvZiB0aGUgdmlzaWJsZSBwaW5uZWRcbiAgLy8gY29sdW1ucyBiZWZvcmUgaXQuIEEgaGlkZGVuIGNvbHVtbiByZW5kZXJzIG5vIGhlYWRlciwgc28gdGhlIG5leHQgcGlubmVkXG4gIC8vIG9uZSB0YWtlcyBpdHMgcGxhY2UuIEEgdmFyaWFibGUgaXMgd3JpdHRlbiBvbmx5IHdoZW4gaXRzIHZhbHVlIGNoYW5nZWQsXG4gIC8vIHdoaWNoIGtlZXBzIGEgcmVzaXplIGZyb20gcmVzdHlsaW5nIHRoZSB0YWJsZSBmb3Igbm90aGluZy5cbiAgcHJpdmF0ZSBfdXBkYXRlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBsZWZ0ID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBpbm5lZCgpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBob3N0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0aGVhZCB0aC5yZXBvcnQtcGluLSR7aW5kZXh9YCk7XG5cbiAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gYC0tcmVwb3J0LXBpbi1sZWZ0LSR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYCR7TWF0aC5yb3VuZChsZWZ0ICogMTAwKSAvIDEwMH1weGA7XG5cbiAgICAgIGlmIChob3N0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgIT09IHZhbHVlKSB7XG4gICAgICAgIGhvc3Quc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBsZWZ0ICs9IGhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjwhLS0gVGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBhbmQgd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuIEFcbiAgICAgd2luZG93ZWQgY29sdW1uJ3Mgb3duIG5vdGVzIGFyZSBpbiBpdHMgaGVhZGVyJ3MgdG9vbHRpcC4gLS0+XG48YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICBbZGF0YV09XCJub3RlRGF0YSgpXCJcbiAgW3dpbmRvd05vdGVzXT1cImZhbHNlXCI+XG48L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG5cbjwhLS0gZnMtbGlzdCByZWFkcyBhIGNvbHVtbidzIGZvb3RlciB0ZW1wbGF0ZSBvbmNlLCBhcyBhIGRpcmVjdCBjaGlsZCBvZlxuICAgICBmcy1saXN0LWNvbHVtbiwgc28gYSBsaXN0IHdpdGggdG90YWxzIHJlbmRlcnMgaXRzIGNvbHVtbnMgaW4gYSBicmFuY2ggb2ZcbiAgICAgdGhlaXIgb3duIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSBmb290ZXIgaW4gYW4gQGlmLiBJdHMgaGVhZGVyIHRlbXBsYXRlIHRvbyxcbiAgICAgd2hpY2ggZXZlcnkgY29sdW1uIGNhcnJpZXM6IGFuIG91dHB1dCBjb2x1bW4ncyB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcy5cbiAgICAgQ29sdW1ucyBhcmUgdHJhY2tlZCBieSBhbGlnbm1lbnQgYXMgd2VsbCBhcyBuYW1lLCBzaW5jZSBmcy1saXN0IHJlYWRzIGFcbiAgICAgY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbi4gLS0+XG48ZnMtbGlzdFxuICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICBbY2xhc3MucmVwb3J0LXRvdGFscy1lbXB0eV09XCIhdG90YWxzKClcIj5cbiAgQGlmIChzaG93VG90YWxzKCkpIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtZm9vdGVyPlxuICAgICAgICAgIEBpZiAodG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0sIHJvdzogdG90YWxzKCksIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jb2x1bW4gPT09IHRvdGFsc0xhYmVsQ29sdW1uKCkpIHtcbiAgICAgICAgICAgIHt7IHRvdGFsTGFiZWwgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfVxuPC9mcy1saXN0PlxuXG5AaWYgKGNhcHRpb24oKSkge1xuICA8ZGl2IGNsYXNzPVwibGlzdC1jYXB0aW9uIHNtYWxsXCI+XG4gICAge3sgY2FwdGlvbigpIH19XG4gIDwvZGl2PlxufVxuXG48IS0tIEEgY29sdW1uJ3MgaGVhZGluZywgd2l0aCB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgYXMgaXRzIHRvb2x0aXAgKGFuXG4gICAgIGVtcHR5IG9uZSBuZXZlciBzaG93cykuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNoZWFkZXJUcGxcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3BhbiBbbWF0VG9vbHRpcF09XCJjb2x1bW5Ob3RlcygpW2NvbHVtbi5jb2x1bW5dID8/ICcnXCI+e3sgY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIE9uZSBjZWxsLCBpbiB0aGUgYm9keSBhbmQgdGhlIHRvdGFscyByb3cgYWxpa2U6IGFuIG91dHB1dCBjb2x1bW4gYnkgd2hhdFxuICAgICBpdCBob2xkcyAoaXRzIHJvdyBnaXZlcyBhIGNoYW5nZSBpdHMgcHJpb3IpLCBhIGRhdGUgY29sdW1uIGFzIGEgZGF5IGluIHRoZVxuICAgICByZXBvcnQncyB6b25lIGFuZCBsb2NhbGUsIGFueSBvdGhlciB0aHJvdWdoIGl0cyBudW1iZXIgZm9ybWF0LiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjY2VsbFRwbFxuICBsZXQtdmFsdWVcbiAgbGV0LXJvdz1cInJvd1wiXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgQGlmIChvdXRwdXRDb2x1bW5zKClbY29sdW1uLmNvbHVtbl07IGFzIG91dHB1dCkge1xuICAgIEBpZiAocm93IHwgZnNSZXBvcnRPdXRwdXQ6IGNvbHVtbiA6IG91dHB1dCA6IGZvcm1hdENvbnRleHQoKTsgYXMgY2VsbCkge1xuICAgICAgPHNwYW4gW2F0dHIudGl0bGVdPVwiY2VsbC50aXRsZVwiPnt7IGNlbGwudGV4dCB9fTwvc3Bhbj5cbiAgICB9XG4gIH0gQGVsc2UgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnREYXRlOiB0aW1lem9uZSgpIDogZm9ybWF0Q29udGV4dCgpLmxvY2FsZSB9fVxuICB9IEBlbHNlIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0TnVtYmVyOiBjb2x1bW4gOiBmb3JtYXRDb250ZXh0KCkgfX1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==