@firestitch/report 18.7.0 → 18.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
  2. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +7 -1
  4. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
  6. package/app/reports/components/report-component/report-component.component.d.ts +2 -11
  7. package/app/reports/data/report.data.d.ts +0 -2
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
  10. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  11. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  12. package/app/reports/export/report-export-collector.service.d.ts +27 -1
  13. package/app/reports/export/report-pdf.service.d.ts +5 -0
  14. package/app/reports/export/report-pptx.service.d.ts +7 -0
  15. package/app/reports/format.d.ts +27 -1
  16. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  17. package/app/reports/interfaces/report.interface.d.ts +124 -4
  18. package/app/reports/kpi-card.d.ts +48 -0
  19. package/app/reports/layout.d.ts +0 -9
  20. package/app/reports/list-config.d.ts +8 -1
  21. package/app/reports/option-builder.d.ts +7 -0
  22. package/app/reports/output-notes.d.ts +14 -0
  23. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  24. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  25. package/app/reports/theme/palette.d.ts +3 -0
  26. package/app/reports/theme/typography.d.ts +1 -0
  27. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
  28. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
  29. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  30. package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
  31. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  32. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
  33. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
  34. package/esm2022/app/reports/data/report.data.mjs +5 -5
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
  37. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  38. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +101 -10
  40. package/esm2022/app/reports/export/report-pdf.service.mjs +249 -40
  41. package/esm2022/app/reports/export/report-pptx.service.mjs +312 -49
  42. package/esm2022/app/reports/format.mjs +423 -2
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/kpi-card.mjs +174 -0
  46. package/esm2022/app/reports/layout.mjs +1 -46
  47. package/esm2022/app/reports/list-config.mjs +33 -1
  48. package/esm2022/app/reports/option-builder.mjs +624 -54
  49. package/esm2022/app/reports/output-notes.mjs +158 -0
  50. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
  52. package/esm2022/app/reports/theme/palette.mjs +17 -1
  53. package/esm2022/app/reports/theme/typography.mjs +5 -1
  54. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  55. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  56. package/esm2022/public_api.mjs +2 -1
  57. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +2 -2
  58. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-qCBE3LqM.mjs.map} +1 -1
  59. package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +2574 -487
  60. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  61. package/fesm2022/firestitch-report.mjs +1 -1
  62. package/package.json +1 -1
  63. package/public_api.d.ts +1 -0
  64. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
@@ -3,10 +3,11 @@ import { forkJoin, from, map, of } from 'rxjs';
3
3
  import { catchError, mergeMap, toArray } from 'rxjs/operators';
4
4
  import { ReportData } from '../data/report.data';
5
5
  import { ReportListColumnFormat } from '../enums/report-list-column-format.enum';
6
- import { DAY_LONG, formatLocalDate, formatNumber, formatReportDate, hasNumberFormat, resolveReportTimezone, } from '../format';
6
+ import { DAY_LONG, formatLocalDate, formatNumber, formatOutputValue, formatReportDate, hasNumberFormat, resolveReportTimezone, } from '../format';
7
7
  import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
8
- import { LIST_TOTAL_LABEL, listHiddenColumns, listTotalsLabelColumn } from '../list-config';
8
+ import { LIST_TOTAL_LABEL, listHiddenColumns, listOutputColumns, listTotalsLabelColumn, } from '../list-config';
9
9
  import { pivotColumnSpecs } from '../option-builder';
10
+ import { componentNoteLines, componentWindowsLine } from '../output-notes';
10
11
  import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
11
12
  import { ReportFilterStateService } from '../services/report-filter-state.service';
12
13
  import * as i0 from "@angular/core";
@@ -65,7 +66,21 @@ export function coverLines(collected) {
65
66
  // its cellFormat) in the report's locale and currency. Any other value goes
66
67
  // out verbatim, and an empty one as ''. CSV never comes through here: its
67
68
  // values stay raw.
68
- export function exportCell(value, column, timezone, context) {
69
+ //
70
+ // An output column is written by what it holds, as the screen's cell is
71
+ // (formatOutputValue): a signed change, a percent change, a change of a rate
72
+ // in points, a rank, a share. Its row gives a change the prior beside it, so
73
+ // a missing baseline ('—') reads apart from a zero one ('n/a').
74
+ export function exportCell(value, column, timezone, context, row) {
75
+ const output = column.output;
76
+ if (output) {
77
+ return formatOutputValue(value, output.output, column, context, {
78
+ measureSpec: output.measureSpec,
79
+ prior: output.priorAlias && row ? row[output.priorAlias] : undefined,
80
+ floor: output.floor,
81
+ empty: '',
82
+ }).text;
83
+ }
69
84
  if (value === null || value === undefined) {
70
85
  return '';
71
86
  }
@@ -80,19 +95,33 @@ export function exportCell(value, column, timezone, context) {
80
95
  // headed by its periods in the report's locale, each pivot value formatted by
81
96
  // cellFormat. A plain list draws its configured columns but the ones the
82
97
  // viewer hid (`hidden`, kept to listHiddenColumns, so never all of them),
83
- // else every column the query returned, as it came.
98
+ // else every column the query returned, as it came. Output columns (the
99
+ // data's outputs, a cross-tab cell through cellMeasures) carry how they are
100
+ // written; without those keys the columns are exactly as before.
84
101
  export function listColumns(component, data, locale, hidden = []) {
85
102
  const config = (component.config ?? {});
86
103
  if (config.pivotBy?.column) {
87
- return pivotColumnSpecs(config, data, locale);
104
+ return withOutputColumns(pivotColumnSpecs(config, data, locale), data, []);
88
105
  }
89
106
  if (config.columns?.length) {
90
107
  const hiddenNames = listHiddenColumns(config, hidden);
91
- return config.columns
108
+ return withOutputColumns(config.columns
92
109
  .filter((column) => !hiddenNames.includes(column.column))
93
- .map((column) => ({ ...column, numeric: hasNumberFormat(column) }));
110
+ .map((column) => ({ ...column, numeric: hasNumberFormat(column) })), data, config.columns);
111
+ }
112
+ return withOutputColumns(data.columns.map((column) => ({ column, numeric: false })), data, []);
113
+ }
114
+ // The columns with their output metadata attached (listOutputColumns, as the
115
+ // screen's list resolves it): an output column holds numbers and is written
116
+ // by what it holds. Unchanged when the data has no outputs.
117
+ function withOutputColumns(columns, data, authored) {
118
+ if (!data.outputs) {
119
+ return columns;
94
120
  }
95
- return data.columns.map((column) => ({ column, numeric: false }));
121
+ const outputs = listOutputColumns(columns, data, authored);
122
+ return columns.map((column) => (outputs[column.column]
123
+ ? { ...column, numeric: true, output: outputs[column.column] }
124
+ : column));
96
125
  }
97
126
  // The heading over each column of listColumns(): a plain list's configured
98
127
  // label, else its column; a cross-tab's heading from pivotColumnSpecs().
@@ -111,7 +140,69 @@ export function listTotalsRow(data, columns, timezone, context) {
111
140
  const label = listTotalsLabelColumn(columns, totals);
112
141
  return columns.map((column) => (column.column === label
113
142
  ? LIST_TOTAL_LABEL
114
- : exportCell(totals[column.column], column, timezone, context)));
143
+ : exportCell(totals[column.column], column, timezone, context, totals)));
144
+ }
145
+ // The subtitle under a chart's or a list's title: the days it reads, and the
146
+ // days each comparison lane reads ('Sep 1 – 15, 2026 · vs previous month:
147
+ // Aug 1 – 15, 2026'), as the screen's note opens with. '' without a
148
+ // comparison or a timeframe, and for a KPI, whose card prints its own window
149
+ // line.
150
+ export function exportWindowsLine(item, timezone, locale) {
151
+ if (!item.data || item.component.type === 'kpi') {
152
+ return '';
153
+ }
154
+ return componentWindowsLine(item.data, { locale, timezone });
155
+ }
156
+ // The note lines under a component's box: why a comparison reads as it does,
157
+ // a KPI's delta note, and what each windowed value is and why. The days are
158
+ // left out (the subtitle or the KPI card prints them), and the window
159
+ // descriptions are in, since a file has no tooltip or header to carry them.
160
+ // Empty when the data has none of the keys.
161
+ export function exportNoteLines(item, timezone, locale) {
162
+ return componentNoteLines(item.data, { locale, timezone }, { windows: false, windowDescriptions: true });
163
+ }
164
+ // Whether a KPI card has more to draw than its value and label. Without, both
165
+ // exports draw the tile exactly as they always have.
166
+ export function kpiCardHasExtras(view, notes) {
167
+ return !!(view.delta || view.window || view.target || view.sparkline || notes.length);
168
+ }
169
+ // Which parts of a KPI card fit a tile `available` tall. A short tile sheds the
170
+ // sparkline first, then the target line, then the notes; the value, its label
171
+ // and the delta row always stay, and the window line stays whenever the card
172
+ // shows a comparison (its days are what the delta is measured over). The
173
+ // sparkline needs values to draw.
174
+ export function kpiExportParts(view, notes, available, heights) {
175
+ const parts = {
176
+ delta: !!view.delta,
177
+ window: !!view.window,
178
+ target: !!view.target,
179
+ sparkline: !!view.sparkline?.values.some((value) => value !== null),
180
+ notes: [...notes],
181
+ };
182
+ const height = () => kpiExportHeight(view, parts, heights);
183
+ if (height() > available) {
184
+ parts.sparkline = false;
185
+ }
186
+ if (height() > available) {
187
+ parts.target = false;
188
+ }
189
+ while (height() > available && parts.notes.length) {
190
+ parts.notes.pop();
191
+ }
192
+ if (height() > available && !parts.delta) {
193
+ parts.window = false;
194
+ }
195
+ return parts;
196
+ }
197
+ // How tall the card's drawn parts stand together, in the heights' unit.
198
+ export function kpiExportHeight(view, parts, heights) {
199
+ return heights.value
200
+ + (view.label ? heights.label : 0)
201
+ + (parts.delta ? heights.delta : 0)
202
+ + (parts.window ? heights.window : 0)
203
+ + (parts.target ? heights.target : 0)
204
+ + (parts.sparkline ? heights.sparkline : 0)
205
+ + parts.notes.length * heights.note;
115
206
  }
116
207
  // The last row of an exported list table that stops short of its result: how
117
208
  // many rows the file leaves out and where the whole set can be had. Each
@@ -291,4 +382,4 @@ export class ReportExportCollectorService {
291
382
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
292
383
  type: Injectable
293
384
  }] });
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixxQkFBcUIsR0FDdEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUdMLG1CQUFtQixHQVNwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUF5Q25GLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsNkVBQTZF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J0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHtcbiAgREFZX0xPTkcsXG4gIGZvcm1hdExvY2FsRGF0ZSxcbiAgZm9ybWF0TnVtYmVyLFxuICBmb3JtYXRSZXBvcnREYXRlLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRMb2NhbGVUYWcsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMSVNUX1RPVEFMX0xBQkVMLCBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFRvdGFsc0xhYmVsQ29sdW1uIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbiAgLy8gVGhlIHRleHQgYSBsaXN0IHdhcyBzZWFyY2hlZCBieSB3aGVuIGl0IHdhcyBmZXRjaGVkOyBhYnNlbnQgd2hlbiBpdHNcbiAgLy8gc2VhcmNoIGJveCB3YXMgZW1wdHksIGFuZCBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBwbGFpbiBsaXN0LCB3aGljaCBpdHMgdGFibGUgbGVhdmVzXG4gIC8vIG91dCAobGlzdENvbHVtbnMpOyBlbXB0eSBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSBhbmRcbiAgLy8gdGhlIGN1cnJlbmN5IHRoZSBzZXJ2ZXIgcmVzb2x2ZWQgZm9yIHRoZSByZXBvcnQuIEVhY2ggaXMgbGVmdCBvdXQgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGRvZXMgbm90IHNlbmQgaXQsIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlclxuICAvLyB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKGl0cyBsb2NhbGUsIGN1cnJlbmN5XG4gIC8vIGFuZCBwZXJjZW50IGZvcm0pLCByZWFkIG9uY2Ugc28gZXZlcnkgcGFnZSBvZiB0aGUgZmlsZSBhZ3JlZXMuXG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG59XG5cbi8vIE9uZSBleHBvcnRlZCBsaXN0IGNvbHVtbjogdGhlIGNlbGwga2V5LCBpdHMgaGVhZGluZyBhbmQgaXRzIGZvcm1hdCwgYW5kXG4vLyB3aGV0aGVyIGl0cyBjZWxscyBhcmUgZm9ybWF0dGVkIG51bWJlcnMsIHdoaWNoIGV2ZXJ5IGV4cG9ydCByaWdodC1hbGlnbnNcbi8vIChoZWFkZXIgaW5jbHVkZWQpIGFzIHRoZSBzY3JlZW4gZG9lcy5cbmV4cG9ydCB0eXBlIEV4cG9ydExpc3RDb2x1bW4gPSBMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH07XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBBIGNvbXBvbmVudCdzIHRpdGxlIGFzIGFuIGV4cG9ydGVkIGZpbGUgcHJpbnRzIGl0LiBBIHNlYXJjaGVkIGxpc3Qgc2F5cyBzbyxcbi8vIHNpbmNlIGl0cyB0YWJsZSBob2xkcyBvbmx5IHRoZSBtYXRjaGluZyByb3dzOiAnT3JkZXJzIChtYXRjaGluZyBcIm5vcnRoXCIpJy5cbi8vIEFuIHVudGl0bGVkIG9uZSByZWFkcyAnTWF0Y2hpbmcgXCJub3J0aFwiJy4gJycgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHByaW50LlxuLy8gU2hhcmVkIGJ5IHRoZSBQREYgYW5kIHRoZSBkZWNrLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgYWx3YXlzIGxlYWRzICh0aGUgUG93ZXJQb2ludCBtYXJrcyB0aGF0IGxpbmUgYXMgd3JpdHRlbiBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSkuIEl0IGlzIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLCB0aGUgc2FtZSBkYXkgaXRzIGZpbHRlcnNcbi8vIHJlc29sdmUgXCJ0b2RheVwiIHRvLCB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXRMb2NhbERhdGUoXG4gICAgICBuZXcgRGF0ZSgpLFxuICAgICAgY29sbGVjdGVkLmZvcm1hdENvbnRleHQubG9jYWxlLFxuICAgICAgREFZX0xPTkcsXG4gICAgICByZXNvbHZlUmVwb3J0VGltZXpvbmUoY29sbGVjdGVkLnJlcG9ydCksXG4gICAgKSxcbiAgICAuLi5jb2xsZWN0ZWQuZmlsdGVyU3VtbWFyeSxcbiAgICAuLi5jb2xsZWN0ZWQuY29udGV4dExpbmVzLFxuICBdO1xufVxuXG4vLyBBbiBleHBvcnRlZCBsaXN0IGNlbGwsIHJlYWRpbmcgbGlrZSB0aGUgb24tc2NyZWVuIGNlbGwsIHRocm91Z2ggdGhlIHNhbWVcbi8vIGZ1bmN0aW9ucyBhcyB0aGUgc2NyZWVuOiBhIGRhdGUgY29sdW1uIHJlbmRlcnMgaW4gdGhlIHJlcG9ydCdzIHpvbmUgYW5kXG4vLyBsb2NhbGUsIGFuZCBhIGNvbHVtbiB3aXRoIG51bWJlci1mb3JtYXQga2V5cyAoYSBjcm9zcy10YWIncyBjZWxscyB0aHJvdWdoXG4vLyBpdHMgY2VsbEZvcm1hdCkgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSBhbmQgY3VycmVuY3kuIEFueSBvdGhlciB2YWx1ZSBnb2VzXG4vLyBvdXQgdmVyYmF0aW0sIGFuZCBhbiBlbXB0eSBvbmUgYXMgJycuIENTViBuZXZlciBjb21lcyB0aHJvdWdoIGhlcmU6IGl0c1xuLy8gdmFsdWVzIHN0YXkgcmF3LlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENlbGwoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IExpc3RDb2x1bW4sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgdGltZXpvbmUsIGNvbnRleHQubG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSA/IGZvcm1hdE51bWJlcih2YWx1ZSwgY29sdW1uLCBjb250ZXh0LCB7IGVtcHR5OiAnJyB9KSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgYXJyaXZlIHdpdGggaXRzXG4vLyByb3dzICh0aGUgcm93IGtleSBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlKSwgc2luY2Ugb25seSB0aGUgcmVzdWx0XG4vLyBrbm93cyB0aGUgcGl2b3QgdmFsdWVzLCBhbmQgYXJlIGJ1aWx0IGJ5IHBpdm90Q29sdW1uU3BlY3MoKSBhcyBvbiBzY3JlZW46XG4vLyBoZWFkZWQgYnkgaXRzIHBlcmlvZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgZWFjaCBwaXZvdCB2YWx1ZSBmb3JtYXR0ZWQgYnlcbi8vIGNlbGxGb3JtYXQuIEEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zIGJ1dCB0aGUgb25lcyB0aGVcbi8vIHZpZXdlciBoaWQgKGBoaWRkZW5gLCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zLCBzbyBuZXZlciBhbGwgb2YgdGhlbSksXG4vLyBlbHNlIGV2ZXJ5IGNvbHVtbiB0aGUgcXVlcnkgcmV0dXJuZWQsIGFzIGl0IGNhbWUuXG5leHBvcnQgZnVuY3Rpb24gbGlzdENvbHVtbnMoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKGNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICByZXR1cm4gcGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIGxvY2FsZSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGhpZGRlbk5hbWVzID0gbGlzdEhpZGRlbkNvbHVtbnMoY29uZmlnLCBoaWRkZW4pO1xuXG4gICAgcmV0dXJuIGNvbmZpZy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+ICFoaWRkZW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB9KSk7XG4gIH1cblxuICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIG51bWVyaWM6IGZhbHNlIH0pKTtcbn1cblxuLy8gVGhlIGhlYWRpbmcgb3ZlciBlYWNoIGNvbHVtbiBvZiBsaXN0Q29sdW1ucygpOiBhIHBsYWluIGxpc3QncyBjb25maWd1cmVkXG4vLyBsYWJlbCwgZWxzZSBpdHMgY29sdW1uOyBhIGNyb3NzLXRhYidzIGhlYWRpbmcgZnJvbSBwaXZvdENvbHVtblNwZWNzKCkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGhpZGRlbjogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgbG9jYWxlLCBoaWRkZW4pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbik7XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QncyB0b3RhbHMgcm93LCBvbmUgY2VsbCBwZXIgY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGVhY2hcbi8vIHRvdGFsIHdyaXR0ZW4gbGlrZSBpdHMgY29sdW1uJ3MgY2VsbHMsIGFuZCBMSVNUX1RPVEFMX0xBQkVMIGluIHRoZSBmaXJzdFxuLy8gY29sdW1uIHdoZW4gdGhhdCBjb2x1bW4gaG9sZHMgbm8gdG90YWwgKGEgY3Jvc3MtdGFiJ3Mgcm93IGtleSkuIG51bGwgd2hlblxuLy8gdGhlIGxpc3QgaGFzIG5vIHRvdGFscy4gVGhlIENTViBuZXZlciBjYXJyaWVzIG9uZTogaXRzIHJvd3Mgc3RheSByYXcuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRvdGFsc1JvdyhcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY29sdW1uczogcmVhZG9ubHkgRXhwb3J0TGlzdENvbHVtbltdLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3QgdG90YWxzID0gZGF0YS50b3RhbHM7XG5cbiAgaWYgKCF0b3RhbHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxhYmVsID0gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKGNvbHVtbnMsIHRvdGFscyk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChjb2x1bW4uY29sdW1uID09PSBsYWJlbFxuICAgID8gTElTVF9UT1RBTF9MQUJFTFxuICAgIDogZXhwb3J0Q2VsbCh0b3RhbHNbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgdGltZXpvbmUsIGNvbnRleHQpKSk7XG59XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhbiBleHBvcnRlZCBsaXN0IHRhYmxlIHRoYXQgc3RvcHMgc2hvcnQgb2YgaXRzIHJlc3VsdDogaG93XG4vLyBtYW55IHJvd3MgdGhlIGZpbGUgbGVhdmVzIG91dCBhbmQgd2hlcmUgdGhlIHdob2xlIHNldCBjYW4gYmUgaGFkLiBFYWNoXG4vLyBmb3JtYXQgZmV0Y2hlcyBpdHMgb3duIG51bWJlciBvZiByb3dzIChQREZfTElTVF9ST1dTLCBQUFRYX0xJU1RfUk9XUyksIGFuZFxuLy8gYm90aCBuYW1lIHdoYXQgaXMgbGVmdCB3aXRoIHRoaXMgb25lIHNlbnRlbmNlLlxuZXhwb3J0IGZ1bmN0aW9uIG1vcmVSb3dzTm90aWNlKHJlbWFpbmluZzogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGDigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgO1xufVxuXG4vLyBUaGUgcGFnZXMgb2YgYSBjb2xsZWN0ZWQgcmVwb3J0IHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgdGlsZSB3aG9zZSBxdWVyeVxuLy8gZmFpbGVkIOKAlCB3aGF0IHRoZSBleHBvcnQgZ2F0ZSBuYW1lcyB0byB0aGUgdXNlciwgYW5kIHdoYXQgbWFrZXMgXCJzb21lIG9mIHRoaXNcbi8vIGZpbGUgaXMgbWlzc2luZ1wiIGEgZmFjdCB0aGUgY2FsbGVyIGNhbiBhY3Qgb24gcmF0aGVyIHRoYW4gYSB0aGluZyB0aGV5IG5vdGljZVxuLy8gaW4gdGhlIFBERiBhZnRlcndhcmRzLlxuZXhwb3J0IGZ1bmN0aW9uIGZhaWxlZFBhZ2VOYW1lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgLy8gTnVtYmVyZWQgYmVmb3JlIHRoZSBmaWx0ZXIg4oCUIGFuIHVubmFtZWQgcGFnZSA0IHRoYXQgZmFpbGVkIGhhcyB0byByZWFkXG4gIC8vIFwiUGFnZSA0XCIsIG5vdCBcIlBhZ2UgMVwiIGJlY2F1c2UgaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGZpcnN0IGZhaWx1cmUuXG4gIHJldHVybiBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbn1cblxuLy8gR2F0aGVycyBldmVyeXRoaW5nIGFuIGV4cG9ydCBuZWVkczogZXZlcnkgY29tcG9uZW50J3MgZGF0YSBhY3Jvc3MgQUxMIHBhZ2VzXG4vLyAodGhlIGNhbnZhcyBvbmx5IHJlbmRlcnMgdGhlIGFjdGl2ZSBwYWdlLCBzbyBleHBvcnRzIGNhbid0IHNjcmFwZSB0aGVcbi8vIHNjcmVlbiksIGZldGNoZWQgZnJlc2ggd2l0aCB0aGUgdmlld2VyJ3MgY3VycmVudCBmaWx0ZXIgc3RhdGUuXG4vL1xuLy8gQSBmYWlsZWQgY29tcG9uZW50IHJlc29sdmVzIHRvIGEgbnVsbCBgZGF0YWAgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgd2hvbGVcbi8vIGNvbGxlY3Rpb24g4oCUIGJ1dCB0aGF0IGlzIHNvIHRoZSBjYWxsZXIgY2FuIFJFUE9SVCB3aGF0IGZhaWxlZCwgbm90IHNvIGl0IGNhblxuLy8gYmUgaWdub3JlZDogc2VlIGZhaWxlZFBhZ2VOYW1lcygpIGFuZCB0aGUgZXhwb3J0IGdhdGUgdGhhdCB1c2VzIGl0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgLy8gbGlzdFJvd3MgaXMgaG93IG1hbnkgcm93cyBlYWNoIGxpc3QgZmV0Y2hlczogdGhlIHJlbmRlcmVyJ3Mgb3duIGNhcCwgc2luY2VcbiAgLy8gYSBQREYgdGFibGUgY29udGludWVzIG9udG8gZXh0cmEgcGFnZXMgYW5kIGEgc2xpZGUgdGFibGUgY2Fubm90LlxuICBwdWJsaWMgY29sbGVjdChyZXBvcnQ6IFJlcG9ydCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkUmVwb3J0PiB7XG4gICAgY29uc3Qgc2xvdHM6IHsgcGFnZUluZGV4OiBudW1iZXI7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH1bXSA9IFtdO1xuXG4gICAgcmVwb3J0LnBhZ2VzLmZvckVhY2goKHBhZ2UsIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgcGFnZS5jb21wb25lbnRzKSB7XG4gICAgICAgIHNsb3RzLnB1c2goeyBwYWdlSW5kZXgsIGNvbXBvbmVudCB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRleHQgYmxvY2tzIGhhdmUgbm90aGluZyB0byBmZXRjaCDigJQgdGhleSByaWRlIHRocm91Z2ggd2l0aCBubyBkYXRhLiBUaGVcbiAgICAvLyBoZWFkZXIvZm9vdGVyIChyZXBvcnQubWFzdGVyKSBpcyByZWFkIGJ5IHRoZSByZW5kZXJlcnMgc3RyYWlnaHQgb2ZmIHRoZVxuICAgIC8vIHJlcG9ydCBmb3IgdGhlIHNhbWUgcmVhc29uLlxuXG4gICAgLy8gUmVsZWFzZWQgYSBmZXcgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLiBtZXJnZU1hcCBjb21wbGV0ZXMgb3V0XG4gICAgLy8gb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIHNsb3QgaXQgY2FtZSBmcm9tIGFuZCB0aGUgcm93cyBhcmVcbiAgICAvLyBmaWxlZCBieSBpbmRleCDigJQgdGhlIGRlY2sncyBwYWdlIG9yZGVyIGNhbid0IGRlcGVuZCBvbiB3aGljaCBxdWVyeVxuICAgIC8vIGhhcHBlbmVkIHRvIGZpbmlzaCBmaXJzdC5cbiAgICBjb25zdCBhbGwkID0gc2xvdHMubGVuZ3RoXG4gICAgICA/IGZyb20oc2xvdHMubWFwKChzbG90LCBpbmRleCkgPT4gKHsgc2xvdCwgaW5kZXggfSkpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtZXJnZU1hcChcbiAgICAgICAgICAgICh7IHNsb3QsIGluZGV4IH0pID0+IHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBzbG90LmNvbXBvbmVudCwgbGlzdFJvd3MpXG4gICAgICAgICAgICAgIC5waXBlKG1hcCgoaXRlbSkgPT4gKHsgaXRlbSwgaW5kZXggfSkpKSxcbiAgICAgICAgICAgIEVYUE9SVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihbXSBhcyB7IGl0ZW06IENvbGxlY3RlZENvbXBvbmVudDsgaW5kZXg6IG51bWJlciB9W10pO1xuXG4gICAgLy8gVGhlIHN1bW1hcnkgcmlkZXMgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YSByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdFxuICAgIC8vIHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgZmlsdGVyU3VtbWFyeTogdGhpcy5nZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgY29sbGVjdGVkLCBmaWx0ZXJTdW1tYXJ5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10gfSkpO1xuXG4gICAgICAgICAgWy4uLmNvbGxlY3RlZF1cbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IGl0ZW0sIGluZGV4IH0pID0+IHtcbiAgICAgICAgICAgICAgcGFnZXNbc2xvdHNbaW5kZXhdLnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwb3J0LFxuICAgICAgICAgICAgcGFnZXMsXG4gICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgICAgICAgY29udGV4dExpbmVzOiB0aGlzLl9jb250ZXh0TGluZXMocmVwb3J0KSxcbiAgICAgICAgICAgIGZvcm1hdENvbnRleHQ6IHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBcIlJlcG9ydCBQZXJpb2Q6IEp1biAxMiwgMjAyNSDigJMgSnVuIDEyLCAyMDI2XCIsIFwiUmVnaW9uOiBOb3J0aCwgRWFzdFwiIOKAlCBvbmVcbiAgLy8gbGluZSBwZXIgZmlsdGVyIGdyb3VwIHRoYXQgaGFzIGFuIGFjdGl2ZSBzZXNzaW9uIHZhbHVlLCB0aGVuIHRoZSBncm91cC1ieVxuICAvLyBsaW5lLiBUaGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0OiB0aGUgUERGIGFuZCBQb3dlclBvaW50IGNvdmVyc1xuICAvLyBwcmludCBpdCwgYW5kIHRoZSByZXBvcnQgemlwIGV4cG9ydCBzZW5kcyBpdCBmb3IgaXRzIG5vdGVzIGZpbGUuIERhdGVzIGFyZVxuICAvLyB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUsIHNvIHRoZSBub3RlcyBuYW1lIHRoZSBwZXJpb2QgYXMgdGhlIGNvdmVyXG4gIC8vIGRvZXMuXG4gIC8vXG4gIC8vIEEgc2VsZWN0IGdyb3VwIHN0b3JlcyBpZHMsIHNvIGl0cyBsaW5lIGhhcyB0byBiZSBuYW1lZCBvZmYgdGhlIG9wdGlvbiBsaXN0XG4gIC8vIGJlZm9yZSBpdCBjYW4gYmUgcHJpbnRlZDsgYSBkYXRlIG9yIGtleXdvcmQgZ3JvdXAgYWxyZWFkeSBob2xkcyBpdHMgb3duXG4gIC8vIGRpc3BsYXkgdmFsdWUgYW5kIHJlc29sdmVzIHN5bmNocm9ub3VzbHkuXG4gIHB1YmxpYyBnZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGxpbmVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgJ0ZpbHRlcic7XG5cbiAgICAgIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7dGhpcy5fZGF0ZSh2YWx1ZS5zdGFydCl9IOKAkyAke3RoaXMuX2RhdGUodmFsdWUuZW5kKX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5fc2VsZWN0TGluZShsYWJlbCwgZ3JvdXAsIHJlcG9ydC5pZCwgdmFsdWUudmFsdWVzKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06IFwiJHt2YWx1ZS52YWx1ZS50cmltKCl9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGdyYWluLCB1bmRlciB0aGUgcmVwb3J0J3Mgb3duIG5hbWUgZm9yIHRoZSBjb250cm9sIOKAlCBhIGNvdmVyXG4gICAgLy8gc2hlZXQgcmVhZGluZyBcIkZyZXF1ZW5jeVwiIHdoZW4gdGhlIHJlcG9ydCBjYWxscyBpdCBcIlBlcmlvZFwiIGRlc2NyaWJlcyBhXG4gICAgLy8gY29udHJvbCB0aGUgcmVhZGVyIGNhbm5vdCBmaW5kIG9uIHNjcmVlbi5cbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGlmIChncmFudWxhcml0eSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gR1JBTlVMQVJJVFlfT1BUSU9OUy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBncmFudWxhcml0eSk7XG4gICAgICBjb25zdCBsYWJlbCA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeSc7XG4gICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHtvcHRpb24/Lm5hbWUgPz8gZ3JhbnVsYXJpdHl9YCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5sZW5ndGggPyBmb3JrSm9pbihsaW5lcykgOiBvZihbXSk7XG4gIH1cblxuICBwcml2YXRlIF9jb21wb25lbnREYXRhKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PiB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHJldHVybiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCwgaGlkZGVuQ29sdW1uczogW10gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nXG4gICAgLy8gYW5kIHRoZSB2aWV3ZXIncyBoZWFkZXIgc29ydCBhbmQgc2VhcmNoLCBzbyB0aGUgdGFibGUgcmVhZHMgaW4gdGhlXG4gICAgLy8gc2NyZWVuJ3Mgb3JkZXIgYW5kIGhvbGRzIHRoZSBzY3JlZW4ncyByb3dzLlxuICAgIC8vXG4gICAgLy8gVGhlIHRpbWUtc2VyaWVzIGNoZWNrIGRlbGliZXJhdGVseSBtaXJyb3JzIHRoZSBzZXJ2ZXIncyBjYW5vbmljYWxcbiAgICAvLyBSZXBvcnRRdWVyeVJ1bm5lcjo6X2lzVGltZVNlcmllc0NoYXJ0LCBzbyBhIHByb2R1Y3QgcGlubmVkIHRvIGFuIG9sZGVyXG4gICAgLy8gZnJhbWV3b3JrIGRvZXMgbm90IHJlLWJ1Y2tldCBhIG5vbi10aW1lIGNoYXJ0LlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc2VhcmNoID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKGNvbXBvbmVudC5pZCkgPz8gdW5kZWZpbmVkXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB7IHBhZ2U6IDEsIHBhZ2VTaXplOiBsaXN0Um93cywgc29ydDogdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQoY29tcG9uZW50LmlkKSA/PyB1bmRlZmluZWQsIHNlYXJjaCB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcbiAgICAvLyBUaGUgdGFibGUgbGVhdmVzIG91dCB0aGUgY29sdW1ucyB0aGUgdmlld2VyIGhpZC4gVGhlIHJvd3MgYXJlIGZldGNoZWRcbiAgICAvLyB3aG9sZSwgYXMgdGhlIHNjcmVlbiBmZXRjaGVzIHRoZW0sIGFuZCB0aGUgcmVuZGVyZXJzIGRyb3AgdGhlIGNlbGxzLlxuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSBbLi4udGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpXTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBleHBvcnQgZ2F0ZSwgbmFtaW5nIHRoZSBwYWdlcyBpdCBjb3N0IOKAlFxuICAgIC8vIG5ldmVyIGFzIHRlbiBzdGFja2VkIG1vZGFscyBjYXJyeWluZyB0aGUgZGF0YWJhc2UncyBvd24gd29yZGluZy5cbiAgICAvL1xuICAgIC8vIEEgc2VhcmNoIHRoZSBzZXJ2ZXIgY291bGQgbm90IGFwcGx5IChzZWFyY2hOb3RlOiB0aGUgbGlzdCBoYXMgbm8gdGV4dFxuICAgIC8vIGNvbHVtbikgbmFycm93ZWQgbm90aGluZywgc28gdGhlIGl0ZW0gZG9lcyBub3QgY2FycnkgaXQuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YShyZXBvcnQuaWQsIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUsIHRydWUsIHsgaGFuZGxlcnM6IGZhbHNlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKTogQ29sbGVjdGVkQ29tcG9uZW50ID0+IChzZWFyY2ggJiYgIWRhdGE/LnNlYXJjaE5vdGVcbiAgICAgICAgICA/IHsgY29tcG9uZW50LCBkYXRhLCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfVxuICAgICAgICAgIDogeyBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgem9uZSB0aGUgc2VydmVyIHJlc29sdmVkLCBhcyBpdHMgSUFOQSBpZCwgYW5kIHRoZSBjdXJyZW5jeSBpdCBzYXlzXG4gIC8vIHRoZSByZXBvcnQncyBtb25leSBpcyBpbiAoYSBsYWJlbDogbm90aGluZyBpcyBjb252ZXJ0ZWQpLiBPbmx5IHRoZVxuICAvLyBzZXJ2ZXIncyB2YWx1ZXMgYXJlIHByaW50ZWQ6IHRoZSBicm93c2VyJ3Mgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lJ3NcbiAgLy8gZmFsbGJhY2sgZm9yIGFuIG9sZGVyIHNlcnZlcikgaXMgbm90IHdoYXQgdGhlIG51bWJlcnMgd2VyZSBtZWFzdXJlZCBpbixcbiAgLy8gYW5kIGFuIG9sZGVyIHNlcnZlciBuYW1lcyBubyBjdXJyZW5jeSBhdCBhbGwuXG4gIHByaXZhdGUgX2NvbnRleHRMaW5lcyhyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/IFtgVGltZXpvbmU6ICR7cmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lfWBdIDogW10pLFxuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSA/IFtgQ3VycmVuY3k6ICR7cmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5fWBdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvLyBPbmUgc2VsZWN0IGdyb3VwJ3MgbGluZSwgd2l0aCBpdHMgc3RvcmVkIGlkcyByZXNvbHZlZCB0byB0aGUgc2FtZSBuYW1lcyB0aGVcbiAgLy8gb24tc2NyZWVuIGNoaXBzIHNob3cg4oCUIGEgY292ZXIgcmVhZGluZyBcIk9yZ2FuaXphdGlvbjogODc3NCwgODc3N1wiIHRlbGxzIHRoZVxuICAvLyByZWFkZXIgbm90aGluZyBhYm91dCB3aGF0IHRoZSByZXBvcnQgY292ZXJzLlxuICAvL1xuICAvLyBVc2VzIHRoZSByZXBvcnQgYmFyJ3Mgb3duIGxvYWRlciBhbmQgcmVzb2x2ZXIgc28gdGhlIHR3byBjYW4ndCBkcmlmdCwgd2hpY2hcbiAgLy8gYWxzbyBtZWFucyBhIHZhbHVlIHdob3NlIGVudGl0eSB3YXMgZGVsZXRlZCBrZWVwcyBzaG93aW5nIGl0cyByYXcgaWQgcmF0aGVyXG4gIC8vIHRoYW4gZHJvcHBpbmcgb2ZmIHRoZSBjb3ZlciBhbmQgc2lsZW50bHkgdW5kZXJzdGF0aW5nIHRoZSBmaWx0ZXIuIEEgZmFpbGVkXG4gIC8vIG9wdGlvbiBmZXRjaCBkZWdyYWRlcyB0aGUgd2hvbGUgbGluZSB0byBpZHMgZm9yIHRoZSBzYW1lIHJlYXNvbjogYW4gZXhwb3J0XG4gIC8vIG11c3QgbmV2ZXIgZmFpbCBvbiBhIGNvc21ldGljIGxvb2t1cC5cbiAgcHJpdmF0ZSBfc2VsZWN0TGluZShcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHZhbHVlczogdW5rbm93bltdLFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9uVmFsdWVzKGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHRoaXMuX3JlcG9ydERhdGEsIHJlcG9ydElkKSwgdmFsdWVzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzb2x2ZWQpID0+IGAke2xhYmVsfTogJHtyZXNvbHZlZC5tYXAoKGl0ZW0pID0+IGl0ZW0ubmFtZSkuam9pbignLCAnKX1gKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihgJHtsYWJlbH06ICR7dmFsdWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKS5qb2luKCcsICcpfWApKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXJlZCBvZmYgdGhlIHNhbWUgY2FsZW5kYXIgZGF5IHRoZSBmaWx0ZXIgc2VuZHMgdG8gdGhlIHNlcnZlciwgc28gdGhlXG4gIC8vIGNvdmVyJ3MgcGVyaW9kIGlzIHRoZSBwZXJpb2QgdGhlIG51bWJlcnMgYmVoaW5kIGl0IHdlcmUgcXVlcmllZCBmb3IuXG4gIHByaXZhdGUgX2RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZUJvdW5kTGFiZWwodmFsdWUsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUpID8/ICfigKYnO1xuICB9XG59XG4iXX0=
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YscUJBQXFCLEdBQ3RCLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFHTCxtQkFBbUIsR0FTcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBRWhCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIscUJBQXFCLEdBQ3RCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlD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aEMsV0FBVyxDQUNqQixLQUFhLEVBQ2IsS0FBd0IsRUFDeEIsUUFBZ0IsRUFDaEIsTUFBaUI7UUFFakIsT0FBTyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7YUFDcEYsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQzlFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNuRixDQUFDO0lBQ04sQ0FBQztJQUVELDRFQUE0RTtJQUM1RSx1RUFBdUU7SUFDL0QsS0FBSyxDQUFDLEtBQXVDO1FBQ25ELE9BQU8sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUNoRixDQUFDO3dHQXRMVSw0QkFBNEI7NEdBQTVCLDRCQUE0Qjs7NEZBQTVCLDRCQUE0QjtrQkFEeEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHtcbiAgREFZX0xPTkcsXG4gIGZvcm1hdExvY2FsRGF0ZSxcbiAgZm9ybWF0TnVtYmVyLFxuICBmb3JtYXRPdXRwdXRWYWx1ZSxcbiAgZm9ybWF0UmVwb3J0RGF0ZSxcbiAgaGFzTnVtYmVyRm9ybWF0LFxuICByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIExpc3RDb2x1bW4sXG4gIExpc3RDb25maWcsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgS3BpQ2FyZFZpZXcgfSBmcm9tICcuLi9rcGktY2FyZCc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBsaXN0SGlkZGVuQ29sdW1ucyxcbiAgbGlzdE91dHB1dENvbHVtbnMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGNvbXBvbmVudE5vdGVMaW5lcywgY29tcG9uZW50V2luZG93c0xpbmUgfSBmcm9tICcuLi9vdXRwdXQtbm90ZXMnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kTGFiZWwsIGxvYWRHcm91cE9wdGlvbnMsIHJlc29sdmVPcHRpb25WYWx1ZXMgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRDb21wb25lbnQge1xuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgLy8gbnVsbCA9IGl0cyBxdWVyeSBmYWlsZWQ7IGV4cG9ydHMgc2hvdyBhIG5vdGUuIEFsd2F5cyBudWxsIGZvciBhIHRleHRcbiAgLy8gYmxvY2ssIHdoaWNoIGhhcyBubyBxdWVyeSDigJQgc2VlIGlzRmFpbGVkKCkuXG4gIGRhdGE6IENvbXBvbmVudERhdGEgfCBudWxsO1xuICAvLyBUaGUgdGV4dCBhIGxpc3Qgd2FzIHNlYXJjaGVkIGJ5IHdoZW4gaXQgd2FzIGZldGNoZWQ7IGFic2VudCB3aGVuIGl0c1xuICAvLyBzZWFyY2ggYm94IHdhcyBlbXB0eSwgYW5kIGZvciBldmVyeSBvdGhlciBjb21wb25lbnQuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIHBsYWluIGxpc3QsIHdoaWNoIGl0cyB0YWJsZSBsZWF2ZXNcbiAgLy8gb3V0IChsaXN0Q29sdW1ucyk7IGVtcHR5IGZvciBldmVyeSBvdGhlciBjb21wb25lbnQuXG4gIGhpZGRlbkNvbHVtbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RlZFBhZ2Uge1xuICBwYWdlOiBSZXBvcnRQYWdlO1xuICBjb21wb25lbnRzOiBDb2xsZWN0ZWRDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRSZXBvcnQge1xuICByZXBvcnQ6IFJlcG9ydDtcbiAgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXTtcbiAgLy8gSHVtYW4tcmVhZGFibGUgbGluZXMgZGVzY3JpYmluZyB0aGUgYWN0aXZlIGZpbHRlcnMsIGZvciB0aGUgdGl0bGUgc2xpZGUvcGFnZS5cbiAgZmlsdGVyU3VtbWFyeTogc3RyaW5nW107XG4gIC8vIFdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2U6IHRoZSB6b25lIGFuZFxuICAvLyB0aGUgY3VycmVuY3kgdGhlIHNlcnZlciByZXNvbHZlZCBmb3IgdGhlIHJlcG9ydC4gRWFjaCBpcyBsZWZ0IG91dCB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBpdCwgcmF0aGVyIHRoYW4gYSBndWVzcyB0aGF0IHdvdWxkIGJlIHdyb25nIHdoZW5ldmVyXG4gIC8vIHRoZSBkZWZhdWx0IGFwcGxpZXMuXG4gIGNvbnRleHRMaW5lczogc3RyaW5nW107XG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAoaXRzIGxvY2FsZSwgY3VycmVuY3lcbiAgLy8gYW5kIHBlcmNlbnQgZm9ybSksIHJlYWQgb25jZSBzbyBldmVyeSBwYWdlIG9mIHRoZSBmaWxlIGFncmVlcy5cbiAgZm9ybWF0Q29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dDtcbn1cblxuLy8gT25lIGV4cG9ydGVkIGxpc3QgY29sdW1uOiB0aGUgY2VsbCBrZXksIGl0cyBoZWFkaW5nIGFuZCBpdHMgZm9ybWF0LCBhbmRcbi8vIHdoZXRoZXIgaXRzIGNlbGxzIGFyZSBmb3JtYXR0ZWQgbnVtYmVycywgd2hpY2ggZXZlcnkgZXhwb3J0IHJpZ2h0LWFsaWduc1xuLy8gKGhlYWRlciBpbmNsdWRlZCkgYXMgdGhlIHNjcmVlbiBkb2VzLiBBIGNvbHVtbiB0aGF0IGhvbGRzIGEgY29tcGFyZWQsXG4vLyB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQgY2FycmllcyBob3cgaXQgaXMgd3JpdHRlbiAob3V0cHV0KSwgYW5kXG4vLyBob2xkcyBudW1iZXJzIHdoZXRoZXIgb3Igbm90IGl0IG5hbWVzIGEgZm9ybWF0LlxuZXhwb3J0IHR5cGUgRXhwb3J0TGlzdENvbHVtbiA9IExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW47IG91dHB1dD86IExpc3RPdXRwdXRDb2x1bW4gfTtcblxuLy8gSG93IHRhbGwgZWFjaCBwYXJ0IG9mIGFuIGV4cG9ydGVkIEtQSSBjYXJkIGlzLCBpbiB0aGUgcmVuZGVyZXIncyB1bml0XG4vLyAocG9pbnRzIGluIHRoZSBQREYsIGluY2hlcyBpbiB0aGUgZGVjaykuIEEgbm90ZSBpcyBvbmUgbGluZS5cbmV4cG9ydCBpbnRlcmZhY2UgS3BpRXhwb3J0SGVpZ2h0cyB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGxhYmVsOiBudW1iZXI7XG4gIGRlbHRhOiBudW1iZXI7XG4gIHdpbmRvdzogbnVtYmVyO1xuICB0YXJnZXQ6IG51bWJlcjtcbiAgc3BhcmtsaW5lOiBudW1iZXI7XG4gIG5vdGU6IG51bWJlcjtcbn1cblxuLy8gVGhlIHBhcnRzIG9mIGEgS1BJIGNhcmQgYW4gZXhwb3J0IGRyYXdzOiB0aGUgdmFsdWUgYW5kIGl0cyBsYWJlbCBhbHdheXMsXG4vLyB0aGUgcmVzdCB3aGVuIHRoZSBjYXJkIGhhcyB0aGVtIGFuZCB0aGUgdGlsZSBoYXMgcm9vbSAoa3BpRXhwb3J0UGFydHMpLlxuZXhwb3J0IGludGVyZmFjZSBLcGlFeHBvcnRQYXJ0cyB7XG4gIGRlbHRhOiBib29sZWFuO1xuICB3aW5kb3c6IGJvb2xlYW47XG4gIHRhcmdldDogYm9vbGVhbjtcbiAgc3BhcmtsaW5lOiBib29sZWFuO1xuICBub3Rlczogc3RyaW5nW107XG59XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBBIGNvbXBvbmVudCdzIHRpdGxlIGFzIGFuIGV4cG9ydGVkIGZpbGUgcHJpbnRzIGl0LiBBIHNlYXJjaGVkIGxpc3Qgc2F5cyBzbyxcbi8vIHNpbmNlIGl0cyB0YWJsZSBob2xkcyBvbmx5IHRoZSBtYXRjaGluZyByb3dzOiAnT3JkZXJzIChtYXRjaGluZyBcIm5vcnRoXCIpJy5cbi8vIEFuIHVudGl0bGVkIG9uZSByZWFkcyAnTWF0Y2hpbmcgXCJub3J0aFwiJy4gJycgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHByaW50LlxuLy8gU2hhcmVkIGJ5IHRoZSBQREYgYW5kIHRoZSBkZWNrLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgYWx3YXlzIGxlYWRzICh0aGUgUG93ZXJQb2ludCBtYXJrcyB0aGF0IGxpbmUgYXMgd3JpdHRlbiBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSkuIEl0IGlzIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLCB0aGUgc2FtZSBkYXkgaXRzIGZpbHRlcnNcbi8vIHJlc29sdmUgXCJ0b2RheVwiIHRvLCB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXRMb2NhbERhdGUoXG4gICAgICBuZXcgRGF0ZSgpLFxuICAgICAgY29sbGVjdGVkLmZvcm1hdENvbnRleHQubG9jYWxlLFxuICAgICAgREFZX0xPTkcsXG4gICAgICByZXNvbHZlUmVwb3J0VGltZXpvbmUoY29sbGVjdGVkLnJlcG9ydCksXG4gICAgKSxcbiAgICAuLi5jb2xsZWN0ZWQuZmlsdGVyU3VtbWFyeSxcbiAgICAuLi5jb2xsZWN0ZWQuY29udGV4dExpbmVzLFxuICBdO1xufVxuXG4vLyBBbiBleHBvcnRlZCBsaXN0IGNlbGwsIHJlYWRpbmcgbGlrZSB0aGUgb24tc2NyZWVuIGNlbGwsIHRocm91Z2ggdGhlIHNhbWVcbi8vIGZ1bmN0aW9ucyBhcyB0aGUgc2NyZWVuOiBhIGRhdGUgY29sdW1uIHJlbmRlcnMgaW4gdGhlIHJlcG9ydCdzIHpvbmUgYW5kXG4vLyBsb2NhbGUsIGFuZCBhIGNvbHVtbiB3aXRoIG51bWJlci1mb3JtYXQga2V5cyAoYSBjcm9zcy10YWIncyBjZWxscyB0aHJvdWdoXG4vLyBpdHMgY2VsbEZvcm1hdCkgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSBhbmQgY3VycmVuY3kuIEFueSBvdGhlciB2YWx1ZSBnb2VzXG4vLyBvdXQgdmVyYmF0aW0sIGFuZCBhbiBlbXB0eSBvbmUgYXMgJycuIENTViBuZXZlciBjb21lcyB0aHJvdWdoIGhlcmU6IGl0c1xuLy8gdmFsdWVzIHN0YXkgcmF3LlxuLy9cbi8vIEFuIG91dHB1dCBjb2x1bW4gaXMgd3JpdHRlbiBieSB3aGF0IGl0IGhvbGRzLCBhcyB0aGUgc2NyZWVuJ3MgY2VsbCBpc1xuLy8gKGZvcm1hdE91dHB1dFZhbHVlKTogYSBzaWduZWQgY2hhbmdlLCBhIHBlcmNlbnQgY2hhbmdlLCBhIGNoYW5nZSBvZiBhIHJhdGVcbi8vIGluIHBvaW50cywgYSByYW5rLCBhIHNoYXJlLiBJdHMgcm93IGdpdmVzIGEgY2hhbmdlIHRoZSBwcmlvciBiZXNpZGUgaXQsIHNvXG4vLyBhIG1pc3NpbmcgYmFzZWxpbmUgKCfigJQnKSByZWFkcyBhcGFydCBmcm9tIGEgemVybyBvbmUgKCduL2EnKS5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRDZWxsKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29sdW1uOiBMaXN0Q29sdW1uICYgeyBvdXRwdXQ/OiBMaXN0T3V0cHV0Q29sdW1uIH0sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIHJvdz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG91dHB1dCA9IGNvbHVtbi5vdXRwdXQ7XG5cbiAgaWYgKG91dHB1dCkge1xuICAgIHJldHVybiBmb3JtYXRPdXRwdXRWYWx1ZSh2YWx1ZSwgb3V0cHV0Lm91dHB1dCwgY29sdW1uLCBjb250ZXh0LCB7XG4gICAgICBtZWFzdXJlU3BlYzogb3V0cHV0Lm1lYXN1cmVTcGVjLFxuICAgICAgcHJpb3I6IG91dHB1dC5wcmlvckFsaWFzICYmIHJvdyA/IHJvd1tvdXRwdXQucHJpb3JBbGlhc10gOiB1bmRlZmluZWQsXG4gICAgICBmbG9vcjogb3V0cHV0LmZsb29yLFxuICAgICAgZW1wdHk6ICcnLFxuICAgIH0pLnRleHQ7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgdGltZXpvbmUsIGNvbnRleHQubG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSA/IGZvcm1hdE51bWJlcih2YWx1ZSwgY29sdW1uLCBjb250ZXh0LCB7IGVtcHR5OiAnJyB9KSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgYXJyaXZlIHdpdGggaXRzXG4vLyByb3dzICh0aGUgcm93IGtleSBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlKSwgc2luY2Ugb25seSB0aGUgcmVzdWx0XG4vLyBrbm93cyB0aGUgcGl2b3QgdmFsdWVzLCBhbmQgYXJlIGJ1aWx0IGJ5IHBpdm90Q29sdW1uU3BlY3MoKSBhcyBvbiBzY3JlZW46XG4vLyBoZWFkZWQgYnkgaXRzIHBlcmlvZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgZWFjaCBwaXZvdCB2YWx1ZSBmb3JtYXR0ZWQgYnlcbi8vIGNlbGxGb3JtYXQuIEEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zIGJ1dCB0aGUgb25lcyB0aGVcbi8vIHZpZXdlciBoaWQgKGBoaWRkZW5gLCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zLCBzbyBuZXZlciBhbGwgb2YgdGhlbSksXG4vLyBlbHNlIGV2ZXJ5IGNvbHVtbiB0aGUgcXVlcnkgcmV0dXJuZWQsIGFzIGl0IGNhbWUuIE91dHB1dCBjb2x1bW5zICh0aGVcbi8vIGRhdGEncyBvdXRwdXRzLCBhIGNyb3NzLXRhYiBjZWxsIHRocm91Z2ggY2VsbE1lYXN1cmVzKSBjYXJyeSBob3cgdGhleSBhcmVcbi8vIHdyaXR0ZW47IHdpdGhvdXQgdGhvc2Uga2V5cyB0aGUgY29sdW1ucyBhcmUgZXhhY3RseSBhcyBiZWZvcmUuXG5leHBvcnQgZnVuY3Rpb24gbGlzdENvbHVtbnMoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKGNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMocGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIGxvY2FsZSksIGRhdGEsIFtdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuY29sdW1ucz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgaGlkZGVuTmFtZXMgPSBsaXN0SGlkZGVuQ29sdW1ucyhjb25maWcsIGhpZGRlbik7XG5cbiAgICByZXR1cm4gd2l0aE91dHB1dENvbHVtbnMoXG4gICAgICBjb25maWcuY29sdW1uc1xuICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+ICFoaWRkZW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSlcbiAgICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBjb25maWcuY29sdW1ucyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHdpdGhPdXRwdXRDb2x1bW5zKGRhdGEuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uLCBudW1lcmljOiBmYWxzZSB9KSksIGRhdGEsIFtdKTtcbn1cblxuLy8gVGhlIGNvbHVtbnMgd2l0aCB0aGVpciBvdXRwdXQgbWV0YWRhdGEgYXR0YWNoZWQgKGxpc3RPdXRwdXRDb2x1bW5zLCBhcyB0aGVcbi8vIHNjcmVlbidzIGxpc3QgcmVzb2x2ZXMgaXQpOiBhbiBvdXRwdXQgY29sdW1uIGhvbGRzIG51bWJlcnMgYW5kIGlzIHdyaXR0ZW5cbi8vIGJ5IHdoYXQgaXQgaG9sZHMuIFVuY2hhbmdlZCB3aGVuIHRoZSBkYXRhIGhhcyBubyBvdXRwdXRzLlxuZnVuY3Rpb24gd2l0aE91dHB1dENvbHVtbnMoXG4gIGNvbHVtbnM6IEV4cG9ydExpc3RDb2x1bW5bXSxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgYXV0aG9yZWQ6IHJlYWRvbmx5IExpc3RDb2x1bW5bXSxcbik6IEV4cG9ydExpc3RDb2x1bW5bXSB7XG4gIGlmICghZGF0YS5vdXRwdXRzKSB7XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuICBjb25zdCBvdXRwdXRzID0gbGlzdE91dHB1dENvbHVtbnMoY29sdW1ucywgZGF0YSwgYXV0aG9yZWQpO1xuXG4gIHJldHVybiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAob3V0cHV0c1tjb2x1bW4uY29sdW1uXVxuICAgID8geyAuLi5jb2x1bW4sIG51bWVyaWM6IHRydWUsIG91dHB1dDogb3V0cHV0c1tjb2x1bW4uY29sdW1uXSB9XG4gICAgOiBjb2x1bW4pKTtcbn1cblxuLy8gVGhlIGhlYWRpbmcgb3ZlciBlYWNoIGNvbHVtbiBvZiBsaXN0Q29sdW1ucygpOiBhIHBsYWluIGxpc3QncyBjb25maWd1cmVkXG4vLyBsYWJlbCwgZWxzZSBpdHMgY29sdW1uOyBhIGNyb3NzLXRhYidzIGhlYWRpbmcgZnJvbSBwaXZvdENvbHVtblNwZWNzKCkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGhpZGRlbjogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgbG9jYWxlLCBoaWRkZW4pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbik7XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QncyB0b3RhbHMgcm93LCBvbmUgY2VsbCBwZXIgY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGVhY2hcbi8vIHRvdGFsIHdyaXR0ZW4gbGlrZSBpdHMgY29sdW1uJ3MgY2VsbHMsIGFuZCBMSVNUX1RPVEFMX0xBQkVMIGluIHRoZSBmaXJzdFxuLy8gY29sdW1uIHdoZW4gdGhhdCBjb2x1bW4gaG9sZHMgbm8gdG90YWwgKGEgY3Jvc3MtdGFiJ3Mgcm93IGtleSkuIG51bGwgd2hlblxuLy8gdGhlIGxpc3QgaGFzIG5vIHRvdGFscy4gVGhlIENTViBuZXZlciBjYXJyaWVzIG9uZTogaXRzIHJvd3Mgc3RheSByYXcuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRvdGFsc1JvdyhcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY29sdW1uczogcmVhZG9ubHkgRXhwb3J0TGlzdENvbHVtbltdLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3QgdG90YWxzID0gZGF0YS50b3RhbHM7XG5cbiAgaWYgKCF0b3RhbHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxhYmVsID0gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKGNvbHVtbnMsIHRvdGFscyk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChjb2x1bW4uY29sdW1uID09PSBsYWJlbFxuICAgID8gTElTVF9UT1RBTF9MQUJFTFxuICAgIDogZXhwb3J0Q2VsbCh0b3RhbHNbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgdGltZXpvbmUsIGNvbnRleHQsIHRvdGFscykpKTtcbn1cblxuLy8gVGhlIHN1YnRpdGxlIHVuZGVyIGEgY2hhcnQncyBvciBhIGxpc3QncyB0aXRsZTogdGhlIGRheXMgaXQgcmVhZHMsIGFuZCB0aGVcbi8vIGRheXMgZWFjaCBjb21wYXJpc29uIGxhbmUgcmVhZHMgKCdTZXAgMSDigJMgMTUsIDIwMjYgwrcgdnMgcHJldmlvdXMgbW9udGg6XG4vLyBBdWcgMSDigJMgMTUsIDIwMjYnKSwgYXMgdGhlIHNjcmVlbidzIG5vdGUgb3BlbnMgd2l0aC4gJycgd2l0aG91dCBhXG4vLyBjb21wYXJpc29uIG9yIGEgdGltZWZyYW1lLCBhbmQgZm9yIGEgS1BJLCB3aG9zZSBjYXJkIHByaW50cyBpdHMgb3duIHdpbmRvd1xuLy8gbGluZS5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRXaW5kb3dzTGluZShpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIHRpbWV6b25lOiBzdHJpbmcsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgaWYgKCFpdGVtLmRhdGEgfHwgaXRlbS5jb21wb25lbnQudHlwZSA9PT0gJ2twaScpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50V2luZG93c0xpbmUoaXRlbS5kYXRhLCB7IGxvY2FsZSwgdGltZXpvbmUgfSk7XG59XG5cbi8vIFRoZSBub3RlIGxpbmVzIHVuZGVyIGEgY29tcG9uZW50J3MgYm94OiB3aHkgYSBjb21wYXJpc29uIHJlYWRzIGFzIGl0IGRvZXMsXG4vLyBhIEtQSSdzIGRlbHRhIG5vdGUsIGFuZCB3aGF0IGVhY2ggd2luZG93ZWQgdmFsdWUgaXMgYW5kIHdoeS4gVGhlIGRheXMgYXJlXG4vLyBsZWZ0IG91dCAodGhlIHN1YnRpdGxlIG9yIHRoZSBLUEkgY2FyZCBwcmludHMgdGhlbSksIGFuZCB0aGUgd2luZG93XG4vLyBkZXNjcmlwdGlvbnMgYXJlIGluLCBzaW5jZSBhIGZpbGUgaGFzIG5vIHRvb2x0aXAgb3IgaGVhZGVyIHRvIGNhcnJ5IHRoZW0uXG4vLyBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZSBrZXlzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydE5vdGVMaW5lcyhpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsIHRpbWV6b25lOiBzdHJpbmcsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50Tm90ZUxpbmVzKGl0ZW0uZGF0YSwgeyBsb2NhbGUsIHRpbWV6b25lIH0sIHsgd2luZG93czogZmFsc2UsIHdpbmRvd0Rlc2NyaXB0aW9uczogdHJ1ZSB9KTtcbn1cblxuLy8gV2hldGhlciBhIEtQSSBjYXJkIGhhcyBtb3JlIHRvIGRyYXcgdGhhbiBpdHMgdmFsdWUgYW5kIGxhYmVsLiBXaXRob3V0LCBib3RoXG4vLyBleHBvcnRzIGRyYXcgdGhlIHRpbGUgZXhhY3RseSBhcyB0aGV5IGFsd2F5cyBoYXZlLlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUNhcmRIYXNFeHRyYXModmlldzogS3BpQ2FyZFZpZXcsIG5vdGVzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEodmlldy5kZWx0YSB8fCB2aWV3LndpbmRvdyB8fCB2aWV3LnRhcmdldCB8fCB2aWV3LnNwYXJrbGluZSB8fCBub3Rlcy5sZW5ndGgpO1xufVxuXG4vLyBXaGljaCBwYXJ0cyBvZiBhIEtQSSBjYXJkIGZpdCBhIHRpbGUgYGF2YWlsYWJsZWAgdGFsbC4gQSBzaG9ydCB0aWxlIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lIGZpcnN0LCB0aGVuIHRoZSB0YXJnZXQgbGluZSwgdGhlbiB0aGUgbm90ZXM7IHRoZSB2YWx1ZSwgaXRzIGxhYmVsXG4vLyBhbmQgdGhlIGRlbHRhIHJvdyBhbHdheXMgc3RheSwgYW5kIHRoZSB3aW5kb3cgbGluZSBzdGF5cyB3aGVuZXZlciB0aGUgY2FyZFxuLy8gc2hvd3MgYSBjb21wYXJpc29uIChpdHMgZGF5cyBhcmUgd2hhdCB0aGUgZGVsdGEgaXMgbWVhc3VyZWQgb3ZlcikuIFRoZVxuLy8gc3BhcmtsaW5lIG5lZWRzIHZhbHVlcyB0byBkcmF3LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydFBhcnRzKFxuICB2aWV3OiBLcGlDYXJkVmlldyxcbiAgbm90ZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBhdmFpbGFibGU6IG51bWJlcixcbiAgaGVpZ2h0czogS3BpRXhwb3J0SGVpZ2h0cyxcbik6IEtwaUV4cG9ydFBhcnRzIHtcbiAgY29uc3QgcGFydHM6IEtwaUV4cG9ydFBhcnRzID0ge1xuICAgIGRlbHRhOiAhIXZpZXcuZGVsdGEsXG4gICAgd2luZG93OiAhIXZpZXcud2luZG93LFxuICAgIHRhcmdldDogISF2aWV3LnRhcmdldCxcbiAgICBzcGFya2xpbmU6ICEhdmlldy5zcGFya2xpbmU/LnZhbHVlcy5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwpLFxuICAgIG5vdGVzOiBbLi4ubm90ZXNdLFxuICB9O1xuICBjb25zdCBoZWlnaHQgPSAoKSA9PiBrcGlFeHBvcnRIZWlnaHQodmlldywgcGFydHMsIGhlaWdodHMpO1xuXG4gIGlmIChoZWlnaHQoKSA+IGF2YWlsYWJsZSkge1xuICAgIHBhcnRzLnNwYXJrbGluZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGhlaWdodCgpID4gYXZhaWxhYmxlKSB7XG4gICAgcGFydHMudGFyZ2V0ID0gZmFsc2U7XG4gIH1cblxuICB3aGlsZSAoaGVpZ2h0KCkgPiBhdmFpbGFibGUgJiYgcGFydHMubm90ZXMubGVuZ3RoKSB7XG4gICAgcGFydHMubm90ZXMucG9wKCk7XG4gIH1cblxuICBpZiAoaGVpZ2h0KCkgPiBhdmFpbGFibGUgJiYgIXBhcnRzLmRlbHRhKSB7XG4gICAgcGFydHMud2luZG93ID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIEhvdyB0YWxsIHRoZSBjYXJkJ3MgZHJhd24gcGFydHMgc3RhbmQgdG9nZXRoZXIsIGluIHRoZSBoZWlnaHRzJyB1bml0LlxuZXhwb3J0IGZ1bmN0aW9uIGtwaUV4cG9ydEhlaWdodCh2aWV3OiBLcGlDYXJkVmlldywgcGFydHM6IEtwaUV4cG9ydFBhcnRzLCBoZWlnaHRzOiBLcGlFeHBvcnRIZWlnaHRzKTogbnVtYmVyIHtcbiAgcmV0dXJuIGhlaWdodHMudmFsdWVcbiAgICArICh2aWV3LmxhYmVsID8gaGVpZ2h0cy5sYWJlbCA6IDApXG4gICAgKyAocGFydHMuZGVsdGEgPyBoZWlnaHRzLmRlbHRhIDogMClcbiAgICArIChwYXJ0cy53aW5kb3cgPyBoZWlnaHRzLndpbmRvdyA6IDApXG4gICAgKyAocGFydHMudGFyZ2V0ID8gaGVpZ2h0cy50YXJnZXQgOiAwKVxuICAgICsgKHBhcnRzLnNwYXJrbGluZSA/IGhlaWdodHMuc3BhcmtsaW5lIDogMClcbiAgICArIHBhcnRzLm5vdGVzLmxlbmd0aCAqIGhlaWdodHMubm90ZTtcbn1cblxuLy8gVGhlIGxhc3Qgcm93IG9mIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgdGhhdCBzdG9wcyBzaG9ydCBvZiBpdHMgcmVzdWx0OiBob3dcbi8vIG1hbnkgcm93cyB0aGUgZmlsZSBsZWF2ZXMgb3V0IGFuZCB3aGVyZSB0aGUgd2hvbGUgc2V0IGNhbiBiZSBoYWQuIEVhY2hcbi8vIGZvcm1hdCBmZXRjaGVzIGl0cyBvd24gbnVtYmVyIG9mIHJvd3MgKFBERl9MSVNUX1JPV1MsIFBQVFhfTElTVF9ST1dTKSwgYW5kXG4vLyBib3RoIG5hbWUgd2hhdCBpcyBsZWZ0IHdpdGggdGhpcyBvbmUgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gbW9yZVJvd3NOb3RpY2UocmVtYWluaW5nOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYOKApiAke3JlbWFpbmluZ30gbW9yZSByb3cocykg4oCUIHVzZSB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydCBmb3IgdGhlIGZ1bGwgZGF0YXNldGA7XG59XG5cbi8vIFRoZSBwYWdlcyBvZiBhIGNvbGxlY3RlZCByZXBvcnQgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSB0aWxlIHdob3NlIHF1ZXJ5XG4vLyBmYWlsZWQg4oCUIHdoYXQgdGhlIGV4cG9ydCBnYXRlIG5hbWVzIHRvIHRoZSB1c2VyLCBhbmQgd2hhdCBtYWtlcyBcInNvbWUgb2YgdGhpc1xuLy8gZmlsZSBpcyBtaXNzaW5nXCIgYSBmYWN0IHRoZSBjYWxsZXIgY2FuIGFjdCBvbiByYXRoZXIgdGhhbiBhIHRoaW5nIHRoZXkgbm90aWNlXG4vLyBpbiB0aGUgUERGIGFmdGVyd2FyZHMuXG5leHBvcnQgZnVuY3Rpb24gZmFpbGVkUGFnZU5hbWVzKGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogc3RyaW5nW10ge1xuICAvLyBOdW1iZXJlZCBiZWZvcmUgdGhlIGZpbHRlciDigJQgYW4gdW5uYW1lZCBwYWdlIDQgdGhhdCBmYWlsZWQgaGFzIHRvIHJlYWRcbiAgLy8gXCJQYWdlIDRcIiwgbm90IFwiUGFnZSAxXCIgYmVjYXVzZSBpdCBoYXBwZW5lZCB0byBiZSB0aGUgZmlyc3QgZmFpbHVyZS5cbiAgcmV0dXJuIGNvbGxlY3RlZC5wYWdlc1xuICAgIC5tYXAoKHBhZ2UsIGluZGV4KSA9PiAoeyBwYWdlLCBudW1iZXI6IGluZGV4ICsgMSB9KSlcbiAgICAuZmlsdGVyKCh7IHBhZ2UgfSkgPT4gcGFnZS5jb21wb25lbnRzLnNvbWUoaXNGYWlsZWQpKVxuICAgIC5tYXAoKHsgcGFnZSwgbnVtYmVyIH0pID0+IHBhZ2UucGFnZS5uYW1lIHx8IGBQYWdlICR7bnVtYmVyfWApO1xufVxuXG4vLyBHYXRoZXJzIGV2ZXJ5dGhpbmcgYW4gZXhwb3J0IG5lZWRzOiBldmVyeSBjb21wb25lbnQncyBkYXRhIGFjcm9zcyBBTEwgcGFnZXNcbi8vICh0aGUgY2FudmFzIG9ubHkgcmVuZGVycyB0aGUgYWN0aXZlIHBhZ2UsIHNvIGV4cG9ydHMgY2FuJ3Qgc2NyYXBlIHRoZVxuLy8gc2NyZWVuKSwgZmV0Y2hlZCBmcmVzaCB3aXRoIHRoZSB2aWV3ZXIncyBjdXJyZW50IGZpbHRlciBzdGF0ZS5cbi8vXG4vLyBBIGZhaWxlZCBjb21wb25lbnQgcmVzb2x2ZXMgdG8gYSBudWxsIGBkYXRhYCByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZVxuLy8gY29sbGVjdGlvbiDigJQgYnV0IHRoYXQgaXMgc28gdGhlIGNhbGxlciBjYW4gUkVQT1JUIHdoYXQgZmFpbGVkLCBub3Qgc28gaXQgY2FuXG4vLyBiZSBpZ25vcmVkOiBzZWUgZmFpbGVkUGFnZU5hbWVzKCkgYW5kIHRoZSBleHBvcnQgZ2F0ZSB0aGF0IHVzZXMgaXQuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICAvLyBsaXN0Um93cyBpcyBob3cgbWFueSByb3dzIGVhY2ggbGlzdCBmZXRjaGVzOiB0aGUgcmVuZGVyZXIncyBvd24gY2FwLCBzaW5jZVxuICAvLyBhIFBERiB0YWJsZSBjb250aW51ZXMgb250byBleHRyYSBwYWdlcyBhbmQgYSBzbGlkZSB0YWJsZSBjYW5ub3QuXG4gIHB1YmxpYyBjb2xsZWN0KHJlcG9ydDogUmVwb3J0LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRSZXBvcnQ+IHtcbiAgICBjb25zdCBzbG90czogeyBwYWdlSW5kZXg6IG51bWJlcjsgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQgfVtdID0gW107XG5cbiAgICByZXBvcnQucGFnZXMuZm9yRWFjaCgocGFnZSwgcGFnZUluZGV4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBwYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgICAgc2xvdHMucHVzaCh7IHBhZ2VJbmRleCwgY29tcG9uZW50IH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGV4dCBibG9ja3MgaGF2ZSBub3RoaW5nIHRvIGZldGNoIOKAlCB0aGV5IHJpZGUgdGhyb3VnaCB3aXRoIG5vIGRhdGEuIFRoZVxuICAgIC8vIGhlYWRlci9mb290ZXIgKHJlcG9ydC5tYXN0ZXIpIGlzIHJlYWQgYnkgdGhlIHJlbmRlcmVycyBzdHJhaWdodCBvZmYgdGhlXG4gICAgLy8gcmVwb3J0IGZvciB0aGUgc2FtZSByZWFzb24uXG5cbiAgICAvLyBSZWxlYXNlZCBhIGZldyBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYWxsIGF0IG9uY2UuIG1lcmdlTWFwIGNvbXBsZXRlcyBvdXRcbiAgICAvLyBvZiBvcmRlciwgc28gZWFjaCByZXN1bHQgY2FycmllcyB0aGUgc2xvdCBpdCBjYW1lIGZyb20gYW5kIHRoZSByb3dzIGFyZVxuICAgIC8vIGZpbGVkIGJ5IGluZGV4IOKAlCB0aGUgZGVjaydzIHBhZ2Ugb3JkZXIgY2FuJ3QgZGVwZW5kIG9uIHdoaWNoIHF1ZXJ5XG4gICAgLy8gaGFwcGVuZWQgdG8gZmluaXNoIGZpcnN0LlxuICAgIGNvbnN0IGFsbCQgPSBzbG90cy5sZW5ndGhcbiAgICAgID8gZnJvbShzbG90cy5tYXAoKHNsb3QsIGluZGV4KSA9PiAoeyBzbG90LCBpbmRleCB9KSkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1lcmdlTWFwKFxuICAgICAgICAgICAgKHsgc2xvdCwgaW5kZXggfSkgPT4gdGhpcy5fY29tcG9uZW50RGF0YShyZXBvcnQsIHNsb3QuY29tcG9uZW50LCBsaXN0Um93cylcbiAgICAgICAgICAgICAgLnBpcGUobWFwKChpdGVtKSA9PiAoeyBpdGVtLCBpbmRleCB9KSkpLFxuICAgICAgICAgICAgRVhQT1JUX0NPTkNVUlJFTkNZLFxuICAgICAgICAgICksXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICApXG4gICAgICA6IG9mKFtdIGFzIHsgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50OyBpbmRleDogbnVtYmVyIH1bXSk7XG5cbiAgICAvLyBUaGUgc3VtbWFyeSByaWRlcyBhbG9uZ3NpZGUgdGhlIGNvbXBvbmVudCBkYXRhIHJhdGhlciB0aGFuIGJlaW5nIGJ1aWx0IGF0XG4gICAgLy8gdGhlIGVuZCwgYmVjYXVzZSBuYW1pbmcgYSBzZWxlY3QgZmlsdGVyJ3MgdmFsdWVzIGlzIGl0c2VsZiBhIHJlcXVlc3QuXG4gICAgcmV0dXJuIGZvcmtKb2luKHsgY29sbGVjdGVkOiBhbGwkLCBmaWx0ZXJTdW1tYXJ5OiB0aGlzLmdldEZpbHRlclN1bW1hcnkocmVwb3J0KSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoeyBjb2xsZWN0ZWQsIGZpbHRlclN1bW1hcnkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW10gPSByZXBvcnQucGFnZXMubWFwKChwYWdlKSA9PiAoeyBwYWdlLCBjb21wb25lbnRzOiBbXSB9KSk7XG5cbiAgICAgICAgICBbLi4uY29sbGVjdGVkXVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KVxuICAgICAgICAgICAgLmZvckVhY2goKHsgaXRlbSwgaW5kZXggfSkgPT4ge1xuICAgICAgICAgICAgICBwYWdlc1tzbG90c1tpbmRleF0ucGFnZUluZGV4XS5jb21wb25lbnRzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBwYWdlcyxcbiAgICAgICAgICAgIGZpbHRlclN1bW1hcnksXG4gICAgICAgICAgICBjb250ZXh0TGluZXM6IHRoaXMuX2NvbnRleHRMaW5lcyhyZXBvcnQpLFxuICAgICAgICAgICAgZm9ybWF0Q29udGV4dDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFwiUmVwb3J0IFBlcmlvZDogSnVuIDEyLCAyMDI1IOKAkyBKdW4gMTIsIDIwMjZcIiwgXCJSZWdpb246IE5vcnRoLCBFYXN0XCIg4oCUIG9uZVxuICAvLyBsaW5lIHBlciBmaWx0ZXIgZ3JvdXAgdGhhdCBoYXMgYW4gYWN0aXZlIHNlc3Npb24gdmFsdWUsIHRoZW4gdGhlIGdyb3VwLWJ5XG4gIC8vIGxpbmUuIFRoZSBmaWx0ZXIgYmFyIGFzIHRoZSB2aWV3ZXIgcmVhZHMgaXQ6IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgY292ZXJzXG4gIC8vIHByaW50IGl0LCBhbmQgdGhlIHJlcG9ydCB6aXAgZXhwb3J0IHNlbmRzIGl0IGZvciBpdHMgbm90ZXMgZmlsZS4gRGF0ZXMgYXJlXG4gIC8vIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gdGhlIG5vdGVzIG5hbWUgdGhlIHBlcmlvZCBhcyB0aGUgY292ZXJcbiAgLy8gZG9lcy5cbiAgLy9cbiAgLy8gQSBzZWxlY3QgZ3JvdXAgc3RvcmVzIGlkcywgc28gaXRzIGxpbmUgaGFzIHRvIGJlIG5hbWVkIG9mZiB0aGUgb3B0aW9uIGxpc3RcbiAgLy8gYmVmb3JlIGl0IGNhbiBiZSBwcmludGVkOyBhIGRhdGUgb3Iga2V5d29yZCBncm91cCBhbHJlYWR5IGhvbGRzIGl0cyBvd25cbiAgLy8gZGlzcGxheSB2YWx1ZSBhbmQgcmVzb2x2ZXMgc3luY2hyb25vdXNseS5cbiAgcHVibGljIGdldEZpbHRlclN1bW1hcnkocmVwb3J0OiBSZXBvcnQpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgbGluZXM6IE9ic2VydmFibGU8c3RyaW5nPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCAnRmlsdGVyJztcblxuICAgICAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHt0aGlzLl9kYXRlKHZhbHVlLnN0YXJ0KX0g4oCTICR7dGhpcy5fZGF0ZSh2YWx1ZS5lbmQpfWApKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0aGlzLl9zZWxlY3RMaW5lKGxhYmVsLCBncm91cCwgcmVwb3J0LmlkLCB2YWx1ZS52YWx1ZXMpKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogXCIke3ZhbHVlLnZhbHVlLnRyaW0oKX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgZ3JvdXAtYnkgZ3JhaW4sIHVuZGVyIHRoZSByZXBvcnQncyBvd24gbmFtZSBmb3IgdGhlIGNvbnRyb2wg4oCUIGEgY292ZXJcbiAgICAvLyBzaGVldCByZWFkaW5nIFwiRnJlcXVlbmN5XCIgd2hlbiB0aGUgcmVwb3J0IGNhbGxzIGl0IFwiUGVyaW9kXCIgZGVzY3JpYmVzIGFcbiAgICAvLyBjb250cm9sIHRoZSByZWFkZXIgY2Fubm90IGZpbmQgb24gc2NyZWVuLlxuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgaWYgKGdyYW51bGFyaXR5KSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbiAgICAgIGNvbnN0IGxhYmVsID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JztcbiAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke29wdGlvbj8ubmFtZSA/PyBncmFudWxhcml0eX1gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGZvcmtKb2luKGxpbmVzKSA6IG9mKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBvbmVudERhdGEocmVwb3J0OiBSZXBvcnQsIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBsaXN0Um93czogbnVtYmVyKTogT2JzZXJ2YWJsZTxDb2xsZWN0ZWRDb21wb25lbnQ+IHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmV0dXJuIG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zOiBbXSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuICAgIC8vIEEgdGltZS1zZXJpZXMgY2hhcnQgY2FycmllcyB0aGUgdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW4gc28gdGhlIGV4cG9ydFxuICAgIC8vIHJlLWJ1Y2tldHMgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGRvZXM7IGxpc3RzIGNhcnJ5IHRoZWlyIGV4cG9ydCBwYWdpbmdcbiAgICAvLyBhbmQgdGhlIHZpZXdlcidzIGhlYWRlciBzb3J0IGFuZCBzZWFyY2gsIHNvIHRoZSB0YWJsZSByZWFkcyBpbiB0aGVcbiAgICAvLyBzY3JlZW4ncyBvcmRlciBhbmQgaG9sZHMgdGhlIHNjcmVlbidzIHJvd3MuXG4gICAgLy9cbiAgICAvLyBUaGUgdGltZS1zZXJpZXMgY2hlY2sgZGVsaWJlcmF0ZWx5IG1pcnJvcnMgdGhlIHNlcnZlcidzIGNhbm9uaWNhbFxuICAgIC8vIFJlcG9ydFF1ZXJ5UnVubmVyOjpfaXNUaW1lU2VyaWVzQ2hhcnQsIHNvIGEgcHJvZHVjdCBwaW5uZWQgdG8gYW4gb2xkZXJcbiAgICAvLyBmcmFtZXdvcmsgZG9lcyBub3QgcmUtYnVja2V0IGEgbm9uLXRpbWUgY2hhcnQuXG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3QgaXNUaW1lU2VyaWVzID0gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJztcbiAgICBjb25zdCBzZWFyY2ggPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2goY29tcG9uZW50LmlkKSA/PyB1bmRlZmluZWRcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IGxpc3RSb3dzLCBzb3J0OiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydChjb21wb25lbnQuaWQpID8/IHVuZGVmaW5lZCwgc2VhcmNoIH1cbiAgICAgIDogKGlzVGltZVNlcmllcyAmJiBmcmVxdWVuY3kgPyB7IGZyZXF1ZW5jeSB9IDoge30pO1xuICAgIC8vIFRoZSB0YWJsZSBsZWF2ZXMgb3V0IHRoZSBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkLiBUaGUgcm93cyBhcmUgZmV0Y2hlZFxuICAgIC8vIHdob2xlLCBhcyB0aGUgc2NyZWVuIGZldGNoZXMgdGhlbSwgYW5kIHRoZSByZW5kZXJlcnMgZHJvcCB0aGUgY2VsbHMuXG4gICAgY29uc3QgaGlkZGVuQ29sdW1ucyA9IFsuLi50aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudC5pZCldO1xuXG4gICAgLy8gaGFuZGxlcnM6IGZhbHNlIGtlZXBzIHRoZSBhcHAncyBnbG9iYWwgZXJyb3IgZGlhbG9nIG91dCBvZiB0aGlzLiBBIGZhaWxlZFxuICAgIC8vIHRpbGUgaXMgcmVwb3J0ZWQgb25jZSwgYnkgdGhlIGV4cG9ydCBnYXRlLCBuYW1pbmcgdGhlIHBhZ2VzIGl0IGNvc3Qg4oCUXG4gICAgLy8gbmV2ZXIgYXMgdGVuIHN0YWNrZWQgbW9kYWxzIGNhcnJ5aW5nIHRoZSBkYXRhYmFzZSdzIG93biB3b3JkaW5nLlxuICAgIC8vXG4gICAgLy8gQSBzZWFyY2ggdGhlIHNlcnZlciBjb3VsZCBub3QgYXBwbHkgKHNlYXJjaE5vdGU6IHRoZSBsaXN0IGhhcyBubyB0ZXh0XG4gICAgLy8gY29sdW1uKSBuYXJyb3dlZCBub3RoaW5nLCBzbyB0aGUgaXRlbSBkb2VzIG5vdCBjYXJyeSBpdC5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSwgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb2xsZWN0ZWRDb21wb25lbnQgPT4gKHNlYXJjaCAmJiAhZGF0YT8uc2VhcmNoTm90ZVxuICAgICAgICAgID8geyBjb21wb25lbnQsIGRhdGEsIHNlYXJjaCwgaGlkZGVuQ29sdW1ucyB9XG4gICAgICAgICAgOiB7IGNvbXBvbmVudCwgZGF0YSwgaGlkZGVuQ29sdW1ucyB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwsIGhpZGRlbkNvbHVtbnMgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLCBhbmQgdGhlIGN1cnJlbmN5IGl0IHNheXNcbiAgLy8gdGhlIHJlcG9ydCdzIG1vbmV5IGlzIGluIChhIGxhYmVsOiBub3RoaW5nIGlzIGNvbnZlcnRlZCkuIE9ubHkgdGhlXG4gIC8vIHNlcnZlcidzIHZhbHVlcyBhcmUgcHJpbnRlZDogdGhlIGJyb3dzZXIncyB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUnc1xuICAvLyBmYWxsYmFjayBmb3IgYW4gb2xkZXIgc2VydmVyKSBpcyBub3Qgd2hhdCB0aGUgbnVtYmVycyB3ZXJlIG1lYXN1cmVkIGluLFxuICAvLyBhbmQgYW4gb2xkZXIgc2VydmVyIG5hbWVzIG5vIGN1cnJlbmN5IGF0IGFsbC5cbiAgcHJpdmF0ZSBfY29udGV4dExpbmVzKHJlcG9ydDogUmVwb3J0KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXSksXG4gICAgICAuLi4ocmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5ID8gW2BDdXJyZW5jeTogJHtyZXBvcnQuZWZmZWN0aXZlQ3VycmVuY3l9YF0gOiBbXSksXG4gICAgXTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==