@firestitch/report 18.10.1 → 18.10.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.
Files changed (37) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +1 -0
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +25 -1
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +12 -0
  4. package/app/reports/components/report-component/report-component.component.d.ts +1 -0
  5. package/app/reports/data/report.data.d.ts +2 -2
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +13 -1
  7. package/app/reports/export/report-export-collector.service.d.ts +13 -5
  8. package/app/reports/export/report-filter-lines.d.ts +3 -0
  9. package/app/reports/filter-text.d.ts +8 -0
  10. package/app/reports/format.d.ts +1 -0
  11. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +1 -0
  12. package/app/reports/report-filter-items.d.ts +9 -0
  13. package/app/reports/text.d.ts +16 -0
  14. package/esm2022/app/reports/components/component-text/component-text.component.mjs +34 -22
  15. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +254 -42
  16. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +118 -13
  17. package/esm2022/app/reports/components/report-component/report-component.component.mjs +30 -11
  18. package/esm2022/app/reports/data/report.data.mjs +12 -7
  19. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +57 -14
  20. package/esm2022/app/reports/export/report-export-collector.service.mjs +84 -33
  21. package/esm2022/app/reports/export/report-filter-lines.mjs +25 -8
  22. package/esm2022/app/reports/export/report-pdf.service.mjs +31 -21
  23. package/esm2022/app/reports/export/report-pptx.service.mjs +21 -11
  24. package/esm2022/app/reports/filter-text.mjs +154 -0
  25. package/esm2022/app/reports/format.mjs +3 -2
  26. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +1 -1
  27. package/esm2022/app/reports/report-filter-items.mjs +24 -2
  28. package/esm2022/app/reports/text.mjs +59 -13
  29. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +14 -11
  30. package/esm2022/app/reports/views/report/report.component.mjs +15 -12
  31. package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs → firestitch-report-echarts-CyHkFToO.mjs} +2 -2
  32. package/fesm2022/{firestitch-report-echarts-DHEH_K_q.mjs.map → firestitch-report-echarts-CyHkFToO.mjs.map} +1 -1
  33. package/fesm2022/{firestitch-report-firestitch-report-ZcHTnNKq.mjs → firestitch-report-firestitch-report-DftB7M1o.mjs} +2653 -1955
  34. package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +1 -0
  35. package/fesm2022/firestitch-report.mjs +1 -1
  36. package/package.json +1 -1
  37. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { ItemType, getExcludeName } from '@firestitch/filter';
2
2
  import { format, parseISO } from 'date-fns';
3
3
  import { of } from 'rxjs';
4
- import { map, shareReplay } from 'rxjs/operators';
4
+ import { catchError, map, shareReplay } from 'rxjs/operators';
5
5
  import { filterLineText, matchLineText } from './export/report-filter-lines';
6
6
  import { DAY_SHORT, formatLocalDate, resolveFormatContext } from './format';
7
7
  import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
@@ -135,6 +135,28 @@ export function resolveOptionValues(options$, values, label = () => null) {
135
135
  ? of(named([]))
136
136
  : options$.pipe(map(named));
137
137
  }
138
+ // A reader of each group's option list (loadGroupOptions) that loads a group's
139
+ // list once and hands every later read of that group the same replayed
140
+ // request, so everything that names one group's picks — the cover's filter
141
+ // line, its {{filter.<id>}} token, the next pick — shares one fetch. A read
142
+ // that failed is fetched again by the next one (shareReplay drops an error).
143
+ export function groupOptionsReader(reportData) {
144
+ const loaded = new Map();
145
+ return (group, reportId) => {
146
+ const options$ = loaded.get(group.id) ?? loadGroupOptions(group, reportData, reportId);
147
+ loaded.set(group.id, options$);
148
+ return options$;
149
+ };
150
+ }
151
+ // The names of a select group's picks (kept or left out), as its chips in
152
+ // the filter bar name them, for a {{filter.<id>}} token: a name the bar's
153
+ // lists taught (`label`, ReportFilterOptionsService.label) first, else the
154
+ // group's option list. null when the list could not be read: the token then
155
+ // reads the em dash rather than a row of ids.
156
+ export function pickedOptionNames(options$, values, label = () => null) {
157
+ return resolveOptionValues(options$, values, label)
158
+ .pipe(map((options) => options.map((option) => option.name)), catchError(() => of(null)));
159
+ }
138
160
  // Case-insensitive name filter applied to a loaded option list — the typed
139
161
  // keyword has to be matched here because fs-autocomplete renders what we return
140
162
  // verbatim.
@@ -470,4 +492,4 @@ function selectQueryValues(raw) {
470
492
  }
471
493
  return String(raw).split(',');
472
494
  }
473
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTVFLE9BQU8sRUFDK0IsbUJBQW1CLEdBRXhELE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3hELENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4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QUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSwgSXRlbVR5cGUsIGdldEV4Y2x1ZGVOYW1lIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIENhc2UtaW5zZW5zaXRpdmUgbmFtZSBmaWx0ZXIgYXBwbGllZCB0byBhIGxvYWRlZCBvcHRpb24gbGlzdCDigJQgdGhlIHR5cGVkXG4vLyBrZXl3b3JkIGhhcyB0byBiZSBtYXRjaGVkIGhlcmUgYmVjYXVzZSBmcy1hdXRvY29tcGxldGUgcmVuZGVycyB3aGF0IHdlIHJldHVyblxuLy8gdmVyYmF0aW0uXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hPcHRpb25zKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICBrZXl3b3JkPzogc3RyaW5nLFxuKTogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+IHtcbiAgY29uc3QgdGVybSA9IChrZXl3b3JkID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gb3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+IHRlcm1cbiAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpXG4gICAgOiBvcHRpb25zKSk7XG59XG5cbi8vIFRoZSBwYW5lbCByb3cgb2YgYSBzZWxlY3Qgd2hvc2UgbGlzdCB0aGUgc2VydmVyIGN1dCBhdCA1MDAuXG5leHBvcnQgY29uc3QgT1BUSU9OU19UUlVOQ0FURURfTk9URSA9ICdTaG93aW5nIHRoZSBmaXJzdCA1MDAuIFR5cGUgdG8gbmFycm93Lic7XG5cbi8vIFRoZSBwYW5lbCByb3cgb2YgYSBzZWxlY3Qgd2hvc2UgbGlzdCBjb3VsZCBub3QgYmUgcmVhZC4gVGhlIG5leHQgZm9jdXMgb3Jcbi8vIGtleXN0cm9rZSBhc2tzIGFnYWluLlxuZXhwb3J0IGNvbnN0IE9QVElPTlNfRkFJTEVEX05PVEUgPSAnQ291bGQgbm90IGxvYWQgdGhlIGxpc3QuJztcblxuLy8gQnVpbGQgdGhlIGZzLWZpbHRlciBjb25maWcgaXRlbSBmb3IgYSBncm91cCwgc2VlZGluZyBpdHMgZGVmYXVsdCBmcm9tIHRoZVxuLy8gY3VycmVudCBzZXNzaW9uIHZhbHVlIHNvIGF1dGhvcmVkL3JlbGF0aXZlIGRlZmF1bHRzIHNob3cgc2VsZWN0ZWQgb24gb3Blbi5cbi8vIEEgc2VsZWN0IGxpc3RzIHdoYXQgYG9wdGlvbnNgIG9mZmVycyBmb3IgaXQgaW4gYHJlcG9ydGAuIGBmZWF0dXJlc2AgaXMgdGhlXG4vLyByZXBvcnQncyB2aWV3ZXJGZWF0dXJlczogYSBzZWxlY3Qgb2ZmZXJzICdFeGNsdWRlIHRoZXNlJyBieSB0aGUgcnVsZSBvZlxuLy8gb2ZmZXJzRXhjbHVkZSAodGhlIHNlcnZlciBsaXN0cyBleGNsdWRlVmFsdWVzIGFuZCBubyBtZW1iZXIgYmluZHMgc2V2ZXJhbFxuLy8gY29sdW1ucyksIGFuZCBhIG51bWJlciByYW5nZSBpcyBhIG1pbi9tYXggY29udHJvbCBvbmx5IHdoZW4gaXQgbGlzdHNcbi8vIG51bWJlclJhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckl0ZW1Gb3JHcm91cChcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSA9IFtdLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXBMYWJlbChncm91cCk7XG5cbiAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgIHJldHVybiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICByZXR1cm4gc2VsZWN0RmlsdGVySXRlbShncm91cCwgbGFiZWwsIG9wdGlvbnMsIHJlcG9ydCwgaW5pdGlhbCwgb2ZmZXJzRXhjbHVkZShncm91cCwgZmVhdHVyZXMpKTtcblxuICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgIHJldHVybiBmZWF0dXJlcy5pbmNsdWRlcygnbnVtYmVyUmFuZ2UnKVxuICAgICAgICA/IG51bWJlclJhbmdlRmlsdGVySXRlbShncm91cCwgbGFiZWwsIHJlcG9ydCwgaW5pdGlhbClcbiAgICAgICAgOiBrZXl3b3JkRmlsdGVySXRlbShuYW1lLCBsYWJlbCwgaW5pdGlhbCk7XG5cbiAgICBjYXNlICdrZXl3b3JkJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcbiAgfVxufVxuXG4vLyBBIGRhdGUgcmFuZ2Ugb3BlbnMgb24gaXRzIGRheXMsIGFuZCBpdHMgY2hpcCBzaG93cyB0aGVtLiBBIHByZXNldCBwaWNrZWQgaW5cbi8vIHRoZSBkYXRlIHBpY2tlciBvbmx5IHNldHMgdGhlIGRheXMuXG5mdW5jdGlvbiBkYXRlUmFuZ2VGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGhhc0RheXMgPSAhIShpbml0aWFsPy5zdGFydCB8fCBpbml0aWFsPy5lbmQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5EYXRlUmFuZ2UsXG4gICAgbGFiZWw6IHsgZnJvbTogYCR7bGFiZWx9IEZyb21gLCB0bzogYCR7bGFiZWx9IFRvYCB9LFxuICAgIGRlZmF1bHQ6IGhhc0RheXNcbiAgICAgID8geyBmcm9tOiBpbml0aWFsLnN0YXJ0ID8/IHVuZGVmaW5lZCwgdG86IGluaXRpYWwuZW5kID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrcywga2VwdCBvciBsZWZ0IG91dC4gV2l0aCBgZXhjbHVkZWAgdGhlIGxpc3QgaGFzIHRoZVxuLy8gJ0V4Y2x1ZGUgdGhlc2UnIHJvdywgYW5kIGEgdmFsdWUgdGhhdCBsZWF2ZXMgb3V0IG9wZW5zIHdpdGggaXQgb24uIEl0cyBsaXN0XG4vLyBpcyByZWFkIG9uIGZvY3VzIGFuZCBvbiBlYWNoIGtleXN0cm9rZTogdGhlIG9wdGlvbnMgc2VydmljZSBmZXRjaGVzIGl0IHdoZW5cbi8vIHRoZSBvdGhlciBmaWx0ZXJzIGNoYW5nZWQgc2luY2UgYW5kIHJlcGxheXMgaXQgb3RoZXJ3aXNlLCBhbmQgdHlwaW5nXG4vLyBmaWx0ZXJzIGl0IGhlcmUuIEEgbGlzdCB0aGUgc2VydmVyIGN1dCwgb3Igb25lIHRoYXQgY291bGQgbm90IGJlIHJlYWQsXG4vLyBzYXlzIHNvIGluIGEgcGFuZWwgcm93LlxuZnVuY3Rpb24gc2VsZWN0RmlsdGVySXRlbShcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICBsYWJlbDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkLFxuICBleGNsdWRlOiBib29sZWFuLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBleGNsdWRpbmcgPSBleGNsdWRlICYmICFpbml0aWFsPy52YWx1ZXM/Lmxlbmd0aCAmJiAhIWluaXRpYWw/LmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aDtcbiAgY29uc3QgcGlja3MgPSBleGNsdWRpbmcgPyBpbml0aWFsLmV4Y2x1ZGVWYWx1ZXMgOiBpbml0aWFsPy52YWx1ZXM7XG4gIGNvbnN0IG9wdGlvbnMkID0gb3B0aW9ucy5vcHRpb25zKGdyb3VwLCByZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogZ3JvdXBJdGVtTmFtZShncm91cCksXG4gICAgdHlwZTogSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMsXG4gICAgbGFiZWwsXG4gICAgZmV0Y2hPbkZvY3VzOiB0cnVlLFxuICAgIGV4Y2x1ZGU6IGV4Y2x1ZGUgPyB7fSA6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZXM6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBtYXRjaE9wdGlvbnMob3B0aW9ucyQsIGtleXdvcmQpLFxuICAgIHBhbmVsTm90ZTogKCkgPT4gb3B0aW9uc05vdGUob3B0aW9ucywgZ3JvdXAuaWQpLFxuICAgIC8vIFN0b3JlZCB2YWx1ZXMgYXJlIGlkcywgc28gYSBjaGlwIGlzIG5hbWVkIGJ5IGEgbmFtZSBhbHJlYWR5IGxlYXJuZWQgb3JcbiAgICAvLyBvbmNlIHRoZSBvcHRpb24gbGlzdCBoYXMgbG9hZGVkIOKAlCBoZW5jZSB0aGUgb2JzZXJ2YWJsZSBmb3JtIG9mIGBkZWZhdWx0YC5cbiAgICBkZWZhdWx0OiBwaWNrcz8ubGVuZ3RoXG4gICAgICA/ICgpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMob3B0aW9ucyQsIHBpY2tzLCAodmFsdWUpID0+IG9wdGlvbnMubGFiZWwoZ3JvdXAuaWQsIHZhbHVlKSlcbiAgICAgICAgLnBpcGUobWFwKChzZWxlY3RlZCkgPT4gKGV4Y2x1ZGluZyA/IHsgZXhjbHVkZTogdHJ1ZSwgc2VsZWN0ZWQgfSA6IHNlbGVjdGVkKSkpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCdzIGxhdGVzdCBsaXN0OiBhIGZhaWx1cmUgZmlyc3QsIHRoZW4gYSBjdXQgbGlzdC5cbmZ1bmN0aW9uIG9wdGlvbnNOb3RlKG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLCBncm91cElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKG9wdGlvbnMuZmFpbGVkKGdyb3VwSWQpKSB7XG4gICAgcmV0dXJuIE9QVElPTlNfRkFJTEVEX05PVEU7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy50cnVuY2F0ZWQoZ3JvdXBJZCkgPyBPUFRJT05TX1RSVU5DQVRFRF9OT1RFIDogbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UncyBsb3cgYW5kIGhpZ2ggZW5kcywgZWl0aGVyIG9uZSBvcGVuLiAwIGlzIGFuIGVuZCBsaWtlIGFueVxuLy8gb3RoZXIuIEl0cyBjaGlwIHJlYWRzIGFzIHRoZSBleHBvcnQgbGluZXMgZG8gKCdBbW91bnQ6IDAgb3IgbW9yZScsXG4vLyAnQW1vdW50OiAwIHRvIDEwJyk6IHRoZSBlbmRzIGFyZSByZWFkIG9mZiB0aGUgaXRlbSdzIHF1ZXJ5IHRoZSB3YXkgdGhlXG4vLyBiYXIncyBjaGFuZ2UgcmVhZHMgdGhlbSwgYW5kIHdvcmRlZCBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLlxuZnVuY3Rpb24gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHJlcG9ydDogUmVwb3J0IHwgbnVsbCxcbiAgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbWluID0gaW5pdGlhbD8ubWluID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgbWF4ID0gaW5pdGlhbD8ubWF4ID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYWxlID0gcmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0ID8/IHt9KS5sb2NhbGU7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlJhbmdlLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IG1pbiAhPT0gdW5kZWZpbmVkIHx8IG1heCAhPT0gdW5kZWZpbmVkID8geyBtaW4sIG1heCB9IDogdW5kZWZpbmVkLFxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gZmlsdGVyTGluZVRleHQoXG4gICAgICB7IGxhYmVsLCBsZXZlbDogZ3JvdXAubGV2ZWwgfSxcbiAgICAgIG51bWJlclJhbmdlRnJvbVF1ZXJ5KGl0ZW0ucXVlcnksIG5hbWUpLFxuICAgICAgeyBsb2NhbGUgfSxcbiAgICAgICdjaGlwJyxcbiAgICApLFxuICB9O1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkRmlsdGVySXRlbShuYW1lOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBsYWJlbCxcbiAgICBkZWZhdWx0OiBpbml0aWFsPy52YWx1ZSxcbiAgfTtcbn1cblxuLy8gVGhlIGdyb3VwcyBhIG1hdGNoIG9mICdhbnknIGNvbWJpbmVzOiByZXBvcnQgYmFyIGdyb3VwcyAoYSBwYWdlIGdyb3VwIG9uXG4vLyBpdHMgb3duIHBhZ2Ugb25seSkgdGhhdCBhIHZpZXdlciBwaWNrcyB2YWx1ZXMsIHRleHQgb3IgYSBudW1iZXIgcmFuZ2UgaW4uXG4vLyBEYXRlcywgdGlsZS1vbmx5IGdyb3VwcyBhbmQgdGhlIGNyb3NzLWZpbHRlciBhbHdheXMgbmFycm93IG9uIHRoZWlyIG93bi5cbi8vIFRoZSBzZXJ2ZXIgaG9sZHMgdGhlIHNhbWUgcnVsZSBhbmQgY2hlY2tzIGV2ZXJ5IGlkIGl0IGlzIHNlbnQuXG5jb25zdCBNQVRDSF9BTllfTEVWRUxTOiByZWFkb25seSBSZXBvcnRGaWx0ZXJMZXZlbFtdID0gWydyZXBvcnQnLCAnYm90aCcsICdwYWdlJ107XG5jb25zdCBNQVRDSF9BTllfVFlQRVM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlclR5cGVbXSA9IFsnc2VsZWN0JywgJ2tleXdvcmQnLCAnbnVtYmVyUmFuZ2UnXTtcblxuLy8gV2hldGhlciBhIGdyb3VwIGpvaW5zIGEgbWF0Y2ggb2YgJ2FueScgb24gcGFnZSBgcGFnZUlkYC5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoQW55R3JvdXAoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIE1BVENIX0FOWV9MRVZFTFMuaW5jbHVkZXMoZ3JvdXAubGV2ZWwpXG4gICAgJiYgTUFUQ0hfQU5ZX1RZUEVTLmluY2x1ZGVzKGdyb3VwLnR5cGUpXG4gICAgJiYgKGdyb3VwLmxldmVsICE9PSAncGFnZScgfHwgKCEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSk7XG59XG5cbi8vIFRoZSByZXBvcnQgYmFyJ3MgZ3JvdXBzIGluIHRoZWlyIHNhdmVkIG9yZGVyOiB0aGUgcmVwb3J0IGFuZCBib3RoIGdyb3Vwcyxcbi8vIGFuZCB0aGUgcGFnZSBncm91cHMgb2YgdGhlIHBhZ2Ugb24gc2NyZWVuIChgcGFnZUlkYCkuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0QmFyR3JvdXBzKHJlcG9ydDogUmVwb3J0IHwgbnVsbCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogUmVwb3J0RmlsdGVyR3JvdXBbXSB7XG4gIHJldHVybiAocmVwb3J0Py5maWx0ZXJHcm91cHMgPz8gW10pXG4gICAgLmZpbHRlcigoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncmVwb3J0JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnXG4gICAgICB8fCAoZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyAmJiAhIXBhZ2VJZCAmJiBncm91cC5wYWdlSWQgPT09IHBhZ2VJZCkpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbn1cblxuLy8gV2hldGhlciB0aGUgcmVwb3J0IGhhcyBhIGdyb3VwIHNob3duIG9uIG9uZSBwYWdlIG9ubHksIHNvIGl0cyByZXBvcnQgYmFyXG4vLyBjaGFuZ2VzIHdpdGggdGhlIHBhZ2Ugb24gc2NyZWVuLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhZ2VHcm91cChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSkuc29tZSgoZ3JvdXApID0+IGdyb3VwLmxldmVsID09PSAncGFnZScpO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIHRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggY29udHJvbC4gTm90IGEgZmlsdGVyIGdyb3VwOiBpdFxuLy8gc2F5cyBob3cgdGhlIGdyb3VwcyBjb21iaW5lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY2hhbmdlIHF1ZXJ5LlxuZXhwb3J0IGNvbnN0IE1BVENIX0lURU0gPSAnbWF0Y2gnO1xuXG5jb25zdCBNQVRDSF9PUFRJT05TOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IFJlcG9ydEZpbHRlck1hdGNoIH1bXSA9IFtcbiAgeyBuYW1lOiAnQWxsIGZpbHRlcnMnLCB2YWx1ZTogJ2FsbCcgfSxcbiAgeyBuYW1lOiAnQW55IGZpbHRlcicsIHZhbHVlOiAnYW55JyB9LFxuXTtcblxuLy8gVGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLCBsYXN0IGluIHRoZSBiYXIsIG9yIG51bGwgd2hlbiBpdCB3b3VsZCBkb1xuLy8gbm90aGluZzogdGhlIHNlcnZlciBtdXN0IHNlcnZlIG1hdGNoQW55LCBhbmQgdGhlIGJhciBtdXN0IGhvbGQgdHdvIG9yIG1vcmVcbi8vIGdyb3VwcyB0aGF0IGNvbWJpbmUgKGFuICdhbnknIG92ZXIgb25lIGdyb3VwIGlzIHRoYXQgZ3JvdXApLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmlsdGVySXRlbShcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4gIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCxcbiAgbWF0Y2g6IFJlcG9ydEZpbHRlck1hdGNoLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgY29uc3QgZWxpZ2libGUgPSBncm91cHMuZmlsdGVyKChncm91cCkgPT4gaXNNYXRjaEFueUdyb3VwKGdyb3VwLCBwYWdlSWQpKTtcblxuICBpZiAoIXJlcG9ydD8udmlld2VyRmVhdHVyZXM/LmluY2x1ZGVzKCdtYXRjaEFueScpIHx8IGVsaWdpYmxlLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogTUFUQ0hfSVRFTSxcbiAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgbGFiZWw6ICdNYXRjaCcsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIHZhbHVlczogKCkgPT4gTUFUQ0hfT1BUSU9OUyxcbiAgICBkZWZhdWx0OiBtYXRjaCxcbiAgICAvLyAnTWF0Y2g6IGFueSBmaWx0ZXInIG9yICdNYXRjaDogYWxsIGZpbHRlcnMnLCBpbiB0aGUgZXhwb3J0IGxpbmVzJyB3b3Jkcy5cbiAgICBjaGlwVGV4dDogKGl0ZW0pID0+IG1hdGNoTGluZVRleHQobWF0Y2hGcm9tUXVlcnkoaXRlbS5xdWVyeSksICdjaGlwJyksXG4gIH07XG59XG5cbi8vIFRoZSBtYXRjaCBhIGNoYW5nZSBxdWVyeSBvZiBhIGJhciB3aXRoIHRoZSBNYXRjaCBjb250cm9sIGFza3MgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlcG9ydEZpbHRlck1hdGNoIHtcbiAgcmV0dXJuIHF1ZXJ5Py5bTUFUQ0hfSVRFTV0gPT09ICdhbnknID8gJ2FueScgOiAnYWxsJztcbn1cblxuLy8gVGhlIHF1ZXJ5IGtleSBvZiBhIGxpc3QncyBzZWFyY2ggYm94IGluIGl0cyBjb21wb25lbnQgaGVhZGVyLiBGaXhlZCByYXRoZXJcbi8vIHRoYW4gZGVyaXZlZCBmcm9tIGFuIGlkIGJlY2F1c2UgYSBoZWFkZXIgaG9sZHMgYXQgbW9zdCBvbmUsIGFuZCBpdCBpcyBOT1QgYVxuLy8gZmlsdGVyIGdyb3VwOiBpdHMgdGV4dCBuYXJyb3dzIHRoYXQgbGlzdCBhbG9uZSwgc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmZcbi8vIHRoZSBjaGFuZ2UgcXVlcnkgYW5kIHRyYXZlbHMgYXMgdGhlIGxpc3QncyBvd24gYHN0YXRlLnNlYXJjaGAuXG5leHBvcnQgY29uc3QgTElTVF9TRUFSQ0hfSVRFTSA9ICdsaXN0U2VhcmNoJztcblxuLy8gVGhlIGxvbmdlc3Qgc2VhcmNoIHRoZSBzZXJ2ZXIgYXBwbGllcyAoUmVwb3J0UXVlcnlSdW5uZXI6Ok1BWF9TRUFSQ0hfTEVOR1RIKS5cbi8vIFRoZSB2aWV3ZXIgY3V0cyB0aGUgdGV4dCB0byBpdCB0b28sIHNvIHRoZSBzdGF0ZSwgdGhlIHJlcXVlc3QgYW5kIHRoZSBleHBvcnRcbi8vIHRpdGxlIGFsbCBjYXJyeSB0aGUgdGV4dCB0aGF0IHdhcyBhY3R1YWxseSBzZWFyY2hlZC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIID0gMTAwO1xuXG4vLyBUaGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGxpc3QncyBzZWFyY2ggYm94LCBzZWVkZWQgd2l0aCB0aGUgdGV4dCB0aGVcbi8vIHZpZXdlciBsYXN0IHNlYXJjaGVkLiBmcy1maWx0ZXIgc2hvd3Mgb25lIHNlYXJjaCBib3ggcGVyIGJhciAoaXRzIGxhc3Rcbi8vIGtleXdvcmQgaXRlbSksIHNvIHRoZSBjYWxsZXIgYWRkcyB0aGlzIG9ubHkgdG8gYSBoZWFkZXIgd2l0aCBubyBrZXl3b3JkXG4vLyBncm91cCBvZiBpdHMgb3duLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZWFyY2hJdGVtKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgbmFtZTogTElTVF9TRUFSQ0hfSVRFTSxcbiAgICBsYWJlbDogJ1NlYXJjaCcsXG4gICAgZGVmYXVsdDogdmFsdWUgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgY2hhcnQgdGhlIGdyb3VwLWJ5IGNvbnRyb2wgY2FuIHJlLWJ1Y2tldC4gQSB0aW1lXG4vLyB4LWF4aXMgaXMgdGhlIHdob2xlIHF1YWxpZmljYXRpb246IHRoZSBjb250cm9sIGNoYW5nZXMgdGhlIGdyYWluIG9mIHRoYXRcbi8vIGF4aXMsIGFuZCBhIGNhdGVnb3J5IGF4aXMgaGFzIG5vIGdyYWluIHRvIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSkuc29tZSgoY29tcG9uZW50KSA9PlxuICAgIGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZScpKTtcbn1cblxuLy8gVGhlIGdyYWlucyB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBvZmZlcnMsIG5hbWVkIGZvciB0aGUgdmlld2VyLiBXSElDSFxuLy8gb2YgdGhlbSBjb21lcyBmcm9tIHRoZSByZXBvcnQ7IGhvdyB0aGV5IHJlYWQgY29tZXMgZnJvbSBHUkFOVUxBUklUWV9PUFRJT05TLlxuLy8gQW4gZW1wdHkgc3RvcmVkIGxpc3QgbWVhbnMgZXZlcnkgZ3JhaW4g4oCUIHRoZSBzYW1lIHJ1bGUgdGhlIGJhY2tlbmQgYXBwbGllcy5cbmZ1bmN0aW9uIGdyb3VwQnlPcHRpb25zKHJlcG9ydDogUmVwb3J0KTogeyB2YWx1ZTogQ2hhcnRHcmFudWxhcml0eTsgbmFtZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IGdyYW51bGFyaXRpZXMgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdO1xuXG4gIHJldHVybiBncmFudWxhcml0aWVzLmxlbmd0aFxuICAgID8gR1JBTlVMQVJJVFlfT1BUSU9OUy5maWx0ZXIoKG9wdGlvbikgPT4gZ3JhbnVsYXJpdGllcy5pbmNsdWRlcyhvcHRpb24udmFsdWUpKVxuICAgIDogR1JBTlVMQVJJVFlfT1BUSU9OUztcbn1cblxuLy8gV2hldGhlciBhIGdyYWluIGlzIG9uZSB0aGUgcmVwb3J0J3MgY29udHJvbCBzdGlsbCBvZmZlcnMuIEEgZ3JhaW4gaXQgZG9lc24ndFxuLy8gY2Fubm90IHN0YXkgaW4gZWZmZWN0OiB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdCBhdCBhbnkgdGltZSwgYW5kIGEgY2hhcnRcbi8vIGxlZnQgYnVja2V0aW5nIGF0IGEgZHJvcHBlZCBncmFpbiBpcyBvbmUgdGhlIHZpZXdlciBjYW4gbmVpdGhlciBzZWUgbm9yIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQ6IFJlcG9ydCwgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZ3JhbnVsYXJpdHkgfHwgZ3JvdXBCeU9wdGlvbnMocmVwb3J0KS5zb21lKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xufVxuXG4vLyBUaGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCwgb3IgbnVsbCB3aGVuIHRoZVxuLy8gcmVwb3J0IGhhcyBub25lIHRvIHNob3cuXG4vL1xuLy8gSXQgbGVhZHMgdGhlIHNhbWUgYmFyIHRoZSBmaWx0ZXJzIHJlbmRlciBpbiwgYnV0IGl0IGlzIE5PVCBvbmU6IGEgZmlsdGVyXG4vLyBuYXJyb3dzIFdISUNIIHJvd3MgYXJlIGNvdW50ZWQsIHRoaXMgY2hhbmdlcyBob3cgdGhlIHN1cnZpdmluZyByb3dzIGFyZVxuLy8gQlVDS0VURUQg4oCUIGFuZCBpdCBjb21lcyBmaXJzdCBiZWNhdXNlIHRoZSBncmFpbiBpcyB3aGF0IGEgdmlld2VyIHNldHRsZXNcbi8vIGJlZm9yZSBkZWNpZGluZyB3aGljaCByb3dzIHRoZXkgd2FudC5cbi8vIFBpY2tpbmcgYSBncmFpbiBzZXRzIGEgc2Vzc2lvbi13aWRlIG92ZXJyaWRlIHRoYXQgcmlkZXMgYWxvbmcgaW4gZWFjaCBjaGFydCdzXG4vLyBkYXRhIHJlcXVlc3QsIHNvIHRoZSBjaGFydHMgdGhlbXNlbHZlcyBhcmUgbmV2ZXIgcmV3cml0dGVuLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCxcbiAgaW5pdGlhbD86IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgLy8gT25seSBhbiBFWFBMSUNJVCBmYWxzZSBoaWRlcyB0aGUgY29udHJvbC4gQW4gYWJzZW50IGJsb2NrIG1lYW5zIGEgcmVwb3J0XG4gIC8vIHNlcnZlZCBieSBhIGJ1aWxkIHRoYXQgcHJlZGF0ZXMgdGhlIGNvbnRyb2wgYmVpbmcgc3RvcmVkLCBhbmQgZXZlcnkgb25lIG9mXG4gIC8vIHRob3NlIGhhZCBvbmUg4oCUIHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IHRoZSBzYW1lIHdheSAoUmVwb3J0R3JvdXBCeSkuXG4gIGlmIChncm91cEJ5Py5lbmFibGVkID09PSBmYWxzZSB8fCAhaGFzVGltZVNlcmllc0NoYXJ0KHJlcG9ydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGdyb3VwQnlPcHRpb25zKHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBHUk9VUF9CWV9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiB2YWx1ZXMsXG4gICAgZGVmYXVsdDogaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0LCBpbml0aWFsID8/IG51bGwpID8gKGluaXRpYWwgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wncyBjb250cmlidXRpb24gdG8gdGhlIHRvb2xiYXIncyBmcy1maWx0ZXIga2V5LiBmcy1maWx0ZXJcbi8vIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBhbmQgdGhlIGFnZW50IGNhbiBjaGFuZ2UgdGhlIGNvbnRyb2wncyBsYWJlbFxuLy8gb3IgdGhlIGdyYWlucyBpdCBvZmZlcnMg4oCUIHdpdGhvdXQgdGhvc2UgaW4gdGhlIGtleSB0aGUgYmFyIGtlZXBzIHJlbmRlcmluZ1xuLy8gdGhlIGNvbnRyb2wgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeVNpZ25hdHVyZShyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXJlcG9ydCB8fCAhZ3JvdXBCeUZpbHRlckl0ZW0ocmVwb3J0KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGdyb3VwQnkgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5O1xuXG4gIHJldHVybiBbJ2dyb3VwQnknLCBncm91cEJ5Py5sYWJlbCA/PyAnJywgKGdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW10pLmpvaW4oJywnKV0uam9pbignOicpO1xufVxuXG4vLyBSZWFkIGFuIGZzLWZpbHRlciBjaGFuZ2UgcXVlcnkgaW50byBwZXItZ3JvdXAgdmFsdWVzLiBSZXR1cm5zIG9uZSBlbnRyeSBwZXJcbi8vIGdyb3VwIHdpdGggdGhlIHZhbHVlIHRvIHN0b3JlIChvciBudWxsIHRvIGNsZWFyKSDigJQgY2FsbGVycyBmZWVkIHRoZXNlIHRvXG4vLyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uuc2V0VmFsdWUuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkoXG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiBncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcblxuICAgIHN3aXRjaCAoZ3JvdXAudHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBkYXRlUmFuZ2VGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogc2VsZWN0RnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBjYXNlICdudW1iZXJSYW5nZSc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogbnVtYmVyUmFuZ2VGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3Qga2V5d29yZCA9IFN0cmluZyhxdWVyeVtuYW1lXSA/PyAnJykudHJpbSgpO1xuXG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZToga2V5d29yZCA/IHsgdmFsdWU6IGtleXdvcmQgfSA6IG51bGwgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG4vLyBBIGRhdGUgcmFuZ2UncyBkYXlzICg8bmFtZT5Gcm9tLCA8bmFtZT5UbykuXG5mdW5jdGlvbiBkYXRlUmFuZ2VGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3Qgc3RhcnQgPSBxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdmcm9tJyldO1xuICBjb25zdCBlbmQgPSBxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICd0bycpXTtcblxuICBpZiAoIXN0YXJ0ICYmICFlbmQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7IHN0YXJ0OiBzdGFydCB8fCBudWxsLCBlbmQ6IGVuZCB8fCBudWxsIH07XG59XG5cbi8vIEEgc2VsZWN0J3MgcGlja3M6IGtlcHQgKDxuYW1lPiksIG9yIGxlZnQgb3V0IHdoaWxlIGl0cyBleGNsdWRlIHJvdyBpcyBvblxuLy8gKGV4Y2x1ZGU8TmFtZT4pLlxuZnVuY3Rpb24gc2VsZWN0RnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IGV4Y2x1ZGVWYWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtnZXRFeGNsdWRlTmFtZShuYW1lKV0pO1xuICBpZiAoZXhjbHVkZVZhbHVlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBleGNsdWRlVmFsdWVzIH07XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBzZWxlY3RRdWVyeVZhbHVlcyhxdWVyeVtuYW1lXSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB7IHZhbHVlcyB9IDogbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgcmFuZ2UncyBlbmRzICg8bmFtZT5NaW4sIDxuYW1lPk1heCkuIEFuIGVuZCBsZWZ0IGVtcHR5IGlzIG9wZW4uXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBtaW4gPSByYW5nZUJvdW5kKHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ21pbicpXSk7XG4gIGNvbnN0IG1heCA9IHJhbmdlQm91bmQocXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnbWF4JyldKTtcblxuICBpZiAobWluID09PSBudWxsICYmIG1heCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4obWluICE9PSBudWxsID8geyBtaW4gfSA6IHt9KSxcbiAgICAuLi4obWF4ICE9PSBudWxsID8geyBtYXggfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gT25lIGVuZCBvZiBhIG51bWJlciByYW5nZSBhcyBmcy1maWx0ZXIncyBSYW5nZSBzZW5kcyBpdDogdGhlIHRleHQgdHlwZWQgaW5cbi8vIGl0cyBpbnB1dC4gTnVtYmVyKCkgcmVhZHMgYW55IG5vbi1lbXB0eSB0ZXh0LCBzbyAnMCcgaXMgdGhlIGVuZCAwOyBlbXB0eSBvclxuLy8gdW5yZWFkYWJsZSB0ZXh0IGlzIGFuIG9wZW4gZW5kLlxuZnVuY3Rpb24gcmFuZ2VCb3VuZChyYXc6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgdGV4dCA9IHR5cGVvZiByYXcgPT09ICdudW1iZXInID8gU3RyaW5nKHJhdykgOiBTdHJpbmcocmF3ID8/ICcnKS50cmltKCk7XG4gIGNvbnN0IG51bWJlciA9IHRleHQgPT09ICcnID8gTmFOIDogTnVtYmVyKHRleHQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKSA/IG51bWJlciA6IG51bGw7XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgYXMgdGV4dCwgdGhlIHNhbWUgZm9yIHRoZSBzYW1lIHZhbHVlIHdoYXRldmVyIGl0cyBzb3VyY2U6XG4vLyBkYXlzIGFzIGNhbGVuZGFyIGRheXMsIHBpY2tzIGFuZCBlbmRzIGFzIHRleHQsIGtleXdvcmQgdGV4dCB0cmltbWVkLiBUaGVcbi8vIHZhbHVlIGEgdGlsZSBoZWFkZXIgd2FzIGJ1aWx0IHdpdGggaXMga2V5ZWQgb24gaXQsIHNvIGEgaGVhZGVyIGlzIGNyZWF0ZWRcbi8vIGFnYWluIHdoZW4gYW5vdGhlciBiYXIgY2hhbmdlcyBhIGdyb3VwIGl0IHNob3dzLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVmFsdWVTaWduYXR1cmUodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShbXG4gICAgZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KSA/PyAnJyxcbiAgICBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSA/PyAnJyxcbiAgICAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAodmFsdWUuZXhjbHVkZVZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgKHZhbHVlLnZhbHVlID8/ICcnKS50cmltKCksXG4gICAgdmFsdWUubWluID8/ICcnLFxuICAgIHZhbHVlLm1heCA/PyAnJyxcbiAgXSk7XG59XG5cbi8vIGZzLWZpbHRlcidzIEF1dG9Db21wbGV0ZUNoaXBzIHNlcmlhbGlzZXMgYSBtdWx0aS1zZWxlY3QgaW50byBPTkUgcXVlcnkgdmFsdWU6XG4vLyB0aGUgc2VsZWN0ZWQgdmFsdWVzIGpvaW5lZCBieSBcIixcIiAoaXRzIGBxdWVyeWAgZ2V0dGVyIGRvZXMgYC5tYXAodmFsdWUpLmpvaW4oJywnKWApLlxuLy8gU28gYSAyKyBzZWxlY3Rpb24gYXJyaXZlcyBhcyB0aGUgc3RyaW5nIFwiYSxiXCIsIG5vdCBhbiBhcnJheSDigJQgc3BsaXR0aW5nIG9uIFwiLFwiXG4vLyByZXZlcnNlcyB0aGF0IGZhaXRoZnVsbHkuIFdpdGhvdXQgdGhpcywgYSBtdWx0aS1zZWxlY3Qgd2FzIHNlbnQgYXMgdGhlIHNpbmdsZVxuLy8gdmFsdWUgW1wiYSxiXCJdLCBwcm9kdWNpbmcgYGNvbCBJTiAoJ2EsYicpYCBzZXJ2ZXItc2lkZSwgd2hpY2ggbWF0Y2hlcyBub3RoaW5nLlxuZnVuY3Rpb24gc2VsZWN0UXVlcnlWYWx1ZXMocmF3OiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIHJldHVybiByYXc7XG4gIH1cblxuICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHJhdykuc3BsaXQoJywnKTtcbn1cbiJdfQ==
495
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUk1RSxPQUFPLEVBQytCLG1CQUFtQixHQUV4RCxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl6RCwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXVDO0lBQ3JFLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDhCQUE4QjtJQUM5QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBR0QsOEVBQThFO0FBQzlFLCtFQUErRTtB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Y2x1ZGVOYW1lIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIFJlYWRzIGEgZ3JvdXAncyBvcHRpb24gbGlzdDsgc2VlIGdyb3VwT3B0aW9uc1JlYWRlcigpLlxuZXhwb3J0IHR5cGUgR3JvdXBPcHRpb25zUmVhZGVyID0gKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG5cbi8vIEEgcmVhZGVyIG9mIGVhY2ggZ3JvdXAncyBvcHRpb24gbGlzdCAobG9hZEdyb3VwT3B0aW9ucykgdGhhdCBsb2FkcyBhIGdyb3VwJ3Ncbi8vIGxpc3Qgb25jZSBhbmQgaGFuZHMgZXZlcnkgbGF0ZXIgcmVhZCBvZiB0aGF0IGdyb3VwIHRoZSBzYW1lIHJlcGxheWVkXG4vLyByZXF1ZXN0LCBzbyBldmVyeXRoaW5nIHRoYXQgbmFtZXMgb25lIGdyb3VwJ3MgcGlja3Mg4oCUIHRoZSBjb3ZlcidzIGZpbHRlclxuLy8gbGluZSwgaXRzIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiwgdGhlIG5leHQgcGljayDigJQgc2hhcmVzIG9uZSBmZXRjaC4gQSByZWFkXG4vLyB0aGF0IGZhaWxlZCBpcyBmZXRjaGVkIGFnYWluIGJ5IHRoZSBuZXh0IG9uZSAoc2hhcmVSZXBsYXkgZHJvcHMgYW4gZXJyb3IpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwT3B0aW9uc1JlYWRlcihyZXBvcnREYXRhOiBSZXBvcnREYXRhKTogR3JvdXBPcHRpb25zUmVhZGVyIHtcbiAgY29uc3QgbG9hZGVkID0gbmV3IE1hcDxudW1iZXIsIE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4+KCk7XG5cbiAgcmV0dXJuIChncm91cCwgcmVwb3J0SWQpID0+IHtcbiAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRlZC5nZXQoZ3JvdXAuaWQpID8/IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICBsb2FkZWQuc2V0KGdyb3VwLmlkLCBvcHRpb25zJCk7XG5cbiAgICByZXR1cm4gb3B0aW9ucyQ7XG4gIH07XG59XG5cbi8vIFRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSwgYXMgaXRzIGNoaXBzIGluXG4vLyB0aGUgZmlsdGVyIGJhciBuYW1lIHRoZW0sIGZvciBhIHt7ZmlsdGVyLjxpZD59fSB0b2tlbjogYSBuYW1lIHRoZSBiYXInc1xuLy8gbGlzdHMgdGF1Z2h0IChgbGFiZWxgLCBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZS5sYWJlbCkgZmlyc3QsIGVsc2UgdGhlXG4vLyBncm91cCdzIG9wdGlvbiBsaXN0LiBudWxsIHdoZW4gdGhlIGxpc3QgY291bGQgbm90IGJlIHJlYWQ6IHRoZSB0b2tlbiB0aGVuXG4vLyByZWFkcyB0aGUgZW0gZGFzaCByYXRoZXIgdGhhbiBhIHJvdyBvZiBpZHMuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VkT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzLCBsYWJlbClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9ucyk6IHN0cmluZ1tdIHwgbnVsbCA9PiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubmFtZSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBvcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGVybVxuICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICA6IG9wdGlvbnMpKTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IHRoZSBzZXJ2ZXIgY3V0IGF0IDUwMC5cbmV4cG9ydCBjb25zdCBPUFRJT05TX1RSVU5DQVRFRF9OT1RFID0gJ1Nob3dpbmcgdGhlIGZpcnN0IDUwMC4gVHlwZSB0byBuYXJyb3cuJztcblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IGNvdWxkIG5vdCBiZSByZWFkLiBUaGUgbmV4dCBmb2N1cyBvclxuLy8ga2V5c3Ryb2tlIGFza3MgYWdhaW4uXG5leHBvcnQgY29uc3QgT1BUSU9OU19GQUlMRURfTk9URSA9ICdDb3VsZCBub3QgbG9hZCB0aGUgbGlzdC4nO1xuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuLy8gQSBzZWxlY3QgbGlzdHMgd2hhdCBgb3B0aW9uc2Agb2ZmZXJzIGZvciBpdCBpbiBgcmVwb3J0YC4gYGZlYXR1cmVzYCBpcyB0aGVcbi8vIHJlcG9ydCdzIHZpZXdlckZlYXR1cmVzOiBhIHNlbGVjdCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnIGJ5IHRoZSBydWxlIG9mXG4vLyBvZmZlcnNFeGNsdWRlICh0aGUgc2VydmVyIGxpc3RzIGV4Y2x1ZGVWYWx1ZXMgYW5kIG5vIG1lbWJlciBiaW5kcyBzZXZlcmFsXG4vLyBjb2x1bW5zKSwgYW5kIGEgbnVtYmVyIHJhbmdlIGlzIGEgbWluL21heCBjb250cm9sIG9ubHkgd2hlbiBpdCBsaXN0c1xuLy8gbnVtYmVyUmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuICBmZWF0dXJlczogcmVhZG9ubHkgUmVwb3J0Vmlld2VyRmVhdHVyZVtdID0gW10sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cExhYmVsKGdyb3VwKTtcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiBzZWxlY3RGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgb3B0aW9ucywgcmVwb3J0LCBpbml0aWFsLCBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcykpO1xuXG4gICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgcmV0dXJuIGZlYXR1cmVzLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgICAgID8gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgcmVwb3J0LCBpbml0aWFsKVxuICAgICAgICA6IGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ga2V5d29yZEZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuICB9XG59XG5cbi8vIEEgZGF0ZSByYW5nZSBvcGVucyBvbiBpdHMgZGF5cywgYW5kIGl0cyBjaGlwIHNob3dzIHRoZW0uIEEgcHJlc2V0IHBpY2tlZCBpblxuLy8gdGhlIGRhdGUgcGlja2VyIG9ubHkgc2V0cyB0aGUgZGF5cy5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgaGFzRGF5cyA9ICEhKGluaXRpYWw/LnN0YXJ0IHx8IGluaXRpYWw/LmVuZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgZGVmYXVsdDogaGFzRGF5c1xuICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzLCBrZXB0IG9yIGxlZnQgb3V0LiBXaXRoIGBleGNsdWRlYCB0aGUgbGlzdCBoYXMgdGhlXG4vLyAnRXhjbHVkZSB0aGVzZScgcm93LCBhbmQgYSB2YWx1ZSB0aGF0IGxlYXZlcyBvdXQgb3BlbnMgd2l0aCBpdCBvbi4gSXRzIGxpc3Rcbi8vIGlzIHJlYWQgb24gZm9jdXMgYW5kIG9uIGVhY2gga2V5c3Ryb2tlOiB0aGUgb3B0aW9ucyBzZXJ2aWNlIGZldGNoZXMgaXQgd2hlblxuLy8gdGhlIG90aGVyIGZpbHRlcnMgY2hhbmdlZCBzaW5jZSBhbmQgcmVwbGF5cyBpdCBvdGhlcndpc2UsIGFuZCB0eXBpbmdcbi8vIGZpbHRlcnMgaXQgaGVyZS4gQSBsaXN0IHRoZSBzZXJ2ZXIgY3V0LCBvciBvbmUgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCxcbi8vIHNheXMgc28gaW4gYSBwYW5lbCByb3cuXG5mdW5jdGlvbiBzZWxlY3RGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGU6IGJvb2xlYW4sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGV4Y2x1ZGluZyA9IGV4Y2x1ZGUgJiYgIWluaXRpYWw/LnZhbHVlcz8ubGVuZ3RoICYmICEhaW5pdGlhbD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoO1xuICBjb25zdCBwaWNrcyA9IGV4Y2x1ZGluZyA/IGluaXRpYWwuZXhjbHVkZVZhbHVlcyA6IGluaXRpYWw/LnZhbHVlcztcbiAgY29uc3Qgb3B0aW9ucyQgPSBvcHRpb25zLm9wdGlvbnMoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBncm91cEl0ZW1OYW1lKGdyb3VwKSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuICBjb25zdCBtaW4gPSBpbml0aWFsPy5taW4gPz8gdW5kZWZpbmVkO1xuICBjb25zdCBtYXggPSBpbml0aWFsPy5tYXggPz8gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbGUgPSByZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQgPz8ge30pLmxvY2FsZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuUmFuZ2UsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogbWluICE9PSB1bmRlZmluZWQgfHwgbWF4ICE9PSB1bmRlZmluZWQgPyB7IG1pbiwgbWF4IH0gOiB1bmRlZmluZWQsXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBmaWx0ZXJMaW5lVGV4dChcbiAgICAgIHsgbGFiZWwsIGxldmVsOiBncm91cC5sZXZlbCB9LFxuICAgICAgbnVtYmVyUmFuZ2VGcm9tUXVlcnkoaXRlbS5xdWVyeSwgbmFtZSksXG4gICAgICB7IGxvY2FsZSB9LFxuICAgICAgJ2NoaXAnLFxuICAgICksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXBzIGEgbWF0Y2ggb2YgJ2FueScgY29tYmluZXM6IHJlcG9ydCBiYXIgZ3JvdXBzIChhIHBhZ2UgZ3JvdXAgb25cbi8vIGl0cyBvd24gcGFnZSBvbmx5KSB0aGF0IGEgdmlld2VyIHBpY2tzIHZhbHVlcywgdGV4dCBvciBhIG51bWJlciByYW5nZSBpbi5cbi8vIERhdGVzLCB0aWxlLW9ubHkgZ3JvdXBzIGFuZCB0aGUgY3Jvc3MtZmlsdGVyIGFsd2F5cyBuYXJyb3cgb24gdGhlaXIgb3duLlxuLy8gVGhlIHNlcnZlciBob2xkcyB0aGUgc2FtZSBydWxlIGFuZCBjaGVja3MgZXZlcnkgaWQgaXQgaXMgc2VudC5cbmNvbnN0IE1BVENIX0FOWV9MRVZFTFM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlckxldmVsW10gPSBbJ3JlcG9ydCcsICdib3RoJywgJ3BhZ2UnXTtcbmNvbnN0IE1BVENIX0FOWV9UWVBFUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyVHlwZVtdID0gWydzZWxlY3QnLCAna2V5d29yZCcsICdudW1iZXJSYW5nZSddO1xuXG4vLyBXaGV0aGVyIGEgZ3JvdXAgam9pbnMgYSBtYXRjaCBvZiAnYW55JyBvbiBwYWdlIGBwYWdlSWRgLlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hBbnlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUFUQ0hfQU5ZX0xFVkVMUy5pbmNsdWRlcyhncm91cC5sZXZlbClcbiAgICAmJiBNQVRDSF9BTllfVFlQRVMuaW5jbHVkZXMoZ3JvdXAudHlwZSlcbiAgICAmJiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJyB8fCAoISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKTtcbn1cblxuLy8gVGhlIHJlcG9ydCBiYXIncyBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXI6IHRoZSByZXBvcnQgYW5kIGJvdGggZ3JvdXBzLFxuLy8gYW5kIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4gKGBwYWdlSWRgKS5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRCYXJHcm91cHMocmVwb3J0OiBSZXBvcnQgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCdcbiAgICAgIHx8IChncm91cC5sZXZlbCA9PT0gJ3BhZ2UnICYmICEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgZ3JvdXAgc2hvd24gb24gb25lIHBhZ2Ugb25seSwgc28gaXRzIHJlcG9ydCBiYXJcbi8vIGNoYW5nZXMgd2l0aCB0aGUgcGFnZSBvbiBzY3JlZW4uXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFnZUdyb3VwKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKS5zb21lKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyk7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLiBOb3QgYSBmaWx0ZXIgZ3JvdXA6IGl0XG4vLyBzYXlzIGhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkuXG5leHBvcnQgY29uc3QgTUFUQ0hfSVRFTSA9ICdtYXRjaCc7XG5cbmNvbnN0IE1BVENIX09QVElPTlM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogUmVwb3J0RmlsdGVyTWF0Y2ggfVtdID0gW1xuICB7IG5hbWU6ICdBbGwgZmlsdGVycycsIHZhbHVlOiAnYWxsJyB9LFxuICB7IG5hbWU6ICdBbnkgZmlsdGVyJywgdmFsdWU6ICdhbnknIH0sXG5dO1xuXG4vLyBUaGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wsIGxhc3QgaW4gdGhlIGJhciwgb3IgbnVsbCB3aGVuIGl0IHdvdWxkIGRvXG4vLyBub3RoaW5nOiB0aGUgc2VydmVyIG11c3Qgc2VydmUgbWF0Y2hBbnksIGFuZCB0aGUgYmFyIG11c3QgaG9sZCB0d28gb3IgbW9yZVxuLy8gZ3JvdXBzIHRoYXQgY29tYmluZSAoYW4gJ2FueScgb3ZlciBvbmUgZ3JvdXAgaXMgdGhhdCBncm91cCkuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICBtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBlbGlnaWJsZSA9IGdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBpc01hdGNoQW55R3JvdXAoZ3JvdXAsIHBhZ2VJZCkpO1xuXG4gIGlmICghcmVwb3J0Py52aWV3ZXJGZWF0dXJlcz8uaW5jbHVkZXMoJ21hdGNoQW55JykgfHwgZWxpZ2libGUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBNQVRDSF9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogJ01hdGNoJyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiBNQVRDSF9PUFRJT05TLFxuICAgIGRlZmF1bHQ6IG1hdGNoLFxuICAgIC8vICdNYXRjaDogYW55IGZpbHRlcicgb3IgJ01hdGNoOiBhbGwgZmlsdGVycycsIGluIHRoZSBleHBvcnQgbGluZXMnIHdvcmRzLlxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gbWF0Y2hMaW5lVGV4dChtYXRjaEZyb21RdWVyeShpdGVtLnF1ZXJ5KSwgJ2NoaXAnKSxcbiAgfTtcbn1cblxuLy8gVGhlIG1hdGNoIGEgY2hhbmdlIHF1ZXJ5IG9mIGEgYmFyIHdpdGggdGhlIE1hdGNoIGNvbnRyb2wgYXNrcyBmb3IuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVwb3J0RmlsdGVyTWF0Y2gge1xuICByZXR1cm4gcXVlcnk/LltNQVRDSF9JVEVNXSA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIGEgbGlzdCdzIHNlYXJjaCBib3ggaW4gaXRzIGNvbXBvbmVudCBoZWFkZXIuIEZpeGVkIHJhdGhlclxuLy8gdGhhbiBkZXJpdmVkIGZyb20gYW4gaWQgYmVjYXVzZSBhIGhlYWRlciBob2xkcyBhdCBtb3N0IG9uZSwgYW5kIGl0IGlzIE5PVCBhXG4vLyBmaWx0ZXIgZ3JvdXA6IGl0cyB0ZXh0IG5hcnJvd3MgdGhhdCBsaXN0IGFsb25lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZlxuLy8gdGhlIGNoYW5nZSBxdWVyeSBhbmQgdHJhdmVscyBhcyB0aGUgbGlzdCdzIG93biBgc3RhdGUuc2VhcmNoYC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9JVEVNID0gJ2xpc3RTZWFyY2gnO1xuXG4vLyBUaGUgbG9uZ2VzdCBzZWFyY2ggdGhlIHNlcnZlciBhcHBsaWVzIChSZXBvcnRRdWVyeVJ1bm5lcjo6TUFYX1NFQVJDSF9MRU5HVEgpLlxuLy8gVGhlIHZpZXdlciBjdXRzIHRoZSB0ZXh0IHRvIGl0IHRvbywgc28gdGhlIHN0YXRlLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSBjaGFydCB0aGUgZ3JvdXAtYnkgY29udHJvbCBjYW4gcmUtYnVja2V0LiBBIHRpbWVcbi8vIHgtYXhpcyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyB0aGUgZ3JhaW4gb2YgdGhhdFxuLy8gYXhpcywgYW5kIGEgY2F0ZWdvcnkgYXhpcyBoYXMgbm8gZ3JhaW4gdG8gY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1RpbWVTZXJpZXNDaGFydChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKS5zb21lKChjb21wb25lbnQpID0+XG4gICAgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJykpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gZ3JvdXBCeU9wdGlvbnMocmVwb3J0KTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IEdST1VQX0JZX0lURU0sXG4gICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgIGxhYmVsOiBncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknLFxuICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICB2YWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICBkZWZhdWx0OiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIGluaXRpYWwgPz8gbnVsbCkgPyAoaW5pdGlhbCA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXAtYnkgY29udHJvbCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgdG9vbGJhcidzIGZzLWZpbHRlciBrZXkuIGZzLWZpbHRlclxuLy8gcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIGFuZCB0aGUgYWdlbnQgY2FuIGNoYW5nZSB0aGUgY29udHJvbCdzIGxhYmVsXG4vLyBvciB0aGUgZ3JhaW5zIGl0IG9mZmVycyDigJQgd2l0aG91dCB0aG9zZSBpbiB0aGUga2V5IHRoZSBiYXIga2VlcHMgcmVuZGVyaW5nXG4vLyB0aGUgY29udHJvbCBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5U2lnbmF0dXJlKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghcmVwb3J0IHx8ICFncm91cEJ5RmlsdGVySXRlbShyZXBvcnQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgcmV0dXJuIFsnZ3JvdXBCeScsIGdyb3VwQnk/LmxhYmVsID8/ICcnLCAoZ3JvdXBCeT8uZ3JhbnVsYXJpdGllcyA/PyBbXSkuam9pbignLCcpXS5qb2luKCc6Jyk7XG59XG5cbi8vIFJlYWQgYW4gZnMtZmlsdGVyIGNoYW5nZSBxdWVyeSBpbnRvIHBlci1ncm91cCB2YWx1ZXMuIFJldHVybnMgb25lIGVudHJ5IHBlclxuLy8gZ3JvdXAgd2l0aCB0aGUgdmFsdWUgdG8gc3RvcmUgKG9yIG51bGwgdG8gY2xlYXIpIOKAlCBjYWxsZXJzIGZlZWQgdGhlc2UgdG9cbi8vIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5zZXRWYWx1ZS5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlc0Zyb21RdWVyeShcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuXG4gICAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBzZWxlY3RGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBudW1iZXJSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBrZXl3b3JkID8geyB2YWx1ZToga2V5d29yZCB9IDogbnVsbCB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIEEgZGF0ZSByYW5nZSdzIGRheXMgKDxuYW1lPkZyb20sIDxuYW1lPlRvKS5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBzdGFydCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ2Zyb20nKV07XG4gIGNvbnN0IGVuZCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ3RvJyldO1xuXG4gIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0IHx8IG51bGwsIGVuZDogZW5kIHx8IG51bGwgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrczoga2VwdCAoPG5hbWU+KSwgb3IgbGVmdCBvdXQgd2hpbGUgaXRzIGV4Y2x1ZGUgcm93IGlzIG9uXG4vLyAoZXhjbHVkZTxOYW1lPikuXG5mdW5jdGlvbiBzZWxlY3RGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgZXhjbHVkZVZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W2dldEV4Y2x1ZGVOYW1lKG5hbWUpXSk7XG4gIGlmIChleGNsdWRlVmFsdWVzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGV4Y2x1ZGVWYWx1ZXMgfTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W25hbWVdKTtcblxuICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IHsgdmFsdWVzIH0gOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGVuZHMgKDxuYW1lPk1pbiwgPG5hbWU+TWF4KS4gQW4gZW5kIGxlZnQgZW1wdHkgaXMgb3Blbi5cbmZ1bmN0aW9uIG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IG1pbiA9IHJhbmdlQm91bmQocXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnbWluJyldKTtcbiAgY29uc3QgbWF4ID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtYXgnKV0pO1xuXG4gIGlmIChtaW4gPT09IG51bGwgJiYgbWF4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLihtaW4gIT09IG51bGwgPyB7IG1pbiB9IDoge30pLFxuICAgIC4uLihtYXggIT09IG51bGwgPyB7IG1heCB9IDoge30pLFxuICB9O1xufVxuXG4vLyBPbmUgZW5kIG9mIGEgbnVtYmVyIHJhbmdlIGFzIGZzLWZpbHRlcidzIFJhbmdlIHNlbmRzIGl0OiB0aGUgdGV4dCB0eXBlZCBpblxuLy8gaXRzIGlucHV0LiBOdW1iZXIoKSByZWFkcyBhbnkgbm9uLWVtcHR5IHRleHQsIHNvICcwJyBpcyB0aGUgZW5kIDA7IGVtcHR5IG9yXG4vLyB1bnJlYWRhYmxlIHRleHQgaXMgYW4gb3BlbiBlbmQuXG5mdW5jdGlvbiByYW5nZUJvdW5kKHJhdzogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCB0ZXh0ID0gdHlwZW9mIHJhdyA9PT0gJ251bWJlcicgPyBTdHJpbmcocmF3KSA6IFN0cmluZyhyYXcgPz8gJycpLnRyaW0oKTtcbiAgY29uc3QgbnVtYmVyID0gdGV4dCA9PT0gJycgPyBOYU4gOiBOdW1iZXIodGV4dCk7XG5cbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1iZXIpID8gbnVtYmVyIDogbnVsbDtcbn1cblxuLy8gQSBncm91cCB2YWx1ZSBhcyB0ZXh0LCB0aGUgc2FtZSBmb3IgdGhlIHNhbWUgdmFsdWUgd2hhdGV2ZXIgaXRzIHNvdXJjZTpcbi8vIGRheXMgYXMgY2FsZW5kYXIgZGF5cywgcGlja3MgYW5kIGVuZHMgYXMgdGV4dCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIFRoZVxuLy8gdmFsdWUgYSB0aWxlIGhlYWRlciB3YXMgYnVpbHQgd2l0aCBpcyBrZXllZCBvbiBpdCwgc28gYSBoZWFkZXIgaXMgY3JlYXRlZFxuLy8gYWdhaW4gd2hlbiBhbm90aGVyIGJhciBjaGFuZ2VzIGEgZ3JvdXAgaXQgc2hvd3MuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZVNpZ25hdHVyZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpID8/ICcnLFxuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpID8/ICcnLFxuICAgICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS5leGNsdWRlVmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAodmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKSxcbiAgICB2YWx1ZS5taW4gPz8gJycsXG4gICAgdmFsdWUubWF4ID8/ICcnLFxuICBdKTtcbn1cblxuLy8gZnMtZmlsdGVyJ3MgQXV0b0NvbXBsZXRlQ2hpcHMgc2VyaWFsaXNlcyBhIG11bHRpLXNlbGVjdCBpbnRvIE9ORSBxdWVyeSB2YWx1ZTpcbi8vIHRoZSBzZWxlY3RlZCB2YWx1ZXMgam9pbmVkIGJ5IFwiLFwiIChpdHMgYHF1ZXJ5YCBnZXR0ZXIgZG9lcyBgLm1hcCh2YWx1ZSkuam9pbignLCcpYCkuXG4vLyBTbyBhIDIrIHNlbGVjdGlvbiBhcnJpdmVzIGFzIHRoZSBzdHJpbmcgXCJhLGJcIiwgbm90IGFuIGFycmF5IOKAlCBzcGxpdHRpbmcgb24gXCIsXCJcbi8vIHJldmVyc2VzIHRoYXQgZmFpdGhmdWxseS4gV2l0aG91dCB0aGlzLCBhIG11bHRpLXNlbGVjdCB3YXMgc2VudCBhcyB0aGUgc2luZ2xlXG4vLyB2YWx1ZSBbXCJhLGJcIl0sIHByb2R1Y2luZyBgY29sIElOICgnYSxiJylgIHNlcnZlci1zaWRlLCB3aGljaCBtYXRjaGVzIG5vdGhpbmcuXG5mdW5jdGlvbiBzZWxlY3RRdWVyeVZhbHVlcyhyYXc6IHVua25vd24pOiB1bmtub3duW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuXG4gIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcocmF3KS5zcGxpdCgnLCcpO1xufVxuIl19