@firestitch/report 18.8.0 → 18.9.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 (52) hide show
  1. package/app/reports/components/component-text/component-text.component.d.ts +47 -2
  2. package/app/reports/components/component-text/value-embed.plugin.d.ts +67 -0
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +34 -9
  4. package/app/reports/components/report-component/report-component.component.d.ts +10 -1
  5. package/app/reports/data/report.data.d.ts +2 -1
  6. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +8 -0
  7. package/app/reports/enums/report-value-formula.enum.d.ts +6 -0
  8. package/app/reports/export/report-export-collector.service.d.ts +24 -0
  9. package/app/reports/export/report-export.service.d.ts +3 -1
  10. package/app/reports/export/report-pdf.service.d.ts +18 -2
  11. package/app/reports/export/report-pptx.service.d.ts +15 -2
  12. package/app/reports/export/report-text-layout.service.d.ts +35 -0
  13. package/app/reports/format.d.ts +5 -1
  14. package/app/reports/interfaces/report.interface.d.ts +22 -3
  15. package/app/reports/layout.d.ts +2 -0
  16. package/app/reports/services/report-filter-state.service.d.ts +1 -1
  17. package/app/reports/text.d.ts +50 -0
  18. package/app/reports/theme/palette.d.ts +2 -0
  19. package/app/reports/values.d.ts +17 -0
  20. package/esm2022/app/reports/components/component-text/component-text.component.mjs +213 -16
  21. package/esm2022/app/reports/components/component-text/value-embed.plugin.mjs +484 -0
  22. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +260 -34
  23. package/esm2022/app/reports/components/report-component/report-component.component.mjs +65 -19
  24. package/esm2022/app/reports/data/report.data.mjs +19 -1
  25. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +134 -23
  26. package/esm2022/app/reports/enums/report-value-formula.enum.mjs +14 -0
  27. package/esm2022/app/reports/export/report-export-collector.service.mjs +170 -44
  28. package/esm2022/app/reports/export/report-export.service.mjs +57 -19
  29. package/esm2022/app/reports/export/report-pdf.service.mjs +339 -96
  30. package/esm2022/app/reports/export/report-pptx.service.mjs +316 -88
  31. package/esm2022/app/reports/export/report-text-layout.service.mjs +241 -0
  32. package/esm2022/app/reports/format.mjs +41 -10
  33. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  34. package/esm2022/app/reports/kpi-card.mjs +19 -6
  35. package/esm2022/app/reports/layout.mjs +11 -1
  36. package/esm2022/app/reports/option-builder.mjs +18 -5
  37. package/esm2022/app/reports/output-notes.mjs +57 -11
  38. package/esm2022/app/reports/services/report-filter-state.service.mjs +19 -10
  39. package/esm2022/app/reports/text.mjs +293 -85
  40. package/esm2022/app/reports/theme/palette.mjs +7 -2
  41. package/esm2022/app/reports/values.mjs +183 -0
  42. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +4 -1
  43. package/esm2022/app/reports/views/report/report.component.mjs +4 -1
  44. package/esm2022/public_api.mjs +2 -1
  45. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs → firestitch-report-echarts-DBMOHmBF.mjs} +2 -2
  46. package/fesm2022/{firestitch-report-echarts-qCBE3LqM.mjs.map → firestitch-report-echarts-DBMOHmBF.mjs.map} +1 -1
  47. package/fesm2022/{firestitch-report-firestitch-report-DbsWbE-j.mjs → firestitch-report-firestitch-report-CqbXT1gh.mjs} +3492 -1028
  48. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +1 -0
  49. package/fesm2022/firestitch-report.mjs +1 -1
  50. package/package.json +1 -1
  51. package/public_api.d.ts +1 -0
  52. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +0 -1
@@ -8,6 +8,7 @@ import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
8
8
  import { listHiddenColumns, listSortTerms } from '../list-config';
9
9
  import { dateBoundString, LIST_SEARCH_MAX_LENGTH } from '../report-filter-items';
10
10
  import { decodeColumnList, decodeFilterValue, decodeSort } from '../report-url-state';
11
+ import { reportComponents } from '../values';
11
12
  import * as i0 from "@angular/core";
12
13
  // Every relative range name the server knows. A record rather than a list, so
13
14
  // the build fails when ReportRelativeRange gains a name this misses.
@@ -417,6 +418,19 @@ export class ReportFilterStateService {
417
418
  return this._changed$.asObservable()
418
419
  .pipe(rxFilter((groupId) => groupId === null || groupIds.has(groupId)));
419
420
  }
421
+ // Notifications relevant to ANY of a set of components that comes and goes
422
+ // (a page's values): a change to a group one of their filters belongs to.
423
+ // Unlike changesFor, the set is read on each event rather than captured at
424
+ // subscribe, so one subscription follows the set as the report reloads. A
425
+ // full re-init (null) is not passed on: init() runs on a report
426
+ // (re)load, and a caller of this checks on that reload itself whether the
427
+ // filter values its components are read with moved.
428
+ changesForAny(components) {
429
+ return this._changed$.asObservable()
430
+ .pipe(rxFilter((groupId) => groupId !== null
431
+ && components().some((component) => (component.filters ?? [])
432
+ .some((filter) => filter.filterGroupId === groupId))));
433
+ }
420
434
  // The group values resolved into this component's member-filter values —
421
435
  // what the data request carries. Disabled filters (authored or session) are
422
436
  // skipped entirely.
@@ -625,7 +639,9 @@ export class ReportFilterStateService {
625
639
  this._listSorts.delete(componentId);
626
640
  }
627
641
  });
628
- const filterIds = new Set(this._components(report)
642
+ // Values included: one is never drawn, but its filters are the report's
643
+ // like any other component's, and so are their session toggles.
644
+ const filterIds = new Set(reportComponents(report)
629
645
  .flatMap((component) => (component.filters ?? []).map((filter) => filter.id)));
630
646
  this._sessionDisabled.forEach((filterId) => {
631
647
  if (!filterIds.has(filterId)) {
@@ -678,15 +694,8 @@ export class ReportFilterStateService {
678
694
  return (value.value ?? '').trim() === (defaultValue.value ?? '').trim();
679
695
  }
680
696
  }
681
- // Every component of the report: its pages' and its header and footer's.
682
- _components(report) {
683
- return [
684
- ...(report.pages ?? []).flatMap((page) => page.components ?? []),
685
- ...(report.master?.components ?? []),
686
- ];
687
- }
688
697
  _listComponents(report) {
689
- return this._components(report)
698
+ return reportComponents(report)
690
699
  .filter((component) => component.type === 'list');
691
700
  }
692
701
  // The columns a list can be sorted by: every authored column, or a
@@ -776,4 +785,4 @@ export class ReportFilterStateService {
776
785
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
777
786
  type: Injectable
778
787
  }] });
779
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsR0FDN0IsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsR0FDakYsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUlMLG1CQUFtQixHQVVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd0Riw4RUFBOEU7QUFDOUUscUVBQXFFO0FBQ3JFLE1BQU0sZUFBZSxHQUFzQztJQUN6RCxRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsU0FBUyxFQUFFLElBQUk7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R0FBRyxFQUFFLENBQUM7WUFDbEQsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMvQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0Exd0JVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbiAgUmVwb3J0U29ydCxcbiAgUmVwb3J0VXJsUGFyYW1zLFxuICBSZXBvcnRVcmxTbmFwc2hvdCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGxpc3RIaWRkZW5Db2x1bW5zLCBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVDb2x1bW5MaXN0LCBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuXG5cbi8vIEV2ZXJ5IHJlbGF0aXZlIHJhbmdlIG5hbWUgdGhlIHNlcnZlciBrbm93cy4gQSByZWNvcmQgcmF0aGVyIHRoYW4gYSBsaXN0LCBzb1xuLy8gdGhlIGJ1aWxkIGZhaWxzIHdoZW4gUmVwb3J0UmVsYXRpdmVSYW5nZSBnYWlucyBhIG5hbWUgdGhpcyBtaXNzZXMuXG5jb25zdCBSRUxBVElWRV9SQU5HRVM6IFJlY29yZDxSZXBvcnRSZWxhdGl2ZVJhbmdlLCB0cnVlPiA9IHtcbiAgdGhpc1dlZWs6IHRydWUsXG4gIGxhc3RXZWVrOiB0cnVlLFxuICBsYXN0N0RheXM6IHRydWUsXG4gIGxhc3QzMERheXM6IHRydWUsXG4gIGxhc3QzTW9udGhzOiB0cnVlLFxuICBsYXN0Nk1vbnRoczogdHJ1ZSxcbiAgbGFzdDEyTW9udGhzOiB0cnVlLFxuICB0aGlzTW9udGg6IHRydWUsXG4gIHRoaXNRdWFydGVyOiB0cnVlLFxuICB0aGlzWWVhcjogdHJ1ZSxcbiAgeWVhclRvRGF0ZTogdHJ1ZSxcbn07XG5cblxuLy8gV2hldGhlciBhIHN0b3JlZCBwcmVzZXQgbmFtZSBpcyBvbmUgdGhlIHNlcnZlciByZXNvbHZlcyAoUmVwb3J0UmVsYXRpdmVSYW5nZSkuXG5mdW5jdGlvbiBpc1JlbGF0aXZlUmFuZ2UobmFtZTogc3RyaW5nKTogbmFtZSBpcyBSZXBvcnRSZWxhdGl2ZVJhbmdlIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSRUxBVElWRV9SQU5HRVMsIG5hbWUpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5sZW5ndGggPT09IChiLnZhbHVlcyA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIudmFsdWVzID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciBhIHZhbHVlIHJlYWQgb2ZmIGEgZmlsdGVyIGJhciBpcyB0aGUgdmFsdWUgYWxyZWFkeSBzdG9yZWQgZm9yIGl0c1xuLy8gZ3JvdXA6IHRoZSBzYW1lIGNhbGVuZGFyIGRheXMsIHRoZSBzYW1lIHNlbGVjdCB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kXG4vLyB0aGUgc2FtZSB0cmltbWVkIHRleHQuIEEgYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvXG4vLyB0aGlzIGlzIHdoYXQgdGVsbHMgdGhlIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSAodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpID0+ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpO1xuXG4gIHJldHVybiBzYW1lRGF5cyhhLCBiKVxuICAgICYmIHZhbHVlcyhhKS5qb2luKCdcXHUwMDAwJykgPT09IHZhbHVlcyhiKS5qb2luKCdcXHUwMDAwJylcbiAgICAmJiB2YWx1ZXMoYSkubGVuZ3RoID09PSB2YWx1ZXMoYikubGVuZ3RoXG4gICAgJiYgKGEudmFsdWUgPz8gJycpLnRyaW0oKSA9PT0gKGIudmFsdWUgPz8gJycpLnRyaW0oKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBWaWV3ZXIgZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHNhdmVkIHRvXG4vLyB0aGUgcmVwb3J0IOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksXG4vLyByZXNvbHZlcyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsXG4vLyBhbmQgbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gSXQgaXMgYWxzbyB0aGUgb25lIHNvdXJjZSBvZiB0aGUgdmlld2VyIHN0YXRlIHRoZSByZXBvcnQgVVJMIGNhcnJpZXMgKGdyb3VwXG4vLyB2YWx1ZXMsIHRoZSBncm91cC1ieSBncmFpbiwgbGlzdCBzb3J0cywgc2VhcmNoZXMgYW5kIGhpZGRlbiBjb2x1bW5zKTpcbi8vIHVybFNuYXBzaG90KCkgc2F5cyB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIGluaXQoKSByZXN0b3Jlc1xuLy8gaXQsIGFuZCB1cmxDaGFuZ2VzKCkgdGVsbHMgdGhlIGhvc3QncyBzaW5nbGUgVVJMIHdyaXRlciB3aGVuIHRvIHdyaXRlLlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIFVSTDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb20gYVxuLy8gY29tcG9uZW50J3MgZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhXG4vLyB2aWV3ZXIncyB0b2dnbGUgc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSkuIFJlbGF0aXZlIHByZXNldHNcbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRvZGF5IGluIGl0LCBhbmQgZGF0ZSBjZWxscyByZW5kZXIgaW4gaXQuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IHNpZ25hbDxzdHJpbmc+KCdVVEMnKTtcblxuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKHJlc29sdmVGb3JtYXRDb250ZXh0KTpcbiAgLy8gaXRzIGxvY2FsZSwgaXRzIGN1cnJlbmN5IGFuZCB3aGV0aGVyIHBlcmNlbnRzIGFycml2ZSBhcyByYXRpb3MuIEV2ZXJ5IEtQSSxcbiAgLy8gY2hhcnQsIGRhdGUgY2VsbCBhbmQgZXhwb3J0IHJlYWRzIGl0IGhlcmUuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZFxuICAvLyBvZiBhbiB1bmNoYW5nZWQgcmVwb3J0IHJlLXJlbmRlcnMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBzaWduYWw8UmVwb3J0Rm9ybWF0Q29udGV4dD4oREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwge1xuICAgIGVxdWFsOiAoYSwgYikgPT4gYS5sb2NhbGUgPT09IGIubG9jYWxlXG4gICAgICAmJiBhLmN1cnJlbmN5ID09PSBiLmN1cnJlbmN5XG4gICAgICAmJiBhLnJhdGlvUGVyY2VudCA9PT0gYi5yYXRpb1BlcmNlbnQsXG4gIH0pO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gZWFjaCBwbGFpbiBsaXN0IChsaXN0SGlkZGVuQ29sdW1ucyksXG4gIC8vIGJ5IGNvbXBvbmVudCBpZDsgYSBsaXN0IHNob3dpbmcgZXZlcnkgY29sdW1uIGhhcyBubyBlbnRyeS4gQSBzaWduYWwsIHNvIGFcbiAgLy8gbGlzdCBoaWRlcyBhbmQgc2hvd3MgaXRzIGNvbHVtbnMgaW4gcGxhY2U6IHRoZSByb3dzIGRvIG5vdCBjaGFuZ2UsIHNvXG4gIC8vIG5vdGhpbmcgcmVmZXRjaGVzLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWQgdGhhdCBrZWVwcyBldmVyeSBjb2x1bW5cbiAgLy8gcmVwYWludHMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RIaWRkZW4gPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4+KG5ldyBNYXAoKSwge1xuICAgIGVxdWFsOiBzYW1lSGlkZGVuLFxuICB9KTtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBHcm91cHMgdGhhdCBoYXZlIGEgZGVmYXVsdCB0aGUgdmlld2VyIGNsZWFyZWQuIFdpdGhvdXQgdGhpcyBhIHJlbG9hZCBvZiB0aGVcbiAgLy8gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBkaWFsb2cpIHdvdWxkIGZpbmQgbm8gdmFsdWUgZm9yIHRoZSBncm91cCBhbmQgc2VlZFxuICAvLyBpdHMgZGVmYXVsdCBzdHJhaWdodCBiYWNrLiBBIGNoYW5nZSB0byB0aGUgc3RvcmVkIGRlZmF1bHQgcmVsZWFzZXMgaXQuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgcmVwb3J0LXdpZGUgYnVja2V0IG92ZXJyaWRlIGZvciBhbGxcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzLiBVbnNldCA9IGVhY2ggY2hhcnQgdXNlcyBpdHMgYXV0aG9yZWQgZ3JhbnVsYXJpdHkuIE5ldmVyXG4gIC8vIHNhdmVkIHRvIHRoZSByZXBvcnQgKHRoZSBVUkwgY2FycmllcyBpdCksIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLiBOYW1lZFxuICAvLyBmb3IgdGhlIGBmcmVxdWVuY3lgIHdpcmUga2V5IGl0IHRyYXZlbHMgdW5kZXIsIG5vdCBmb3IgdGhlIGNvbnRyb2wncyBsYWJlbC5cbiAgcHJpdmF0ZSBfZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ZyZXF1ZW5jeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyB2aWV3ZXItY2hvc2VuIHNvcnQsIGJ5IGNvbXBvbmVudCBpZC4gSGVsZCBoZXJlIHJhdGhlciB0aGFuIG9ubHlcbiAgLy8gaW4gdGhlIGxpc3QncyBGc0xpc3Qgc28gaXQgc3Vydml2ZXMgdGhlIGxpc3QgYmVpbmcgcmVjcmVhdGVkIChhIHBhZ2Ugc3dpdGNoLFxuICAvLyBhIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBhbmQgc28gZXZlcnkgY29uc3VtZXIgb2Ygdmlld2VyIHN0YXRlIHJlYWRzIG9uZSBwbGFjZS5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCksIGJ5IGNvbXBvbmVudCBpZC4gQSBsaXN0IHdpdGhcbiAgLy8gYW4gZW1wdHkgYm94IGhhcyBubyBlbnRyeS4gSGVsZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb25zIGFzIHRoZSBzb3J0cywgYW5kXG4gIC8vIGJlY2F1c2UgdGhlIGJveCBsaXZlcyBpbiB0aGUgY29tcG9uZW50IGhlYWRlciwgbm90IGluIHRoZSBsaXN0LlxuICBwcml2YXRlIF9saXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGxpc3RzLCBieSBjb21wb25lbnQgaWQsIHNvIGEgZmlsdGVyIHRvZ2dsZSBjYW4gdGVsbFxuICAvLyB3aGljaCBvZiB0aGVtIGxvc2UgdGhlaXIgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLlxuICBwcml2YXRlIF9saXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gV2hldGhlciB0aGUgc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaC4gTGlzdCBzZWFyY2ggYW5kIGVmZmVjdGl2ZUxvY2FsZVxuICAvLyBzaGlwIGluIHRoZSBzYW1lIGZyYW1ld29yayBjaGFuZ2Ugc2V0LCBzbyBhIHNlcnZlciB0aGF0IHNlbmRzIG5vXG4gIC8vIGVmZmVjdGl2ZUxvY2FsZSBoYXMgbmVpdGhlciwgYW5kIGl0cyBsaXN0cyBzaG93IG5vIHNlYXJjaCBib3guXG4gIHByaXZhdGUgX3NlcnZlclNlYXJjaGVzID0gZmFsc2U7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBsaXN0IHdob3NlIHNlYXJjaCB0ZXh0IGNoYW5nZWQuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF91cmxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG4gICAgdGhpcy5mb3JtYXRDb250ZXh0LnNldChyZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQpKTtcbiAgICAvLyBCZWZvcmUgYW55IHNlYXJjaCByZXN0b3JlOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIHBpY2tlciBzaG9ydGN1dCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gVGhlIFVSTCBjb2RlYyBkZWNvZGVzIHByZXNldCBuYW1lcyB0aHJvdWdoIHRoaXMuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSB0aGUgVVJMIHNuYXBzaG90IGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCBhIGxpc3QgaXMgc2VhcmNoZWQgYnksIG9yIG51bGwgd2hlbiBpdHMgc2VhcmNoIGJveCBpcyBlbXB0eS5cbiAgcHVibGljIGxpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIGxpc3Qgc2hvd3MgdGhlIHNlYXJjaCBib3ggb3ZlciBpdHMgdGV4dCBjb2x1bW5zOiBpdCBkb2VzIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2ggKHNlZSBfc2VydmVyU2VhcmNoZXMpLCB1bmxlc3Mgb25lIG9mIGl0cyBsaXZlXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byBhIGtleXdvcmQgZ3JvdXAgaXRzIGhlYWRlciBzaG93cy4gQSBiYXIgc2hvd3Mgb25lIHNlYXJjaFxuICAvLyBib3ggKGl0cyBsYXN0IGtleXdvcmQgaXRlbSksIGFuZCB0aGF0IG9uZSBpcyB0aGUgYXV0aG9yJ3MuIFRoZSBoZWFkZXIsIHRoZVxuICAvLyBVUkwgcmVzdG9yZSwgdGhlIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCB0aGUgVVJMIGhlYXIgYWJvdXQgaXQgb25seSB3aGVuIHRoZSBzdG9yZWQgdGV4dCBhY3R1YWxseSBjaGFuZ2VkLlxuICBwdWJsaWMgc2V0TGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dCh0ZXh0KTtcblxuICAgIGlmIChzZWFyY2ggPT09ICh0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyAnJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudElkLCBzZWFyY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQubmV4dChjb21wb25lbnRJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW4gbmFtZXMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdDsgbm9uZSB3aGVuIGl0IHNob3dzIHRoZW0gYWxsLlxuICBwdWJsaWMgaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RIaWRkZW4oKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBsaXN0LCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOlxuICAvLyBuYW1lcyB0aGUgbGlzdCBjYW5ub3QgaGlkZSBhcmUgZHJvcHBlZCwgYW5kIG5vbmUgKG9yIGV2ZXJ5IGNvbHVtbikgY2xlYXJzXG4gIC8vIHRoZSBlbnRyeS4gT25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGxpc3QncyBzZWFyY2ggdGV4dCBjaGFuZ2VzLCBzbyB0aGF0IGxpc3QgcmVmZXRjaGVzLlxuICBwdWJsaWMgbGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBjYXJyaWVzIG1heSBoYXZlIGNoYW5nZWQ6IGEgZ3JvdXBcbiAgLy8gdmFsdWUsIHRoZSBncmFpbiwgYSBsaXN0IHNvcnQsIHNlYXJjaCBvciBoaWRkZW4gY29sdW1ucywgb3IgYSAocmUpbG9hZCBvZlxuICAvLyB0aGUgcmVwb3J0LlxuICBwdWJsaWMgdXJsQ2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdXJsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgc2hvdWxkIGNhcnJ5IGZvciBgcmVwb3J0YDogb25seSB3aGF0IGRpZmZlcnMgZnJvbVxuICAvLyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIHNvIGFuIHVudG91Y2hlZCByZXBvcnQgaGFzIGEgYmFyZSBVUkwgYW5kIGtlZXBzXG4gIC8vIGZvbGxvd2luZyBpdHMgZGVmYXVsdHMgd2hlbiB0aGV5IGNoYW5nZS4gQSBncm91cCB0aGUgdmlld2VyIGNsZWFyZWQgaXNcbiAgLy8gbnVsbC4gQSBkYXRlIHJhbmdlIGlzIGNvbXBhcmVkIG9uIGl0cyBkYXlzIGFnYWluc3QgaXRzIGRlZmF1bHQgcmVzb2x2ZWRcbiAgLy8gdG9kYXksIHNvIGEgdmFsdWUgdGhhdCBpcyB0aGUgZGVmYXVsdCB1bmRlciBhbm90aGVyIHByZXNldCBuYW1lICh0aGlzWWVhclxuICAvLyBhZ2FpbnN0IGEgeWVhclRvRGF0ZSBkZWZhdWx0KSBpcyBzdGlsbCB0aGUgZGVmYXVsdC5cbiAgcHVibGljIHVybFNuYXBzaG90KHJlcG9ydDogUmVwb3J0KTogUmVwb3J0VXJsU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuXG4gICAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXAuaWQsIG51bGwpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAhdGhpcy5faXNEZWZhdWx0KGdyb3VwLCB2YWx1ZSkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuICAgIGNvbnN0IGxpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGlzdEhpZGRlbiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkpIHtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgICAgbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIGxpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50LmlkLCBzZWFyY2gpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBsaXN0SGlkZGVuLnNldChjb21wb25lbnQuaWQsIFsuLi5oaWRkZW5dKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBncm91cHMsIGxpc3RTb3J0cywgbGlzdFNlYXJjaGVzLCBsaXN0SGlkZGVuLCBmcmVxdWVuY3k6IHRoaXMuX2ZyZXF1ZW5jeSB9O1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgLy8gVHVybmluZyBhIGtleXdvcmQgZmlsdGVyIGJhY2sgb24gdGFrZXMgaXRzIGxpc3QncyBzZWFyY2ggYm94IGF3YXksIGFuZFxuICAgIC8vIHRoZSBzZWFyY2ggd2l0aCBpdC4gVGhlIGxpc3QgcmVmZXRjaGVzIG9uIHRoZSBncm91cCBjaGFuZ2UgYmVsb3cuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIE9ORSBjb21wb25lbnQ6IGFueSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgaXRzXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byAob3IgYSBmdWxsIHJlLWluaXQpLlxuICBwdWJsaWMgY2hhbmdlc0Zvcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldCgoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZHMuaGFzKGdyb3VwSWQpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIHZhbHVlIGFzIHRoZSBmaWVsZHMgYSByZXF1ZXN0IGNhcnJpZXM6IGRhdGUgYm91bmRzIGFzIGNhbGVuZGFyXG4gIC8vIGRheXMsIHNlbGVjdCB2YWx1ZXMgd2hlbiBhbnkgYXJlIHBpY2tlZCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIE51bGwgd2hlblxuICAvLyBhbGwgb2YgdGhlbSBhcmUgZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdFxuICAvLyBzdGlsbCBpcyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGRhdGUgdmFsdWUgc3RpbGwgaXM6IHRoZSBwcmVzZXQgbmFtZSBpdCBjYXJyaWVzLFxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gQVxuICAvLyB2YWx1ZSB3aG9zZSBkYXlzIHRoZSB2aWV3ZXIgY2hhbmdlZCwgb3Igb25lIHNlZWRlZCBiZWZvcmUgbWlkbmlnaHQgdGhhdFxuICAvLyBpcyBub3cgYSBkYXkgYmVoaW5kLCBuYW1lcyBub25lLCBhbmQgdGhlIHNlcnZlciByZWFkcyBpdHMgZGF5cyBhbG9uZS5cbiAgcHJpdmF0ZSBfbGl2ZVByZXNldCh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlLnByZXNldCB8fCAhaXNSZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpO1xuXG4gICAgcmV0dXJuIHJhbmdlICYmIHNhbWVEYXlzKHZhbHVlLCByYW5nZSkgPyB2YWx1ZS5wcmVzZXQgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUdyb3VwcyhyZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQsIHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzZWFyY2hlcywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyB0aGF0XG4gIC8vIHNob3dzIGEgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLiBUaGUgdGV4dCBpcyByZWFkIGFzIGxpc3RTZWFyY2hUZXh0LFxuICAvLyBhbmQgYW4gZW1wdHkgb25lIGlzIG5vIHNlYXJjaC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHJlc3RvcmUubGlzdFNlYXJjaGVzLmZvckVhY2goKHJhdywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGxpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dChyYXcpO1xuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSAmJiBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBoaWRkZW4gY29sdW1ucywgZWFjaCBsaXN0J3Mga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczogb25seSB0aGVcbiAgLy8gY29uZmlndXJlZCBjb2x1bW5zIG9mIGEgcGxhaW4gbGlzdCB0aGUgcmVwb3J0IGhhcywgYW5kIG5vbmUgd2hlbiB0aGV5XG4gIC8vIHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdEhpZGRlbihyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICByZXN0b3JlLmxpc3RIaWRkZW4uZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBkZWNvZGVDb2x1bW5MaXN0KHJhdykpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIHZhbHVlIGlzIHRoZSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIGJ5IHR5cGU6IGEgZGF0ZSByYW5nZSBvblxuICAvLyBpdHMgZGF5cyAodGhlIGRlZmF1bHQgcmVzb2x2ZWQgdG9kYXkpLCBhIHNlbGVjdCBvbiBpdHMgdmFsdWVzIGluIGFueVxuICAvLyBvcmRlciwgYSBrZXl3b3JkIG9uIGl0cyB0ZXh0LlxuICBwcml2YXRlIF9pc0RlZmF1bHQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG4gICAgaWYgKCFkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIC8vIEFuIHVudG91Y2hlZCByb2xsaW5nIGRlZmF1bHQgc3RpbGwgY2FycmllcyBpdHMgcHJlc2V0IG5hbWUuIEl0cyBkYXlzXG4gICAgICAgIC8vIHdlcmUgcmVzb2x2ZWQgd2hlbiBpdCB3YXMgc2VlZGVkLCBhbmQgYWZ0ZXIgbWlkbmlnaHQgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gbWF0Y2ggdG9kYXkncywgYnV0IGl0IGlzIHN0aWxsIHRoZSBkZWZhdWx0IGFuZCBzdGF5cyBvdXQgb2YgdGhlIFVSTC5cbiAgICAgICAgaWYgKHZhbHVlLnByZXNldCAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzYW1lRGF5cyh2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gKGRlZmF1bHRWYWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gZGVmYXVsdHMubGVuZ3RoXG4gICAgICAgICAgJiYgdmFsdWVzLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT4gaXRlbSA9PT0gZGVmYXVsdHNbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpID09PSAoZGVmYXVsdFZhbHVlLnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50IG9mIHRoZSByZXBvcnQ6IGl0cyBwYWdlcycgYW5kIGl0cyBoZWFkZXIgYW5kIGZvb3RlcidzLlxuICBwcml2YXRlIF9jb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LnBhZ2VzID8/IFtdKS5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pLFxuICAgICAgLi4uKHJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
788
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsR0FDN0IsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsR0FDakYsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUlMLG1CQUFtQixHQVVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFHN0MsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxNQUFNLGVBQWUsR0FBc0M7SUFDekQsUUFBUSxFQUFFLElB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LFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEQsS0FBSyxhQUFhO2dCQUNoQixPQUFPLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDbEQsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMvQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0FweEJVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbiAgUmVwb3J0U29ydCxcbiAgUmVwb3J0VXJsUGFyYW1zLFxuICBSZXBvcnRVcmxTbmFwc2hvdCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGxpc3RIaWRkZW5Db2x1bW5zLCBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVDb2x1bW5MaXN0LCBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuaW1wb3J0IHsgcmVwb3J0Q29tcG9uZW50cyB9IGZyb20gJy4uL3ZhbHVlcyc7XG5cblxuLy8gRXZlcnkgcmVsYXRpdmUgcmFuZ2UgbmFtZSB0aGUgc2VydmVyIGtub3dzLiBBIHJlY29yZCByYXRoZXIgdGhhbiBhIGxpc3QsIHNvXG4vLyB0aGUgYnVpbGQgZmFpbHMgd2hlbiBSZXBvcnRSZWxhdGl2ZVJhbmdlIGdhaW5zIGEgbmFtZSB0aGlzIG1pc3Nlcy5cbmNvbnN0IFJFTEFUSVZFX1JBTkdFUzogUmVjb3JkPFJlcG9ydFJlbGF0aXZlUmFuZ2UsIHRydWU+ID0ge1xuICB0aGlzV2VlazogdHJ1ZSxcbiAgbGFzdFdlZWs6IHRydWUsXG4gIGxhc3Q3RGF5czogdHJ1ZSxcbiAgbGFzdDMwRGF5czogdHJ1ZSxcbiAgbGFzdDNNb250aHM6IHRydWUsXG4gIGxhc3Q2TW9udGhzOiB0cnVlLFxuICBsYXN0MTJNb250aHM6IHRydWUsXG4gIHRoaXNNb250aDogdHJ1ZSxcbiAgdGhpc1F1YXJ0ZXI6IHRydWUsXG4gIHRoaXNZZWFyOiB0cnVlLFxuICB5ZWFyVG9EYXRlOiB0cnVlLFxufTtcblxuXG4vLyBXaGV0aGVyIGEgc3RvcmVkIHByZXNldCBuYW1lIGlzIG9uZSB0aGUgc2VydmVyIHJlc29sdmVzIChSZXBvcnRSZWxhdGl2ZVJhbmdlKS5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVSYW5nZShuYW1lOiBzdHJpbmcpOiBuYW1lIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2Uge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJFTEFUSVZFX1JBTkdFUywgbmFtZSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gc3RvcmVkIGZpbHRlci1ncm91cCBkZWZhdWx0cyBhcmUgdGhlIHNhbWUuIENvbXBhcmVkIG9uIHRoZSBmaWVsZHMgYVxuLy8gZGVmYXVsdCBjYW4gYWN0dWFsbHkgY2FycnksIHNvIGtleSBvcmRlciBpbiB0aGUgcGF5bG9hZCBjYW4ndCByZWFkIGFzIGEgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVEZWZhdWx0KFxuICBhOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuICBiOiBGaWx0ZXJHcm91cERlZmF1bHQgfCBudWxsLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIHJldHVybiBhLnN0YXJ0ID09PSBiLnN0YXJ0XG4gICAgJiYgYS5lbmQgPT09IGIuZW5kXG4gICAgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZVxuICAgICYmIGEucmVsYXRpdmUgPT09IGIucmVsYXRpdmVcbiAgICAmJiAoYS52YWx1ZXMgPz8gW10pLmxlbmd0aCA9PT0gKGIudmFsdWVzID8/IFtdKS5sZW5ndGhcbiAgICAmJiAoYS52YWx1ZXMgPz8gW10pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSAoYi52YWx1ZXMgPz8gW10pW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdCBzb3J0cyBvcmRlciB0aGUgcm93cyB0aGUgc2FtZSB3YXkuIE5vIGRpcmVjdGlvbiByZWFkcyBhc1xuLy8gYXNjZW5kaW5nLCB0aGUgd2F5IHRoZSBsaXN0IGFwcGxpZXMgaXQuXG5mdW5jdGlvbiBzYW1lU29ydChhOiBSZXBvcnRTb3J0LCBiOiBSZXBvcnRTb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFiXG4gICAgJiYgYS5jb2x1bW4gPT09IGIuY29sdW1uXG4gICAgJiYgKGEuZGlyZWN0aW9uID8/ICdhc2MnKSA9PT0gKGIuZGlyZWN0aW9uID8/ICdhc2MnKTtcbn1cblxuXG4vLyBXaGV0aGVyIGEgdmFsdWUgcmVhZCBvZmYgYSBmaWx0ZXIgYmFyIGlzIHRoZSB2YWx1ZSBhbHJlYWR5IHN0b3JlZCBmb3IgaXRzXG4vLyBncm91cDogdGhlIHNhbWUgY2FsZW5kYXIgZGF5cywgdGhlIHNhbWUgc2VsZWN0IHZhbHVlcyBpbiB0aGUgc2FtZSBvcmRlciBhbmRcbi8vIHRoZSBzYW1lIHRyaW1tZWQgdGV4dC4gQSBiYXIgcmUtcmVhZHMgZXZlcnkgZ3JvdXAgaXQgc2hvd3Mgb24gYW55IGNoYW5nZSwgc29cbi8vIHRoaXMgaXMgd2hhdCB0ZWxscyB0aGUgZ3JvdXAgdGhhdCBjaGFuZ2VkIGZyb20gdGhlIG9uZXMgdGhhdCBkaWQgbm90LlxuZXhwb3J0IGZ1bmN0aW9uIHNhbWVGaWx0ZXJWYWx1ZShcbiAgYTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGI6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIGlmICghYSB8fCAhYikge1xuICAgIHJldHVybiAhYSAmJiAhYjtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9ICh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSkgPT4gKHZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyk7XG5cbiAgcmV0dXJuIHNhbWVEYXlzKGEsIGIpXG4gICAgJiYgdmFsdWVzKGEpLmpvaW4oJ1xcdTAwMDAnKSA9PT0gdmFsdWVzKGIpLmpvaW4oJ1xcdTAwMDAnKVxuICAgICYmIHZhbHVlcyhhKS5sZW5ndGggPT09IHZhbHVlcyhiKS5sZW5ndGhcbiAgICAmJiAoYS52YWx1ZSA/PyAnJykudHJpbSgpID09PSAoYi52YWx1ZSA/PyAnJykudHJpbSgpO1xufVxuXG5cbi8vIFRoZSBncm91cHMgYSBiYXIgcmUtcmVhZCB0aGF0IGl0IG5vdyBzaG93cyB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgb25lXG4vLyBpdCBsYXN0IHJlcG9ydGVkLCByZWNvcmRpbmcgZWFjaCBuZXcgdmFsdWUgaW4gYGxhc3RSZXBvcnRlZGAuIEEgYmFyIGlzXG4vLyBjb21wYXJlZCB3aXRoIGl0c2VsZiwgbmV2ZXIgd2l0aCB0aGUgc3RvcmVkIHZhbHVlOiBhIGdyb3VwIHNob3duIGluIHR3byBiYXJzXG4vLyAobGV2ZWwgJ2JvdGgnKSBjYW4gYmUgY2hhbmdlZCBpbiB0aGUgb3RoZXIgb25lLCBhbmQgdGhpcyBiYXIgaXMgbm90XG4vLyByZXBhaW50ZWQsIHNvIGl0cyBzdGFsZSB2YWx1ZSBtdXN0IG5vdCBiZSBzZXQgYmFjayB3aGVuIHRoZSB2aWV3ZXIgY2hhbmdlc1xuLy8gYW5vdGhlciBvZiBpdHMgaXRlbXMgKHRoZSBsaXN0IHNlYXJjaCBib3gsIHNheSkuXG5leHBvcnQgZnVuY3Rpb24gbW92ZWRHcm91cFZhbHVlcyhcbiAgbGFzdFJlcG9ydGVkOiBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4sXG4gIHJlcG9ydGVkOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIHJlcG9ydGVkLmZpbHRlcigoeyBncm91cElkLCB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKHNhbWVGaWx0ZXJWYWx1ZShsYXN0UmVwb3J0ZWQuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsYXN0UmVwb3J0ZWQuc2V0KGdyb3VwSWQsIHZhbHVlKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuXG4vLyBBIGxpc3QncyBzZWFyY2ggdGV4dCBhcyB0aGUgc2VydmVyIGFwcGxpZXMgaXQ6IHRyaW1tZWQsIHRoZW4gY3V0IHRvXG4vLyBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIGNoYXJhY3RlcnMgKGNvZGUgcG9pbnRzLCBhcyB0aGUgc2VydmVyIGNvdW50cyB0aGVtKS5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0U2VhcmNoVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gWy4uLnRleHQudHJpbSgpXS5zbGljZSgwLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIKS5qb2luKCcnKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0cyBvZiBjb2x1bW4gbmFtZXMgYXJlIHRoZSBzYW1lIG5hbWVzIGluIHRoZSBzYW1lIG9yZGVyLlxuZnVuY3Rpb24gc2FtZU5hbWVzKGE6IHJlYWRvbmx5IHN0cmluZ1tdLCBiOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKG5hbWUsIGluZGV4KSA9PiBuYW1lID09PSBiW2luZGV4XSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gaGlkZGVuLWNvbHVtbiBtYXBzIGhpZGUgdGhlIHNhbWUgY29sdW1ucyBvbiB0aGUgc2FtZSBsaXN0cy5cbmZ1bmN0aW9uIHNhbWVIaWRkZW4oXG4gIGE6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuICBiOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5zaXplID09PSBiLnNpemVcbiAgICAmJiBbLi4uYV0uZXZlcnkoKFtjb21wb25lbnRJZCwgbmFtZXNdKSA9PiBzYW1lTmFtZXMobmFtZXMsIGIuZ2V0KGNvbXBvbmVudElkKSA/PyBbXSkpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGRhdGUtcmFuZ2UgdmFsdWVzIGNvdmVyIHRoZSBzYW1lIGNhbGVuZGFyIGRheXMuXG5mdW5jdGlvbiBzYW1lRGF5cyhhOiBGaWx0ZXJHcm91cFZhbHVlLCBiOiBGaWx0ZXJHcm91cFZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkYXRlQm91bmRTdHJpbmcoYS5zdGFydCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLnN0YXJ0KVxuICAgICYmIGRhdGVCb3VuZFN0cmluZyhhLmVuZCkgPT09IGRhdGVCb3VuZFN0cmluZyhiLmVuZCk7XG59XG5cblxuLy8gQSBzdGFibGUgc2lnbmF0dXJlIGZvciBhIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQuIFRoZSByZXBvcnQgdG9vbGJhciBrZXlzIGl0c1xuLy8gZnMtZmlsdGVyIG9uIHRoaXMsIGJlY2F1c2UgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0IOKAlCB3aXRob3V0IGFcbi8vIGtleSBjaGFuZ2UgaXQga2VlcHMgcmVuZGVyaW5nIHRoZSB2YWx1ZXMgaXQgd2FzIGNyZWF0ZWQgd2l0aCBldmVuIGFmdGVyIHRoZVxuLy8gY29uZmlnIGJlaGluZCBpdCBoYXMgYmVlbiByZWJ1aWx0LlxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRTaWduYXR1cmUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogc3RyaW5nIHtcbiAgY29uc3QgZ3JvdXBEZWZhdWx0ID0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0O1xuXG4gIGlmICghZ3JvdXBEZWZhdWx0KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBncm91cERlZmF1bHQuc3RhcnQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LmVuZCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQudmFsdWUgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnJlbGF0aXZlID8/ICcnLFxuICAgIChncm91cERlZmF1bHQudmFsdWVzID8/IFtdKS5qb2luKCcsJyksXG4gIF0uam9pbignficpO1xufVxuXG5cbi8vIFZpZXdlciBmaWx0ZXIgc3RhdGUgZm9yIHRoZSBvcGVuIHJlcG9ydC4gRmlsdGVyIFZBTFVFUyBhcmUgbmV2ZXIgc2F2ZWQgdG9cbi8vIHRoZSByZXBvcnQg4oCUIHRoaXMgc2VydmljZSBob2xkcyB0aGVtIHBlciBmaWx0ZXIgR1JPVVAgKHRoZSBwcm9wYWdhdGlvbiB1bml0KSxcbi8vIHJlc29sdmVzIHRoZW0gaW50byBwZXItY29tcG9uZW50IG1lbWJlci1maWx0ZXIgdmFsdWVzIGZvciBlYWNoIGRhdGEgcmVxdWVzdCxcbi8vIGFuZCBub3RpZmllcyB0aGUgY29tcG9uZW50cyB3aG9zZSBncm91cHMgY2hhbmdlZCBzbyBvbmx5IHRoZXkgcmVmZXRjaC5cbi8vXG4vLyBJdCBpcyBhbHNvIHRoZSBvbmUgc291cmNlIG9mIHRoZSB2aWV3ZXIgc3RhdGUgdGhlIHJlcG9ydCBVUkwgY2FycmllcyAoZ3JvdXBcbi8vIHZhbHVlcywgdGhlIGdyb3VwLWJ5IGdyYWluLCBsaXN0IHNvcnRzLCBzZWFyY2hlcyBhbmQgaGlkZGVuIGNvbHVtbnMpOlxuLy8gdXJsU25hcHNob3QoKSBzYXlzIHdoYXQgZGlmZmVycyBmcm9tIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgaW5pdCgpIHJlc3RvcmVzXG4vLyBpdCwgYW5kIHVybENoYW5nZXMoKSB0ZWxscyB0aGUgaG9zdCdzIHNpbmdsZSBVUkwgd3JpdGVyIHdoZW4gdG8gd3JpdGUuXG4vL1xuLy8gU2Vzc2lvbi1vbmx5LCBuZXZlciBpbiB0aGUgVVJMOiBwZXItZmlsdGVyIGVuYWJsZS9kaXNhYmxlIHRvZ2dsZXMgZnJvbSBhXG4vLyBjb21wb25lbnQncyBmaWx0ZXIgbWVudSAodGhlIGBlbmFibGVkYCBjb2x1bW4gaXMgdGhlIGF1dGhvcmVkIGRlZmF1bHQ7IGFcbi8vIHZpZXdlcidzIHRvZ2dsZSBzaG91bGRuJ3Qgd3JpdGUgdG8gdGhlIHJlcG9ydCkuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIHtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBlZmZlY3RpdmUgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lKS4gUmVsYXRpdmUgcHJlc2V0c1xuICAvLyByZXNvbHZlIGFnYWluc3QgdG9kYXkgaW4gaXQsIGFuZCBkYXRlIGNlbGxzIHJlbmRlciBpbiBpdC5cbiAgcHVibGljIHJlYWRvbmx5IHRpbWV6b25lID0gc2lnbmFsPHN0cmluZz4oJ1VUQycpO1xuXG4gIC8vIEhvdyB0aGUgb3BlbiByZXBvcnQgd3JpdGVzIGl0cyBudW1iZXJzIGFuZCBkYXRlcyAocmVzb2x2ZUZvcm1hdENvbnRleHQpOlxuICAvLyBpdHMgbG9jYWxlLCBpdHMgY3VycmVuY3kgYW5kIHdoZXRoZXIgcGVyY2VudHMgYXJyaXZlIGFzIHJhdGlvcy4gRXZlcnkgS1BJLFxuICAvLyBjaGFydCwgZGF0ZSBjZWxsIGFuZCBleHBvcnQgcmVhZHMgaXQgaGVyZS4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkXG4gIC8vIG9mIGFuIHVuY2hhbmdlZCByZXBvcnQgcmUtcmVuZGVycyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Q29udGV4dCA9IHNpZ25hbDxSZXBvcnRGb3JtYXRDb250ZXh0PihERUZBVUxUX0ZPUk1BVF9DT05URVhULCB7XG4gICAgZXF1YWw6IChhLCBiKSA9PiBhLmxvY2FsZSA9PT0gYi5sb2NhbGVcbiAgICAgICYmIGEuY3VycmVuY3kgPT09IGIuY3VycmVuY3lcbiAgICAgICYmIGEucmF0aW9QZXJjZW50ID09PSBiLnJhdGlvUGVyY2VudCxcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBlYWNoIHBsYWluIGxpc3QgKGxpc3RIaWRkZW5Db2x1bW5zKSxcbiAgLy8gYnkgY29tcG9uZW50IGlkOyBhIGxpc3Qgc2hvd2luZyBldmVyeSBjb2x1bW4gaGFzIG5vIGVudHJ5LiBBIHNpZ25hbCwgc28gYVxuICAvLyBsaXN0IGhpZGVzIGFuZCBzaG93cyBpdHMgY29sdW1ucyBpbiBwbGFjZTogdGhlIHJvd3MgZG8gbm90IGNoYW5nZSwgc29cbiAgLy8gbm90aGluZyByZWZldGNoZXMuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZCB0aGF0IGtlZXBzIGV2ZXJ5IGNvbHVtblxuICAvLyByZXBhaW50cyBub3RoaW5nLlxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdEhpZGRlbiA9IHNpZ25hbDxSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPj4obmV3IE1hcCgpLCB7XG4gICAgZXF1YWw6IHNhbWVIaWRkZW4sXG4gIH0pO1xuXG4gIHByaXZhdGUgX3ZhbHVlcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlPigpO1xuICBwcml2YXRlIF9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG4gIHByaXZhdGUgX3Nlc3Npb25EaXNhYmxlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIEdyb3VwcyB0aGF0IGhhdmUgYSBkZWZhdWx0IHRoZSB2aWV3ZXIgY2xlYXJlZC4gV2l0aG91dCB0aGlzIGEgcmVsb2FkIG9mIHRoZVxuICAvLyByZXBvcnQgKGEgY2hhdCBlZGl0LCBhIGRpYWxvZykgd291bGQgZmluZCBubyB2YWx1ZSBmb3IgdGhlIGdyb3VwIGFuZCBzZWVkXG4gIC8vIGl0cyBkZWZhdWx0IHN0cmFpZ2h0IGJhY2suIEEgY2hhbmdlIHRvIHRoZSBzdG9yZWQgZGVmYXVsdCByZWxlYXNlcyBpdC5cbiAgcHJpdmF0ZSBfY2xlYXJlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sOiBhIHNpbmdsZSByZXBvcnQtd2lkZSBidWNrZXQgb3ZlcnJpZGUgZm9yIGFsbFxuICAvLyB0aW1lLXNlcmllcyBjaGFydHMuIFVuc2V0ID0gZWFjaCBjaGFydCB1c2VzIGl0cyBhdXRob3JlZCBncmFudWxhcml0eS4gTmV2ZXJcbiAgLy8gc2F2ZWQgdG8gdGhlIHJlcG9ydCAodGhlIFVSTCBjYXJyaWVzIGl0KSwgYW5kIGNhcnJpZWQgaW4gdGhlIGRhdGEgcmVxdWVzdCdzXG4gIC8vIGBzdGF0ZWAsIHNvIGl0IHByb3BhZ2F0ZXMgdGhyb3VnaCB0byB0aGUgUERGL1Bvd2VyUG9pbnQgZXhwb3J0cyB0b28uIE5hbWVkXG4gIC8vIGZvciB0aGUgYGZyZXF1ZW5jeWAgd2lyZSBrZXkgaXQgdHJhdmVscyB1bmRlciwgbm90IGZvciB0aGUgY29udHJvbCdzIGxhYmVsLlxuICBwcml2YXRlIF9mcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfZnJlcXVlbmN5Q2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHZpZXdlci1jaG9zZW4gc29ydCwgYnkgY29tcG9uZW50IGlkLiBIZWxkIGhlcmUgcmF0aGVyIHRoYW4gb25seVxuICAvLyBpbiB0aGUgbGlzdCdzIEZzTGlzdCBzbyBpdCBzdXJ2aXZlcyB0aGUgbGlzdCBiZWluZyByZWNyZWF0ZWQgKGEgcGFnZSBzd2l0Y2gsXG4gIC8vIGEgcmVsb2FkIGFmdGVyIGFuIGVkaXQpIGFuZCBzbyBldmVyeSBjb25zdW1lciBvZiB2aWV3ZXIgc3RhdGUgcmVhZHMgb25lIHBsYWNlLlxuICBwcml2YXRlIF9saXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KSwgYnkgY29tcG9uZW50IGlkLiBBIGxpc3Qgd2l0aFxuICAvLyBhbiBlbXB0eSBib3ggaGFzIG5vIGVudHJ5LiBIZWxkIGhlcmUgZm9yIHRoZSBzYW1lIHJlYXNvbnMgYXMgdGhlIHNvcnRzLCBhbmRcbiAgLy8gYmVjYXVzZSB0aGUgYm94IGxpdmVzIGluIHRoZSBjb21wb25lbnQgaGVhZGVyLCBub3QgaW4gdGhlIGxpc3QuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgbGlzdHMsIGJ5IGNvbXBvbmVudCBpZCwgc28gYSBmaWx0ZXIgdG9nZ2xlIGNhbiB0ZWxsXG4gIC8vIHdoaWNoIG9mIHRoZW0gbG9zZSB0aGVpciBzZWFyY2ggYm94IChsaXN0U2VhcmNoYWJsZSkuXG4gIHByaXZhdGUgX2xpc3RzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydENvbXBvbmVudD4oKTtcblxuICAvLyBXaGV0aGVyIHRoZSBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoLiBMaXN0IHNlYXJjaCBhbmQgZWZmZWN0aXZlTG9jYWxlXG4gIC8vIHNoaXAgaW4gdGhlIHNhbWUgZnJhbWV3b3JrIGNoYW5nZSBzZXQsIHNvIGEgc2VydmVyIHRoYXQgc2VuZHMgbm9cbiAgLy8gZWZmZWN0aXZlTG9jYWxlIGhhcyBuZWl0aGVyLCBhbmQgaXRzIGxpc3RzIHNob3cgbm8gc2VhcmNoIGJveC5cbiAgcHJpdmF0ZSBfc2VydmVyU2VhcmNoZXMgPSBmYWxzZTtcblxuICAvLyBFbWl0cyB0aGUgaWQgb2YgdGhlIGxpc3Qgd2hvc2Ugc2VhcmNoIHRleHQgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaENoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIEVtaXRzIHRoZSBncm91cCBpZCB0aGF0IGNoYW5nZWQ7IGNvbXBvbmVudHMgbGlzdGVuIGZpbHRlcmVkIHRvIHRoZWlyIG93blxuICAvLyBncm91cCBpZHMuIG51bGwgPSBldmVyeXRoaW5nIGNoYW5nZWQgKHJlLWluaXQpLlxuICBwcml2YXRlIF9jaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlciB8IG51bGw+KCk7XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgYW55dGhpbmcgdGhlIFVSTCBjYXJyaWVzIG1heSBoYXZlIGNoYW5nZWQuXG4gIHByaXZhdGUgX3VybENoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBTZWVkIGdyb3VwcyArIHRoZWlyIGRlZmF1bHRzIHdoZW4gYSByZXBvcnQgbG9hZHMuIEV4aXN0aW5nIHNlc3Npb24gdmFsdWVzXG4gIC8vIGZvciBzdGlsbC1leGlzdGluZyBncm91cHMgc3Vydml2ZSBhIHN0cnVjdHVyZSByZS1mZXRjaCAoYSBjaGF0IGVkaXRcbiAgLy8gc2hvdWxkbid0IHJlc2V0IHRoZSB2aWV3ZXIncyBmaWx0ZXJzKSwgYW5kIHNvIGRvZXMgYSBncm91cCB0aGUgdmlld2VyXG4gIC8vIGNsZWFyZWQg4oCUIFVOTEVTUyB0aGUgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdCBpdHNlbGYgY2hhbmdlZCwgd2hpY2ggb25seVxuICAvLyBoYXBwZW5zIHdoZW4gYW4gb3BlcmF0b3Igc2F2ZWQgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnQgc2V0dGluZ3Mgb3IgdGhlXG4gIC8vIGFnZW50IHNldCBvbmUuIFRoYXQgaXMgYW4gZXhwbGljaXQgaW5zdHJ1Y3Rpb24gdG8gcmUtc2VlZCwgc28gaXQgd2lucyBvdmVyXG4gIC8vIHRoZSBzdXJ2aXZpbmcgc2Vzc2lvbiB2YWx1ZTsgd2l0aG91dCBpdCB0aGUgYmFyIGtlZXBzIHNob3dpbmcgd2hhdGV2ZXIgaXRcbiAgLy8gd2FzIGZpcnN0IHNlZWRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbiAgLy9cbiAgLy8gQSBjaGFuZ2Ugb2YgdGhlIHJlcG9ydCdzIHpvbmUgbW92ZXMgXCJ0b2RheVwiLCBzbyBhIHZhbHVlIHN0aWxsIGNhcnJ5aW5nIGl0c1xuICAvLyBncm91cCBkZWZhdWx0J3MgcHJlc2V0IG5hbWUgaXMgcmVzb2x2ZWQgYWdhaW4gaW4gdGhlIG5ldyB6b25lLiBBIHZhbHVlIHRoZVxuICAvLyB2aWV3ZXIgcGlja2VkLCBvciBvbmUgY2FycnlpbmcgYW5vdGhlciBwcmVzZXQgbmFtZSwgaXMga2VwdCBhcyBpdCBpcy5cbiAgLy9cbiAgLy8gYHJlc3RvcmVgIGlzIHRoZSB2aWV3ZXIgc3RhdGUgcmVhZCBmcm9tIHRoZSBVUkwuIFRoZSBob3N0IHBhc3NlcyBpdCBvbmx5IG9uXG4gIC8vIHRoZSBmaXJzdCBsb2FkIG9mIGEgcmVwb3J0OyBhIHJlbG9hZCBhZnRlciBhIGNoYXQgb3IgZGlhbG9nIGVkaXQgcGFzc2VzXG4gIC8vIG51bGwsIHNvIHRoZSBpbi1tZW1vcnkgc3RhdGUgd2lucy4gUGFyYW1zIHRoYXQgbmFtZSBhIGdyb3VwLCBsaXN0IG9yIGNvbHVtblxuICAvLyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMsIG9yIHRoYXQgZG8gbm90IGRlY29kZSwgYXJlIGlnbm9yZWQuXG4gIHB1YmxpYyBpbml0KHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMgfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzVGltZXpvbmUgPSB0aGlzLnRpbWV6b25lKCk7XG5cbiAgICAvLyBTZXQgZmlyc3Q6IHRoZSBkZWZhdWx0cyBzZWVkZWQgYmVsb3cgcmVzb2x2ZSB0aGVpciByZWxhdGl2ZSBwcmVzZXRzIGluIGl0LlxuICAgIHRoaXMudGltZXpvbmUuc2V0KHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpKTtcbiAgICB0aGlzLmZvcm1hdENvbnRleHQuc2V0KHJlc29sdmVGb3JtYXRDb250ZXh0KHJlcG9ydCkpO1xuICAgIC8vIEJlZm9yZSBhbnkgc2VhcmNoIHJlc3RvcmU6IGxpc3RTZWFyY2hhYmxlIHJlYWRzIGl0LlxuICAgIHRoaXMuX3NlcnZlclNlYXJjaGVzID0gcmVwb3J0LmVmZmVjdGl2ZUxvY2FsZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdGltZXpvbmVDaGFuZ2VkID0gcHJldmlvdXNUaW1lem9uZSAhPT0gdGhpcy50aW1lem9uZSgpO1xuICAgIGNvbnN0IHByZXZpb3VzR3JvdXBzID0gdGhpcy5fZ3JvdXBzO1xuICAgIHRoaXMuX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgdGhpcy5fZ3JvdXBzLnNldChncm91cC5pZCwgZ3JvdXApO1xuICAgICAgdGhpcy5fc2VlZChncm91cCwgcHJldmlvdXNHcm91cHMuZ2V0KGdyb3VwLmlkKSA/PyBudWxsLCB0aW1lem9uZUNoYW5nZWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RzID0gbmV3IE1hcCh0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpLm1hcCgoY29tcG9uZW50KSA9PiBbY29tcG9uZW50LmlkLCBjb21wb25lbnRdKSk7XG5cbiAgICBpZiAocmVzdG9yZSkge1xuICAgICAgdGhpcy5fcmVzdG9yZShyZXBvcnQsIHJlc3RvcmUpO1xuICAgIH1cblxuICAgIHRoaXMuX3BydW5lKHJlcG9ydCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB2YWx1ZShncm91cElkOiBudW1iZXIpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmdldChncm91cElkKTtcbiAgfVxuXG4gIC8vIEEgYmFyJ3MgdmFsdWUgZm9yIGEgZ3JvdXAuIEEgZGF0ZSByYW5nZSBrZWVwcyB0aGUgc3RvcmVkIHByZXNldCBuYW1lIG9ubHlcbiAgLy8gd2hpbGUgaXRzIGRheXMgYXJlIHN0aWxsIHRoZSBzdG9yZWQgZGF5czogdGhlIGJhcnMgcmUtc2V0IGV2ZXJ5IGdyb3VwIHRoZXlcbiAgLy8gc2hvdyB3aGVuZXZlciBhbnkgb25lIG9mIHRoZW0gY2hhbmdlcywgYW5kIGFuIHVudG91Y2hlZCByb2xsaW5nIHJhbmdlIG11c3RcbiAgLy8ga2VlcCBpdHMgbmFtZSByYXRoZXIgdGhhbiB0dXJuIGludG8gdHdvIGZpeGVkIGRhdGVzLiBBbnkgb3RoZXIgcmFuZ2UsIGFcbiAgLy8gcGlja2VyIHNob3J0Y3V0IGluY2x1ZGVkLCBpcyBzdG9yZWQgYXMgdGhlIGZpeGVkIGRhdGVzIGl0IHNob3dzLlxuICBwdWJsaWMgc2V0VmFsdWUoZ3JvdXBJZDogbnVtYmVyLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG5cbiAgICAgIGlmICh0aGlzLl9ncm91cHMuZ2V0KGdyb3VwSWQpPy5jb25maWc/LmRlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlcy5zZXQoZ3JvdXBJZCwgdGhpcy5fd2l0aFByZXNldCh0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpLCB2YWx1ZSkpO1xuICAgICAgdGhpcy5fY2xlYXJlZC5kZWxldGUoZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBBIHJlbGF0aXZlIHByZXNldCBuYW1lIGFzIHRvZGF5J3MgcmFuZ2UgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIG9yIG51bGwgZm9yXG4gIC8vIGEgbmFtZSBpdCBkb2VzIG5vdCBrbm93LiBUaGUgVVJMIGNvZGVjIGRlY29kZXMgcHJlc2V0IG5hbWVzIHRocm91Z2ggdGhpcy5cbiAgcHVibGljIHJlc29sdmVSZWxhdGl2ZShuYW1lOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZWxhdGl2ZVJhbmdlKG5hbWUpO1xuICB9XG5cbiAgLy8gVGhlIGFjdGl2ZSBncm91cC1ieSBncmFpbiwgb3IgbnVsbCB3aGVuIHRoZSB2aWV3ZXIgaGFzbid0IGNob3NlbiBvbmUuXG4gIHB1YmxpYyBmcmVxdWVuY3koKTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3k7XG4gIH1cblxuICBwdWJsaWMgc2V0RnJlcXVlbmN5KGZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9mcmVxdWVuY3kgPSBmcmVxdWVuY3k7XG4gICAgdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQubmV4dCgpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSBncm91cC1ieSBncmFpbiBjaGFuZ2VzIOKAlCBldmVyeSB0aW1lLXNlcmllcyBjaGFydCBsaXN0ZW5zXG4gIC8vIHNvIGl0IHJlZmV0Y2hlcyBhbmQgcmUtYnVja2V0cyAodGhlIG92ZXJyaWRlIGlzbid0IHNjb3BlZCB0byBhbnkgZmlsdGVyXG4gIC8vIGdyb3VwLCBzbyBjaGFuZ2VzRm9yKCkgY2FuJ3QgY2FycnkgaXQpLlxuICBwdWJsaWMgZnJlcXVlbmN5Q2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5Q2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgc29ydCB0aGUgdmlld2VyIGxhc3QgZmV0Y2hlZCBhIGxpc3Qgd2l0aCwgb3IgbnVsbCB3aGVuIGl0IGhhc24ndCBzb3J0ZWRcbiAgLy8gKHRoZSBsaXN0IHRoZW4gZmFsbHMgYmFjayB0byBpdHMgYXV0aG9yZWQgc29ydCkuXG4gIHB1YmxpYyBsaXN0U29ydChjb21wb25lbnRJZDogbnVtYmVyKTogUmVwb3J0U29ydCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGxpc3QncyBzb3J0IHdoZW4gaXQgaXMgdGhlIHZpZXdlcidzIG93bjogYSBzb3J0IHRoYXQgaXMgdGhlXG4gIC8vIGxpc3QncyBhdXRob3JlZCBmaXJzdCB0ZXJtIGlzIHRoZSBsaXN0J3MgZGVmYXVsdCwgbm90IGEgY2hvaWNlLCBzbyBpdFxuICAvLyBjbGVhcnMgdGhlIGVudHJ5IGluc3RlYWQgKHRoZSBydWxlIHRoZSBVUkwgc25hcHNob3QgYXBwbGllcykuIE90aGVyd2lzZSBhXG4gIC8vIGxpc3QncyBmaXJzdCBmZXRjaCB3b3VsZCByZWNvcmQgaXRzIHNlZWRlZCBhdXRob3JlZCB0ZXJtLCBhbmQgYSBsaXN0IHRoZVxuICAvLyBhZ2VudCByZS1zb3J0cyBsYXRlciBpbiB0aGUgc2Vzc2lvbiB3b3VsZCBrZWVwIHNlbmRpbmcgdGhlIG9sZCB0ZXJtXG4gIC8vIGZpcnN0LiBEZWxpYmVyYXRlbHkgZW1pdHMgbm8gY2hhbmdlOiB0aGUgbGlzdCBzZXRzIHRoaXMgZnJvbSB0aGUgZmV0Y2hcbiAgLy8gdGhhdCBhbHJlYWR5IHJhbiB3aXRoIHRoYXQgc29ydCwgc28gYSBub3RpZmljYXRpb24gd291bGQgb25seSBtYWtlIGl0XG4gIC8vIHJlZmV0Y2ggdGhlIHNhbWUgcm93cy4gT25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LlxuICBwdWJsaWMgc2V0TGlzdFNvcnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNvcnQ6IFJlcG9ydFNvcnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLmRlbGV0ZShjb21wb25lbnQuaWQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSB0ZXh0IGEgbGlzdCBpcyBzZWFyY2hlZCBieSwgb3IgbnVsbCB3aGVuIGl0cyBzZWFyY2ggYm94IGlzIGVtcHR5LlxuICBwdWJsaWMgbGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBXaGV0aGVyIGEgbGlzdCBzaG93cyB0aGUgc2VhcmNoIGJveCBvdmVyIGl0cyB0ZXh0IGNvbHVtbnM6IGl0IGRvZXMgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaCAoc2VlIF9zZXJ2ZXJTZWFyY2hlcyksIHVubGVzcyBvbmUgb2YgaXRzIGxpdmVcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIGEga2V5d29yZCBncm91cCBpdHMgaGVhZGVyIHNob3dzLiBBIGJhciBzaG93cyBvbmUgc2VhcmNoXG4gIC8vIGJveCAoaXRzIGxhc3Qga2V5d29yZCBpdGVtKSwgYW5kIHRoYXQgb25lIGlzIHRoZSBhdXRob3Incy4gVGhlIGhlYWRlciwgdGhlXG4gIC8vIFVSTCByZXN0b3JlLCB0aGUgcHJ1bmluZywgdGhlIGRhdGEgcmVxdWVzdCBzdGF0ZSBhbmQgdGhlIGV4cG9ydHMgYWxsIHJlYWRcbiAgLy8gdGhpcyBvbmUgcnVsZSwgc28gbm8gc2VhcmNoIG5hcnJvd3MgYSBsaXN0IHdob3NlIHNjcmVlbiBoYXMgbm8gYm94IHNob3dpbmdcbiAgLy8gaXQsIGFuZCBubyBleHBvcnQgdGl0bGVzIGEgc2VhcmNoIHRoZSBzZXJ2ZXIgZGlkIG5vdCBhcHBseS5cbiAgcHVibGljIGxpc3RTZWFyY2hhYmxlKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclNlYXJjaGVzXG4gICAgICAmJiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICAmJiAhKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5zb21lKChmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ncm91cHMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcblxuICAgICAgICByZXR1cm4gZmlsdGVyLmVuYWJsZWRcbiAgICAgICAgICAmJiAhdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpXG4gICAgICAgICAgJiYgZ3JvdXA/LnR5cGUgPT09ICdrZXl3b3JkJ1xuICAgICAgICAgICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCk7IGFuIGVtcHR5IGJveCBjbGVhcnNcbiAgLy8gaXQuIFRoZSBoZWFkZXIgY2FsbHMgdGhpcyBvbiBldmVyeSBjaGFuZ2Ugb2YgYW55IG9mIGl0cyBpdGVtcywgc28gdGhlXG4gIC8vIGxpc3QgYW5kIHRoZSBVUkwgaGVhciBhYm91dCBpdCBvbmx5IHdoZW4gdGhlIHN0b3JlZCB0ZXh0IGFjdHVhbGx5IGNoYW5nZWQuXG4gIHB1YmxpYyBzZXRMaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNlYXJjaCA9IGxpc3RTZWFyY2hUZXh0KHRleHQpO1xuXG4gICAgaWYgKHNlYXJjaCA9PT0gKHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50SWQpID8/ICcnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50SWQsIHNlYXJjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5uZXh0KGNvbXBvbmVudElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbiBuYW1lcyBhIHZpZXdlciBoaWQgb24gYSBsaXN0OyBub25lIHdoZW4gaXQgc2hvd3MgdGhlbSBhbGwuXG4gIHB1YmxpYyBoaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdEhpZGRlbigpLmdldChjb21wb25lbnRJZCkgPz8gW107XG4gIH1cblxuICAvLyBSZWNvcmRzIHRoZSBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIGxpc3QsIGtlcHQgdG8gbGlzdEhpZGRlbkNvbHVtbnM6XG4gIC8vIG5hbWVzIHRoZSBsaXN0IGNhbm5vdCBoaWRlIGFyZSBkcm9wcGVkLCBhbmQgbm9uZSAob3IgZXZlcnkgY29sdW1uKSBjbGVhcnNcbiAgLy8gdGhlIGVudHJ5LiBPbmx5IHRoZSBVUkwgaGVhcnMgYWJvdXQgaXQsIGFuZCBvbmx5IG9uIGEgcmVhbCBjaGFuZ2UuXG4gIHB1YmxpYyBzZXRIaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkOiBudW1iZXIsIG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGhpZGRlbiA9IGxpc3RIaWRkZW5Db2x1bW5zKHRoaXMuX2xpc3RzLmdldChjb21wb25lbnRJZCk/LmNvbmZpZywgbmFtZXMpO1xuXG4gICAgaWYgKHNhbWVOYW1lcyhoaWRkZW4sIHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBNYXAodGhpcy5saXN0SGlkZGVuKCkpO1xuXG4gICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgIG5leHQuc2V0KGNvbXBvbmVudElkLCBoaWRkZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0LmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChuZXh0KTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciBvbmUgbGlzdCdzIHNlYXJjaCB0ZXh0IGNoYW5nZXMsIHNvIHRoYXQgbGlzdCByZWZldGNoZXMuXG4gIHB1YmxpYyBsaXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnRJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTZWFyY2hDaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChpZCkgPT4gaWQgPT09IGNvbXBvbmVudElkKSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIHZpZXdlciBzdGF0ZSB0aGUgVVJMIGNhcnJpZXMgbWF5IGhhdmUgY2hhbmdlZDogYSBncm91cFxuICAvLyB2YWx1ZSwgdGhlIGdyYWluLCBhIGxpc3Qgc29ydCwgc2VhcmNoIG9yIGhpZGRlbiBjb2x1bW5zLCBvciBhIChyZSlsb2FkIG9mXG4gIC8vIHRoZSByZXBvcnQuXG4gIHB1YmxpYyB1cmxDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl91cmxDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBzaG91bGQgY2FycnkgZm9yIGByZXBvcnRgOiBvbmx5IHdoYXQgZGlmZmVycyBmcm9tXG4gIC8vIHRoZSBhdXRob3JlZCBkZWZhdWx0cywgc28gYW4gdW50b3VjaGVkIHJlcG9ydCBoYXMgYSBiYXJlIFVSTCBhbmQga2VlcHNcbiAgLy8gZm9sbG93aW5nIGl0cyBkZWZhdWx0cyB3aGVuIHRoZXkgY2hhbmdlLiBBIGdyb3VwIHRoZSB2aWV3ZXIgY2xlYXJlZCBpc1xuICAvLyBudWxsLiBBIGRhdGUgcmFuZ2UgaXMgY29tcGFyZWQgb24gaXRzIGRheXMgYWdhaW5zdCBpdHMgZGVmYXVsdCByZXNvbHZlZFxuICAvLyB0b2RheSwgc28gYSB2YWx1ZSB0aGF0IGlzIHRoZSBkZWZhdWx0IHVuZGVyIGFub3RoZXIgcHJlc2V0IG5hbWUgKHRoaXNZZWFyXG4gIC8vIGFnYWluc3QgYSB5ZWFyVG9EYXRlIGRlZmF1bHQpIGlzIHN0aWxsIHRoZSBkZWZhdWx0LlxuICBwdWJsaWMgdXJsU25hcHNob3QocmVwb3J0OiBSZXBvcnQpOiBSZXBvcnRVcmxTbmFwc2hvdCB7XG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9ncm91cHMudmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG5cbiAgICAgIGlmICh0aGlzLl9jbGVhcmVkLmhhcyhncm91cC5pZCkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgbnVsbCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmICF0aGlzLl9pc0RlZmF1bHQoZ3JvdXAsIHZhbHVlKSkge1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwLmlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG4gICAgY29uc3QgbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBjb25zdCBsaXN0SGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZ1tdPigpO1xuXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgdGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KSkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuX2xpc3RTZWFyY2hlcy5nZXQoY29tcG9uZW50LmlkKTtcbiAgICAgIGNvbnN0IGhpZGRlbiA9IHRoaXMuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpO1xuXG4gICAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgICBsaXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnQuaWQsIHNlYXJjaCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RIaWRkZW4uc2V0KGNvbXBvbmVudC5pZCwgWy4uLmhpZGRlbl0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGdyb3VwcywgbGlzdFNvcnRzLCBsaXN0U2VhcmNoZXMsIGxpc3RIaWRkZW4sIGZyZXF1ZW5jeTogdGhpcy5fZnJlcXVlbmN5IH07XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUZpbHRlcihmaWx0ZXJJZDogbnVtYmVyLCBncm91cElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuYWRkKGZpbHRlcklkKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuaW5nIGEga2V5d29yZCBmaWx0ZXIgYmFjayBvbiB0YWtlcyBpdHMgbGlzdCdzIHNlYXJjaCBib3ggYXdheSwgYW5kXG4gICAgLy8gdGhlIHNlYXJjaCB3aXRoIGl0LiBUaGUgbGlzdCByZWZldGNoZXMgb24gdGhlIGdyb3VwIGNoYW5nZSBiZWxvdy5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gT05FIGNvbXBvbmVudDogYW55IGNoYW5nZSB0byBhIGdyb3VwIG9uZSBvZiBpdHNcbiAgLy8gZmlsdGVycyBiZWxvbmdzIHRvIChvciBhIGZ1bGwgcmUtaW5pdCkuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZ3JvdXBJZHMgPSBuZXcgU2V0KChjb21wb25lbnQuZmlsdGVycyA/PyBbXSkubWFwKChmaWx0ZXIpID0+IGZpbHRlci5maWx0ZXJHcm91cElkKSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCkgPT4gZ3JvdXBJZCA9PT0gbnVsbCB8fCBncm91cElkcy5oYXMoZ3JvdXBJZCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbnMgcmVsZXZhbnQgdG8gQU5ZIG9mIGEgc2V0IG9mIGNvbXBvbmVudHMgdGhhdCBjb21lcyBhbmQgZ29lc1xuICAvLyAoYSBwYWdlJ3MgdmFsdWVzKTogYSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgdGhlaXIgZmlsdGVycyBiZWxvbmdzIHRvLlxuICAvLyBVbmxpa2UgY2hhbmdlc0ZvciwgdGhlIHNldCBpcyByZWFkIG9uIGVhY2ggZXZlbnQgcmF0aGVyIHRoYW4gY2FwdHVyZWQgYXRcbiAgLy8gc3Vic2NyaWJlLCBzbyBvbmUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgdGhlIHNldCBhcyB0aGUgcmVwb3J0IHJlbG9hZHMuIEFcbiAgLy8gZnVsbCByZS1pbml0IChudWxsKSBpcyBub3QgcGFzc2VkIG9uOiBpbml0KCkgcnVucyBvbiBhIHJlcG9ydFxuICAvLyAocmUpbG9hZCwgYW5kIGEgY2FsbGVyIG9mIHRoaXMgY2hlY2tzIG9uIHRoYXQgcmVsb2FkIGl0c2VsZiB3aGV0aGVyIHRoZVxuICAvLyBmaWx0ZXIgdmFsdWVzIGl0cyBjb21wb25lbnRzIGFyZSByZWFkIHdpdGggbW92ZWQuXG4gIHB1YmxpYyBjaGFuZ2VzRm9yQW55KGNvbXBvbmVudHM6ICgpID0+IFJlcG9ydENvbXBvbmVudFtdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoZ3JvdXBJZCk6IGdyb3VwSWQgaXMgbnVtYmVyID0+IGdyb3VwSWQgIT09IG51bGxcbiAgICAgICAgICAmJiBjb21wb25lbnRzKCkuc29tZSgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pXG4gICAgICAgICAgICAuc29tZSgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCA9PT0gZ3JvdXBJZCkpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIHZhbHVlIGFzIHRoZSBmaWVsZHMgYSByZXF1ZXN0IGNhcnJpZXM6IGRhdGUgYm91bmRzIGFzIGNhbGVuZGFyXG4gIC8vIGRheXMsIHNlbGVjdCB2YWx1ZXMgd2hlbiBhbnkgYXJlIHBpY2tlZCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIE51bGwgd2hlblxuICAvLyBhbGwgb2YgdGhlbSBhcmUgZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdFxuICAvLyBzdGlsbCBpcyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGRhdGUgdmFsdWUgc3RpbGwgaXM6IHRoZSBwcmVzZXQgbmFtZSBpdCBjYXJyaWVzLFxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gQVxuICAvLyB2YWx1ZSB3aG9zZSBkYXlzIHRoZSB2aWV3ZXIgY2hhbmdlZCwgb3Igb25lIHNlZWRlZCBiZWZvcmUgbWlkbmlnaHQgdGhhdFxuICAvLyBpcyBub3cgYSBkYXkgYmVoaW5kLCBuYW1lcyBub25lLCBhbmQgdGhlIHNlcnZlciByZWFkcyBpdHMgZGF5cyBhbG9uZS5cbiAgcHJpdmF0ZSBfbGl2ZVByZXNldCh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlLnByZXNldCB8fCAhaXNSZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpO1xuXG4gICAgcmV0dXJuIHJhbmdlICYmIHNhbWVEYXlzKHZhbHVlLCByYW5nZSkgPyB2YWx1ZS5wcmVzZXQgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUdyb3VwcyhyZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQsIHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzZWFyY2hlcywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyB0aGF0XG4gIC8vIHNob3dzIGEgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLiBUaGUgdGV4dCBpcyByZWFkIGFzIGxpc3RTZWFyY2hUZXh0LFxuICAvLyBhbmQgYW4gZW1wdHkgb25lIGlzIG5vIHNlYXJjaC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHJlc3RvcmUubGlzdFNlYXJjaGVzLmZvckVhY2goKHJhdywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGxpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dChyYXcpO1xuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSAmJiBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBoaWRkZW4gY29sdW1ucywgZWFjaCBsaXN0J3Mga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczogb25seSB0aGVcbiAgLy8gY29uZmlndXJlZCBjb2x1bW5zIG9mIGEgcGxhaW4gbGlzdCB0aGUgcmVwb3J0IGhhcywgYW5kIG5vbmUgd2hlbiB0aGV5XG4gIC8vIHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdEhpZGRlbihyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICByZXN0b3JlLmxpc3RIaWRkZW4uZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBkZWNvZGVDb2x1bW5MaXN0KHJhdykpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFZhbHVlcyBpbmNsdWRlZDogb25lIGlzIG5ldmVyIGRyYXduLCBidXQgaXRzIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQnc1xuICAgIC8vIGxpa2UgYW55IG90aGVyIGNvbXBvbmVudCdzLCBhbmQgc28gYXJlIHRoZWlyIHNlc3Npb24gdG9nZ2xlcy5cbiAgICBjb25zdCBmaWx0ZXJJZHMgPSBuZXcgU2V0KHJlcG9ydENvbXBvbmVudHMocmVwb3J0KVxuICAgICAgLmZsYXRNYXAoKGNvbXBvbmVudCkgPT4gKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmlkKSkpO1xuXG4gICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmZvckVhY2goKGZpbHRlcklkKSA9PiB7XG4gICAgICBpZiAoIWZpbHRlcklkcy5oYXMoZmlsdGVySWQpKSB7XG4gICAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5kZWxldGUoZmlsdGVySWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgY29uc3QgaGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPigpO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuKCkuZm9yRWFjaCgobmFtZXMsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBrZXB0ID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICAgIGlmIChrZXB0Lmxlbmd0aCkge1xuICAgICAgICBoaWRkZW4uc2V0KGNvbXBvbmVudElkLCBrZXB0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQoaGlkZGVuKTtcbiAgfVxuXG4gIC8vIFRoZSB2YWx1ZSBhIGJhciBzZXRzLCBrZWVwaW5nIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgd2hpbGUgdGhlIGRheXMgYXJlXG4gIC8vIHN0aWxsIHRoZSBzdG9yZWQgZGF5cyAoc2VlIHNldFZhbHVlKS5cbiAgcHJpdmF0ZSBfd2l0aFByZXNldChzdG9yZWQ6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKTogRmlsdGVyR3JvdXBWYWx1ZSB7XG4gICAgY29uc3QgZml4ZWQ6IEZpbHRlckdyb3VwVmFsdWUgPSB7IC4uLnZhbHVlIH07XG4gICAgZGVsZXRlIGZpeGVkLnByZXNldDtcblxuICAgIHJldHVybiBzdG9yZWQ/LnByZXNldCAmJiBzYW1lRGF5cyhzdG9yZWQsIGZpeGVkKVxuICAgICAgPyB7IC4uLmZpeGVkLCBwcmVzZXQ6IHN0b3JlZC5wcmVzZXQgfVxuICAgICAgOiBmaXhlZDtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgYSB2YWx1ZSBpcyB0aGUgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBieSB0eXBlOiBhIGRhdGUgcmFuZ2Ugb25cbiAgLy8gaXRzIGRheXMgKHRoZSBkZWZhdWx0IHJlc29sdmVkIHRvZGF5KSwgYSBzZWxlY3Qgb24gaXRzIHZhbHVlcyBpbiBhbnlcbiAgLy8gb3JkZXIsIGEga2V5d29yZCBvbiBpdHMgdGV4dC5cbiAgcHJpdmF0ZSBfaXNEZWZhdWx0KGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLl9kZWZhdWx0VmFsdWUoZ3JvdXApO1xuICAgIGlmICghZGVmYXVsdFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICAvLyBBbiB1bnRvdWNoZWQgcm9sbGluZyBkZWZhdWx0IHN0aWxsIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lLiBJdHMgZGF5c1xuICAgICAgICAvLyB3ZXJlIHJlc29sdmVkIHdoZW4gaXQgd2FzIHNlZWRlZCwgYW5kIGFmdGVyIG1pZG5pZ2h0IHRoZXkgbm8gbG9uZ2VyXG4gICAgICAgIC8vIG1hdGNoIHRvZGF5J3MsIGJ1dCBpdCBpcyBzdGlsbCB0aGUgZGVmYXVsdCBhbmQgc3RheXMgb3V0IG9mIHRoZSBVUkwuXG4gICAgICAgIGlmICh2YWx1ZS5wcmVzZXQgJiYgdmFsdWUucHJlc2V0ID09PSBncm91cC5jb25maWc/LmRlZmF1bHQ/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2FtZURheXModmFsdWUsIGRlZmF1bHRWYWx1ZSk7XG5cbiAgICAgIGNhc2UgJ3NlbGVjdCc6IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gKHZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZykuc29ydCgpO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IChkZWZhdWx0VmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKS5zb3J0KCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IGRlZmF1bHRzLmxlbmd0aFxuICAgICAgICAgICYmIHZhbHVlcy5ldmVyeSgoaXRlbSwgaW5kZXgpID0+IGl0ZW0gPT09IGRlZmF1bHRzW2luZGV4XSk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAodmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKSA9PT0gKGRlZmF1bHRWYWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RDb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiByZXBvcnRDb21wb25lbnRzKHJlcG9ydClcbiAgICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jyk7XG4gIH1cblxuICAvLyBUaGUgY29sdW1ucyBhIGxpc3QgY2FuIGJlIHNvcnRlZCBieTogZXZlcnkgYXV0aG9yZWQgY29sdW1uLCBvciBhXG4gIC8vIGNyb3NzLXRhYidzIHJvdyBjb2x1bW4gb25seSAoaXRzIHBpdm90IGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YSkuXG4gIHByaXZhdGUgX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnO1xuXG4gICAgaWYgKGNvbmZpZz8ucGl2b3RCeT8uY29sdW1uKSB7XG4gICAgICByZXR1cm4gY29uZmlnLnJvd0J5Py5jb2x1bW4gPyBbY29uZmlnLnJvd0J5LmNvbHVtbl0gOiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNvbmZpZz8uY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4pID0+IGNvbHVtbi5jb2x1bW4pO1xuICB9XG5cbiAgLy8gQSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIG1hcHBlZCB0byBhIHNlc3Npb24gdmFsdWUgYnkgdHlwZS4gUmVsYXRpdmVcbiAgLy8gZGF0ZSBwcmVzZXRzIHJlc29sdmUgYWdhaW5zdCBcIm5vd1wiIGVhY2ggdGltZSB0aGUgcmVwb3J0IG9wZW5zLCBzbyBhIHNhdmVkXG4gIC8vIFwibGFzdCAxMiBtb250aHNcIiBzdGF5cyByZWxhdGl2ZSBhbmQgY2FycmllcyBpdHMgcHJlc2V0IG5hbWU7IGEgZml4ZWRcbiAgLy8gcmFuZ2UsIHNlbGVjdCB2YWx1ZXMgYW5kIGtleXdvcmQgdGV4dCBzZWVkIHZlcmJhdGltLlxuICBwcml2YXRlIF9kZWZhdWx0VmFsdWUoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICAgIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcbiAgICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9yZWxhdGl2ZVJhbmdlKGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSk7XG5cbiAgICAgIHJldHVybiByYW5nZSA/IHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCwgcHJlc2V0OiBncm91cERlZmF1bHQucmVsYXRpdmUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC5zdGFydCB8fCBncm91cERlZmF1bHQuZW5kKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogZ3JvdXBEZWZhdWx0LmVuZCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IGdyb3VwRGVmYXVsdC52YWx1ZXMgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBEZWZhdWx0LnZhbHVlKSB7XG4gICAgICByZXR1cm4geyB2YWx1ZTogZ3JvdXBEZWZhdWx0LnZhbHVlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIHJlbGF0aXZlIHByZXNldCBhcyBhIGNhbGVuZGFyLWRheSByYW5nZS4gXCJUb2RheVwiIGlzIHRoZSBkYXkgaW4gdGhlXG4gIC8vIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lLCBub3QgdGhlIGJyb3dzZXIncywgc28gZXZlcnkgdmlld2VyIHNlZWRzIHRoZSBzYW1lXG4gIC8vIHJhbmdlLiBUaGUgc2VydmVyIHR3aW4gaXMgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW0gKGZyYW1ld29yay9SZXBvcnQvRW51bSksXG4gIC8vIGFuZCBSZXBvcnRSZWxhdGl2ZVJhbmdlRW51bVRlc3QgcGlucyB0aGUgdGFibGUgYm90aCBzaWRlcyBtdXN0IHByb2R1Y2UuXG4gIHByaXZhdGUgX3JlbGF0aXZlUmFuZ2UocmVsYXRpdmU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgY29uc3Qgbm93ID0gZ2V0Wm9uZWROb3codGhpcy50aW1lem9uZSgpKTtcblxuICAgIHN3aXRjaCAocmVsYXRpdmUpIHtcbiAgICAgIC8vIEEgY2FsZW5kYXIgd2VlaywgTW9uZGF5IHRvIFN1bmRheSAoUkVQT1JUX1dFRUtfU1RBUlRTX09OLCB0aGUgc2FtZSB3ZWVrXG4gICAgICAvLyB0aGUgc2VydmVyJ3Mgd2Vla2x5IGJ1Y2tldHMgdXNlKSwgaW4gd2hvbGUgZGF5cyDigJQgbm90IHRoZSByb2xsaW5nXG4gICAgICAvLyBzZXZlbiBkYXlzIGBsYXN0N0RheXNgIGdpdmVzLCB3aGljaCBuZXZlciBsaW5lcyB1cCB3aXRoIHRoZSB3ZWVrIGFcbiAgICAgIC8vIHBhcnRuZXIgaGFzIGFscmVhZHkgYmVlbiBzZW50LiBgbGFzdFdlZWtgIGlzIHRoZSBvbmUgYSB3ZWVrbHkgcmVwb3J0XG4gICAgICAvLyB3YW50czogaXQgZW5kcyBvbiB0aGUgcHJldmlvdXMgd2VlaydzIFN1bmRheSByYXRoZXIgdGhhbiBhdCBgbm93YCxcbiAgICAgIC8vIGJlY2F1c2UgdGhlIHdlZWsgaXQgbmFtZXMgaGFzIGNsb3NlZC4gYHRoaXNXZWVrYCBmb2xsb3dzIGV2ZXJ5IG90aGVyXG4gICAgICAvLyBwcmVzZXQgaGVyZSBhbmQgcnVucyB1cCB0byBub3csIHNvIGl0IGlzIGRlbGliZXJhdGVseSBhIHBhcnQtZmluaXNoZWRcbiAgICAgIC8vIHdlZWsgKG9uIGEgU3VuZGF5IGl0IGlzIHRoZSB3aG9sZSBNb25kYXktdG8tU3VuZGF5IHdlZWspLlxuICAgICAgY2FzZSAndGhpc1dlZWsnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZldlZWsobm93LCB7IHdlZWtTdGFydHNPbjogUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0pLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdFdlZWsnOiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gc3ViV2Vla3Mobm93LCAxKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgICBlbmQ6IGVuZE9mV2VlayhwcmV2aW91cywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3Q3RGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgNyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0MzBEYXlzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1YkRheXMobm93LCAzMCksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0M01vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAzKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3Q2TW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDYpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDEyTW9udGhzJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN1Yk1vbnRocyhub3csIDEyKSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNNb250aCc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgobm93KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ3RoaXNRdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZRdWFydGVyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzWWVhcic6XG4gICAgICBjYXNlICd5ZWFyVG9EYXRlJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZZZWFyKG5vdyksIGVuZDogbm93IH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==