@firestitch/report 18.11.0 → 18.12.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 (42) hide show
  1. package/app/reports/components/component-grid/component-grid.component.d.ts +29 -0
  2. package/app/reports/components/component-grid/report-grid-formatter.d.ts +9 -0
  3. package/app/reports/data/report-grid-source.d.ts +22 -0
  4. package/app/reports/data/report.data.d.ts +3 -1
  5. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +2 -0
  6. package/app/reports/interfaces/report-chat-viewer-tile.interface.d.ts +5 -0
  7. package/app/reports/interfaces/report-grid-config.interface.d.ts +5 -0
  8. package/app/reports/interfaces/report-grid-line.interface.d.ts +6 -0
  9. package/app/reports/interfaces/report-grid-params.interface.d.ts +7 -0
  10. package/app/reports/interfaces/report-grid-report.interface.d.ts +2 -0
  11. package/app/reports/interfaces/report-grid-session-layout.interface.d.ts +5 -0
  12. package/app/reports/interfaces/report.interface.d.ts +3 -2
  13. package/app/reports/report-chat-viewer-state.d.ts +4 -1
  14. package/app/reports/report-grid-layout.d.ts +4 -0
  15. package/app/reports/services/report-filter-state.service.d.ts +6 -0
  16. package/app/reports/views/report/fs-ai-report.component.d.ts +2 -0
  17. package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +93 -0
  18. package/esm2022/app/reports/components/component-grid/report-grid-formatter.mjs +94 -0
  19. package/esm2022/app/reports/components/component-text/component-text.component.mjs +1 -1
  20. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -14
  21. package/esm2022/app/reports/data/report-grid-source.mjs +105 -0
  22. package/esm2022/app/reports/data/report.data.mjs +13 -2
  23. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  24. package/esm2022/app/reports/interfaces/report-chat-viewer-tile.interface.mjs +2 -0
  25. package/esm2022/app/reports/interfaces/report-grid-config.interface.mjs +2 -0
  26. package/esm2022/app/reports/interfaces/report-grid-line.interface.mjs +2 -0
  27. package/esm2022/app/reports/interfaces/report-grid-params.interface.mjs +2 -0
  28. package/esm2022/app/reports/interfaces/report-grid-report.interface.mjs +2 -0
  29. package/esm2022/app/reports/interfaces/report-grid-session-layout.interface.mjs +2 -0
  30. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  31. package/esm2022/app/reports/report-chat-viewer-state.mjs +21 -6
  32. package/esm2022/app/reports/report-grid-layout.mjs +14 -0
  33. package/esm2022/app/reports/report-tile.mjs +5 -5
  34. package/esm2022/app/reports/services/report-filter-state.service.mjs +77 -11
  35. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +36 -13
  36. package/fesm2022/{firestitch-report-echarts-DKXlgu1D.mjs → firestitch-report-echarts-CoaGXKET.mjs} +2 -2
  37. package/fesm2022/{firestitch-report-echarts-DKXlgu1D.mjs.map → firestitch-report-echarts-CoaGXKET.mjs.map} +1 -1
  38. package/fesm2022/{firestitch-report-firestitch-report-Bnv62suw.mjs → firestitch-report-firestitch-report-CHPA7sla.mjs} +457 -52
  39. package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +1 -0
  40. package/fesm2022/firestitch-report.mjs +1 -1
  41. package/package.json +4 -2
  42. package/fesm2022/firestitch-report-firestitch-report-Bnv62suw.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, NgZone, ViewChild, computed, effect, inject, input, output, signal, untracked, } from '@angular/core';
2
2
  import { HttpContext } from '@angular/common/http';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
- import { ActivatedRoute } from '@angular/router';
4
+ import { ActivatedRoute, Router } from '@angular/router';
5
5
  import { MatButtonModule } from '@angular/material/button';
6
6
  import { MatDialog } from '@angular/material/dialog';
7
7
  import { MatIconModule } from '@angular/material/icon';
@@ -24,7 +24,7 @@ import { ReportExportService } from '../../export/report-export.service';
24
24
  import { ReportPdfService } from '../../export/report-pdf.service';
25
25
  import { ReportPptxService } from '../../export/report-pptx.service';
26
26
  import { ReportTextLayoutService } from '../../export/report-text-layout.service';
27
- import { chatViewerDrills, chatViewerMatch } from '../../report-chat-viewer-state';
27
+ import { chatViewerDrills, chatViewerMatch, chatViewerTiles } from '../../report-chat-viewer-state';
28
28
  import { provideReportDatePicker } from '../../report-date-presets';
29
29
  import { GROUP_BY_ITEM, filterItemForGroup, groupByFilterItem, groupBySignature, groupItemName, groupValuesFromQuery, hasPageGroup, isGranularityOffered, matchFilterItem, matchFromQuery, reportBarGroups, } from '../../report-filter-items';
30
30
  import { savedFilterGroups, savedFilterValues } from '../../report-saved-filters';
@@ -46,12 +46,12 @@ export class FsAiReportComponent {
46
46
  reportId = input(null);
47
47
  // API base for the reports + chat endpoints; override to mount elsewhere.
48
48
  basePath = input('reports');
49
- // The query param a report reads its opening page from (a link in a ticket
50
- // can name a page: ?page=7). It is read once, when a report opens, and
51
- // never written: a report keeps no state in the browser URL. Its filters,
52
- // the page on screen and the rest live in the report's state
53
- // (ReportFilterStateService), so a reload opens the report on its
54
- // defaults. A host that wants no page read sets this to null.
49
+ // The query param that carries the page on screen (?page=7). A report opens
50
+ // on the page it names, and each move to another page writes it, in place,
51
+ // so a refresh or a shared link comes back to the same page. It is the only
52
+ // state a report keeps in the URL: its filters and the rest live in the
53
+ // report's state (ReportFilterStateService). A host that mounts several
54
+ // reports on one route, or wants no URL writes, sets this to null.
55
55
  pageQueryParam = input('page');
56
56
  // The report was deleted from its settings dialog — the host routes back to
57
57
  // the listing.
@@ -135,6 +135,7 @@ export class FsAiReportComponent {
135
135
  _reportData = inject(ReportData);
136
136
  _reportAiChatData = inject(ReportAiChatData);
137
137
  _route = inject(ActivatedRoute);
138
+ _router = inject(Router);
138
139
  _filterState = inject(ReportFilterStateService);
139
140
  _filterOptions = inject(ReportFilterOptionsService);
140
141
  _exportService = inject(ReportExportService);
@@ -288,7 +289,7 @@ export class FsAiReportComponent {
288
289
  });
289
290
  }
290
291
  // The canvas moved to another page. The report-level filters stay as they
291
- // are (they live in the state service), and the URL is left alone.
292
+ // are (they live in the state service); the page goes into the URL.
292
293
  onCanvasPageChanged(pageId) {
293
294
  // The asked-for page has been consumed; from here the canvas owns the page.
294
295
  this.pageId.set(null);
@@ -296,6 +297,7 @@ export class FsAiReportComponent {
296
297
  // The open page is part of the state the tiles and exports read.
297
298
  this._filterState.setPage(pageId);
298
299
  this.pageChanged.emit(pageId);
300
+ this._writePageToUrl(pageId);
299
301
  // The bar shows the page groups of the page on screen.
300
302
  if (hasPageGroup(this.report())) {
301
303
  this._buildReportConfig();
@@ -392,16 +394,20 @@ export class FsAiReportComponent {
392
394
  // What the viewer has on screen as a chat turn sends it. The canvas
393
395
  // selection counts only in edit mode: it is drawn only then, and it is kept
394
396
  // (not cleared) when edit mode is left. The match is sent only while it is
395
- // 'any', and the drilled charts only when one is drilled.
397
+ // 'any', the drilled charts only when one is drilled, and the tables only
398
+ // when the bound page shows one, each with the layout the viewer has it in
399
+ // while that differs from the stored one.
396
400
  _chatViewerState() {
397
401
  const snapshot = this._filterState.snapshot();
398
402
  const drills = chatViewerDrills(snapshot, this._filterState.formatContext().locale);
403
+ const tiles = chatViewerTiles(this._filterState.report(), this.chatPageId(), (component) => this._filterState.gridSessionLayout(component));
399
404
  return {
400
405
  granularity: this._filterState.frequency(),
401
406
  selectedComponentId: this.editMode() ? this._canvas?.selectedComponentId() ?? null : null,
402
407
  filters: this._filterState.viewerFilters(),
403
408
  ...chatViewerMatch(snapshot),
404
409
  ...(drills.length ? { drills } : {}),
410
+ ...(tiles.length ? { tiles } : {}),
405
411
  };
406
412
  }
407
413
  _resizeTo(clientX) {
@@ -413,8 +419,25 @@ export class FsAiReportComponent {
413
419
  const clamped = Math.min(0.8, Math.max(0.2, ratio));
414
420
  this._chatPanel.nativeElement.style.flexBasis = `${clamped * 100}%`;
415
421
  }
416
- // The page id the URL holds right now (?page=, read only), or null when the
417
- // page param is off or the value is not a usable id.
422
+ // The page on screen into the URL (?page=), replacing the current history
423
+ // entry rather than adding one, so Back leaves the report instead of
424
+ // stepping through its pages. Only the page param is touched; the host's
425
+ // own query params stay. Nothing is written when the param is off, or when
426
+ // the URL already names the page.
427
+ _writePageToUrl(pageId) {
428
+ const param = this.pageQueryParam();
429
+ if (!param || !pageId || this._pageIdFromUrl() === pageId) {
430
+ return;
431
+ }
432
+ this._router.navigate([], {
433
+ relativeTo: this._route,
434
+ queryParams: { [param]: pageId },
435
+ queryParamsHandling: 'merge',
436
+ replaceUrl: true,
437
+ });
438
+ }
439
+ // The page id the URL holds right now (?page=), or null when the page param
440
+ // is off or the value is not a usable id.
418
441
  _pageIdFromUrl() {
419
442
  const param = this.pageQueryParam();
420
443
  if (!param) {
@@ -692,4 +715,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
692
715
  type: ViewChild,
693
716
  args: [FilterComponent]
694
717
  }] } });
695
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDSyxlQUFlLEVBQWdCLGNBQWMsR0FDeEQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUNMLDBCQUEwQixHQUMzQixNQUFNLCtEQUErRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSx5REFBeUQsQ0FBQztBQUN4SCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUM1RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQU9sRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQzNHLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsR0FDckYsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN4RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFHeEQsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsYUFBYTtBQXVDYixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCLDRFQUE0RTtJQUM1RCxRQUFRLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUV0RCwwRUFBMEU7SUFDMUQsUUFBUSxHQUFHLEtBQUssQ0FBUyxTQUFTLENBQUMsQ0FBQztJQUVwRCwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLDBFQUEwRTtJQUMxRSw2REFBNkQ7SUFDN0Qsa0VBQWtFO0lBQ2xFLDhEQUE4RDtJQUM5QyxjQUFjLEdBQUcsS0FBSyxDQUFnQixNQUFNLENBQUMsQ0FBQztJQUU5RCw0RUFBNEU7SUFDNUUsZUFBZTtJQUNDLE9BQU8sR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUUzQywyRUFBMkU7SUFDM0UsK0JBQStCO0lBQ2YsT0FBTyxHQUFHLE1BQU0sRUFBVSxDQUFDO0lBRTNDLDRFQUE0RTtJQUM1RSxvREFBb0Q7SUFDcEMsV0FBVyxHQUFHLE1BQU0sRUFBaUIsQ0FBQztJQUV0QyxNQUFNLEdBQUcsTUFBTSxDQUFnQixJQUFJLENBQUMsQ0FBQztJQUNyQyxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpDLHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UsNkRBQTZEO0lBQzdDLE1BQU0sR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXJELDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsaUVBQWlFO0lBQ2pFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsb0RBQW9EO0lBQ3BDLFVBQVUsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXpELDZFQUE2RTtJQUM3RSxrQkFBa0I7SUFDbEIsRUFBRTtJQUNGLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSxvQ0FBb0M7SUFDcEMsRUFBRTtJQUNGLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSwwRUFBMEU7SUFDMUQsZUFBZSxHQUFHLFFBQVEsQ0FBMEIsR0FBRyxFQUFFO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUV2QyxPQUFPLFlBQVksS0FBSyxJQUFJO1lBQzFCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDL0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSx3Q0FBd0M7SUFDeEIsa0JBQWtCLEdBQUcsTUFBTSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUV2RSw0RUFBNEU7SUFDNUUsK0RBQStEO0lBQy9DLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0MsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSxnRUFBZ0U7SUFDaEQsZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDOUMsT0FBTztZQUNMLG1FQUFtRTtZQUNuRSxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQiwyRUFBMkU7WUFDM0UsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzVCLDhFQUE4RTtZQUM5RSx5RUFBeUU7WUFDekUscUVBQXFFO1lBQ3JFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5RyxzRUFBc0U7WUFDdEUsbUNBQW1DO1lBQ25DLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUdLLE1BQU0sQ0FBOEI7SUFHcEMsVUFBVSxDQUEyQjtJQUU3QywwRUFBMEU7SUFDMUUsaUJBQWlCO0lBRVQsT0FBTyxDQUF5QjtJQUV4Qyx1RUFBdUU7SUFDdkUseURBQXlEO0lBRWpELFVBQVUsQ0FBbUI7SUFFN0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hDLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNoRCxjQUFjLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDcEQsY0FBYyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdDLFVBQVUsR0FBRyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNsRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLGtFQUFrRTtJQUNqRCxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpDLHlFQUF5RTtJQUN6RSwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSxxREFBcUQ7SUFDN0MsZ0JBQWdCLEdBQW1DLElBQUksQ0FBQztJQUVoRSxpRUFBaUU7SUFDakUsa0RBQWtEO0lBQzFDLDRCQUE0QixHQUFrQixJQUFJLENBQUM7SUFFM0Q7UUFDRSwwRUFBMEU7UUFDMUUsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbkYseUVBQXlFO1FBQ3pFLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBRUgscURBQXFEO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFakMsd0VBQXdFO1lBQ3hFLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXJDLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFekIsc0VBQXNFO2dCQUN0RSxpREFBaUQ7Z0JBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxtQkFBbUI7UUFDbkIsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFakQsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxtRUFBbUU7SUFDbkUsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUM7SUFDN0MsQ0FBQztJQUVNLE9BQU87UUFDWixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxpREFBaUQ7SUFDakQsdUVBQXVFO0lBQ2hFLGNBQWM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUUzQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBeUQsdUJBQXVCLEVBQUU7WUFDbkgsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDO1FBRTdDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7YUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNwQixJQUFJLE1BQU0sRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUU1QixPQUFPO1lBQ1QsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSx1RUFBdUU7WUFDdkUsSUFBSSxNQUFNLEVBQUUsTUFBTSxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxnQ0FBZ0M7SUFDekIsaUJBQWlCLENBQUMsU0FBK0I7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBRTNCLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2pDLDBCQUEwQixFQUMxQjtZQUNFLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzVFLEtBQUssRUFBRSxPQUFPO1NBQ2YsQ0FDRixDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0UsMENBQTBDO1FBQzFDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixTQUFTLENBQUMsaUJBQWlCLENBQUMsY0FBYzthQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQ3hDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFMUMsU0FBUyxDQUFDLFdBQVcsRUFBRTthQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BCLHFFQUFxRTtZQUNyRSx3RUFBd0U7WUFDeEUsd0VBQXdFO1lBQ3hFLElBQUksTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUUzQixPQUFPO1lBQ1QsQ0FBQztZQUVELGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFM0IsT0FBTztZQUNULENBQUM7WUFFRCx1RUFBdUU7WUFDdkUsc0VBQXNFO1lBQ3RFLHNEQUFzRDtZQUN0RCxJQUFJLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLG1FQUFtRTtJQUM1RCxtQkFBbUIsQ0FBQyxNQUFxQjtRQUM5Qyw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTlCLHVEQUF1RDtRQUN2RCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLHFEQUFxRDtJQUM5QyxxQkFBcUI7UUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDaEUsZ0JBQWdCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLHNCQUFzQixFQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxrRkFBa0Y7SUFDM0UsU0FBUztRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLGVBQWUsRUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRCx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSwyRUFBMkU7SUFDM0UsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUseUJBQXlCO0lBQ2xCLFVBQVUsQ0FBQyxRQUFRLEdBQUcsS0FBSztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN0RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDcEIsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO2FBQ3BELElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQzVELE1BQU0sQ0FBQyxFQUFFLEVBQ1QsT0FBTyxFQUNQLE1BQU0sRUFDTixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQyxDQUNILENBQ0osQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ2pFLGNBQWMsQ0FBQyxRQUEwQjtRQUM5QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxRQUFpRCxDQUFDO1FBRXpFLDJFQUEyRTtRQUMzRSxxRUFBcUU7UUFDckUsZ0NBQWdDO1FBQ2hDLElBQUksY0FBYyxDQUFDLGFBQWEsSUFBSSxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxvQkFBb0I7SUFDYixhQUFhLENBQUMsS0FBbUI7UUFDdEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQWUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUQsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekQsQ0FBQyxDQUFDO1lBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsMERBQTBEO0lBQ2xELGdCQUFnQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBGLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDMUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pGLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtZQUMxQyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVPLFNBQVMsQ0FBQyxPQUFlO1FBQy9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3RFLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUscURBQXFEO0lBQzdDLGNBQWM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFckUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9ELENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLDRDQUE0QztJQUNwQyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7YUFDM0IsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDdkQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUNyQzthQUNBLFNBQVMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRTFCLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLHlDQUF5QztJQUNqQyxhQUFhO1FBQ25CLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDZCQUE2QjtJQUNyQixrQkFBa0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBRXBDLDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsSUFBSSxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLFFBQVE7WUFDcEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNuQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQseUNBQXlDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7WUFDMUIscUVBQXFFO1lBQ3JFLHVFQUF1RTtZQUN2RSxVQUFVLEVBQUUsS0FBSztZQUNqQixPQUFPLEVBQUUsS0FBSztZQUNkLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDckQsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3RCxnRUFBZ0U7WUFDaEUsb0VBQW9FO1lBQ3BFLDhEQUE4RDtZQUM5RCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUU7WUFDaEQsb0VBQW9FO1lBQ3BFLG1CQUFtQjtZQUNuQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRTtZQUMzRCxZQUFZO1lBQ1osMERBQTBEO1lBQzFELEdBQUcsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzVGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUMzRCx1QkFBdUIsQ0FBQyxRQUFnQjtRQUM5QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUscUJBQXFCLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEtBQUssUUFBUSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3RSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxRQUFRLENBQUM7UUFFN0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLHFCQUFxQixDQUFDLFlBQVksQ0FBQztRQUNuRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YscUJBQXFCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLHlFQUF5RTtJQUN6RSxpRUFBaUU7SUFDakUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSxtRUFBbUU7SUFDM0QsbUJBQW1CO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDO1FBRTNDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRSxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVztpQkFDekIsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztpQkFDbEYsSUFBSSxDQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBeUIsQ0FBQyxDQUFDLEVBQy9DLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FDcEc7WUFDSCxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDcEIsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsRUFBRTtvQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUU7d0JBQ3JFLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkQsT0FBTztxQkFDUixDQUFDO29CQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUU1RixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVztpQkFDdEMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDN0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXO2lCQUN0QyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUNqRSxrQkFBa0I7UUFDeEIsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSxzRUFBc0U7SUFDdEUseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUNoRSxlQUFlLENBQUMsV0FBOEI7UUFDcEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUU1QyxPQUFPO1lBQ0wsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ2xCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtZQUN0QixJQUFJLE9BQU87Z0JBQ1QsT0FBTyxFQUFFLENBQUM7Z0JBRVYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwyRUFBMkU7SUFDM0UsV0FBVztJQUNILGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSwwRUFBMEU7SUFDMUUsK0RBQStEO0lBQ3ZELFdBQVcsQ0FBQyxLQUEwQjtRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFckYsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQW9DLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFpQztRQUN2RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSwyQ0FBMkM7SUFDbkMsV0FBVyxDQUFDLEtBQThCLEVBQUUsUUFBaUI7UUFDbkUsS0FBSyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFvQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25GLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFFLEtBQUssQ0FBQyxhQUFhLENBQXNCLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbkYsa0VBQWtFO1FBQ2xFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSwwRUFBMEU7SUFDMUUsaUVBQWlFO0lBQ3pELFlBQVk7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRTdCLE9BQU8sTUFBTTtZQUNYLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxRCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxvREFBb0Q7SUFDNUMsVUFBVTtRQUNoQixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQzt3R0FqdEJVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLDZpQkEvQm5CO1lBQ1Qsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSx3QkFBd0I7WUFDeEIsMEVBQTBFO1lBQzFFLDBCQUEwQjtZQUMxQiw0QkFBNEI7WUFDNUIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQix1QkFBdUI7WUFDdkIsbUJBQW1CO1lBQ25CLHlFQUF5RTtZQUN6RSxtRUFBbUU7WUFDbkUsZ0JBQWdCO1lBQ2hCLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7WUFDeEQsc0VBQXNFO1lBQ3RFLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckcsMkVBQTJFO1lBQzNFLHdDQUF3QztZQUN4Qyx1QkFBdUIsRUFBRTtTQUMxQiw4TUFnSDZDLFVBQVUscUVBSzdDLHFCQUFxQiw2RUFLckIsZUFBZSxnRENsTjVCLDArSUEwSUEscWxERGhESSxjQUFjLGtLQUNkLFlBQVksd1pBQ1osaUJBQWlCLGlMQUNqQixlQUFlLHdVQUNmLGFBQWEsbUxBQ2IsZ0JBQWdCLDZUQUNoQixxQkFBcUI7OzRGQUdaLG1CQUFtQjtrQkF0Qy9CLFNBQVM7K0JBQ0UsY0FBYyxtQkFHUCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLHNCQUFzQixDQUFDLGFBQ3RCO3dCQUNULHNFQUFzRTt3QkFDdEUsdUVBQXVFO3dCQUN2RSx3QkFBd0I7d0JBQ3hCLDBFQUEwRTt3QkFDMUUsMEJBQTBCO3dCQUMxQiw0QkFBNEI7d0JBQzVCLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIseUVBQXlFO3dCQUN6RSxtRUFBbUU7d0JBQ25FLGdCQUFnQjt3QkFDaEIsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTt3QkFDeEQsc0VBQXNFO3dCQUN0RSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNyRywyRUFBMkU7d0JBQzNFLHdDQUF3Qzt3QkFDeEMsdUJBQXVCLEVBQUU7cUJBQzFCLFdBQ1E7d0JBQ1AsY0FBYzt3QkFDZCxZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIscUJBQXFCO3FCQUN0Qjt3REFxR08sTUFBTTtzQkFEYixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSTVCLFVBQVU7c0JBRGpCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU1sRCxPQUFPO3NCQURkLFNBQVM7dUJBQUMscUJBQXFCO2dCQU14QixVQUFVO3NCQURqQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQge1xuICBCYXNlSXRlbSwgRmlsdGVyQ29tcG9uZW50LCBGaWx0ZXJDb25maWcsIEZzRmlsdGVyTW9kdWxlLCBJRmlsdGVyQ29uZmlnSXRlbSwgSUZpbHRlclNhdmVkRmlsdGVyLCBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnLFxufSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVudSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgcHJvdmlkZUVjaGFydHNDb3JlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xuXG5pbXBvcnQgeyBGc0FpQ2hhdENvbXBvbmVudCwgRnNBaUNoYXREYXRhLCBGc0FpQ2hhdFJlc3BvbnNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYWknO1xuXG5pbXBvcnQgeyBSZXBvcnRDYW52YXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3JlcG9ydC1jYW52YXMvcmVwb3J0LWNhbnZhcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0QWlDaGF0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWFpLWNoYXQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRTZXR0aW5nc0NvbXBvbmVudCwgQ29tcG9uZW50U2V0dGluZ3NEaWFsb2dEYXRhLCBDb21wb25lbnRTZXR0aW5nc1Jlc3VsdCxcbn0gZnJvbSAnLi4vLi4vZGlhbG9ncy9jb21wb25lbnQtc2V0dGluZ3MvY29tcG9uZW50LXNldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgUmVwb3J0U2V0dGluZ3NSZXN1bHQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL3JlcG9ydC1zZXR0aW5ncy9yZXBvcnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRQZGZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRQcHR4U2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtcHB0eC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC10ZXh0LWxheW91dC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydENoYXRWaWV3ZXJTdGF0ZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRTYXZlZEZpbHRlciB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LXNhdmVkLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0LCBSZXBvcnRDaGF0UmVzcG9uc2UsXG4gIFJlcG9ydENvbXBvbmVudCBhcyBSZXBvcnRDb21wb25lbnRNb2RlbCwgUmVwb3J0RmlsdGVyR3JvdXAsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBjaGF0Vmlld2VyRHJpbGxzLCBjaGF0Vmlld2VyTWF0Y2ggfSBmcm9tICcuLi8uLi9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUnO1xuaW1wb3J0IHsgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIgfSBmcm9tICcuLi8uLi9yZXBvcnQtZGF0ZS1wcmVzZXRzJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIGZpbHRlckl0ZW1Gb3JHcm91cCwgZ3JvdXBCeUZpbHRlckl0ZW0sIGdyb3VwQnlTaWduYXR1cmUsIGdyb3VwSXRlbU5hbWUsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LFxuICBoYXNQYWdlR3JvdXAsIGlzR3JhbnVsYXJpdHlPZmZlcmVkLCBtYXRjaEZpbHRlckl0ZW0sIG1hdGNoRnJvbVF1ZXJ5LCByZXBvcnRCYXJHcm91cHMsXG59IGZyb20gJy4uLy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgc2F2ZWRGaWx0ZXJHcm91cHMsIHNhdmVkRmlsdGVyVmFsdWVzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LXNhdmVkLWZpbHRlcnMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UsIGRlZmF1bHRTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgemlwRXhwb3J0U3RhdGVzIH0gZnJvbSAnLi4vLi4vdGlsZS1kYXRhLXN0YXRlJztcblxuXG4vLyBBIHNpbmdsZSByZXBvcnQ6IHRoZSBBSSBjaGF0IG9uIHRoZSBsZWZ0LCB0aGUgcmVwb3J0IGNhbnZhcyBvbiB0aGUgcmlnaHQsXG4vLyB1bmRlciBhbiBIMiB0aXRsZSArIHNldHRpbmdzIGdlYXIuIFRoZSBob3N0IHN1cHBsaWVzIFtyZXBvcnRJZF0gKGZyb20gaXRzXG4vLyByb3V0ZSkgYW5kIHN3aXRjaGVzIHJlcG9ydHMgdGhyb3VnaCBpdHMgb3duIHJvdXRlcyDigJQgdGhpcyBjb21wb25lbnQgbmV2ZXJcbi8vIHBpY2tzIG9uZS5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFpLXJlcG9ydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mcy1haS1yZXBvcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgLy8gU2Vzc2lvbiBmaWx0ZXIgc3RhdGUgaXMgcGVyLW9wZW4tcmVwb3J0LCBub3QgYXBwLWdsb2JhbDsgdGhlIGV4cG9ydFxuICAgIC8vIHNlcnZpY2VzIHJlc29sdmUgZmlsdGVycyB0aHJvdWdoIGl0LCBzbyB0aGV5IGxpdmUgYXQgdGhlIHNhbWUgbGV2ZWwuXG4gICAgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLFxuICAgIC8vIFRoZSBiYXJzJyBzZWxlY3QgbGlzdHMsIG5hcnJvd2VkIGJ5IHRoZSBvdGhlciBmaWx0ZXJzOyBwZXIgb3BlbiByZXBvcnQuXG4gICAgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsXG4gICAgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSxcbiAgICBSZXBvcnRQcHR4U2VydmljZSxcbiAgICBSZXBvcnRQZGZTZXJ2aWNlLFxuICAgIFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydFNlcnZpY2UsXG4gICAgLy8gZnMtYWktY2hhdCBzaXRzIGluIHRoaXMgdGVtcGxhdGUsIHNvIGl0IHJlc29sdmVzIGl0cyBnYXRld2F5IGhlcmU6IHRoZVxuICAgIC8vIHJlcG9ydCBvbmUsIHdoaWNoIGFkZHMgdGhlIHZpZXdlcidzIHN0YXRlIHRvIGVhY2ggdHVybiBpdCBzZW5kcy5cbiAgICBSZXBvcnRBaUNoYXREYXRhLFxuICAgIHsgcHJvdmlkZTogRnNBaUNoYXREYXRhLCB1c2VFeGlzdGluZzogUmVwb3J0QWlDaGF0RGF0YSB9LFxuICAgIC8vIFRyZWUtc2hha2VuIEVDaGFydHMgY29yZSArIHRoZSAncmVwb3J0JyBob3VzZSB0aGVtZSwgbG9hZGVkIGxhemlseS5cbiAgICBwcm92aWRlRWNoYXJ0c0NvcmUoeyBlY2hhcnRzOiAoKSA9PiBpbXBvcnQoJy4uLy4uL3RoZW1lL2VjaGFydHMnKS50aGVuKChtb2R1bGUpID0+IG1vZHVsZS5kZWZhdWx0KSB9KSxcbiAgICAvLyBUaGUgYmFyJ3MgZGF0ZSBwaWNrZXJzIHN0YXJ0IHRoZWlyIHdlZWtzIG9uIE1vbmRheSBhbmQgbGlzdCB0aGUgYnVpbHQtaW5cbiAgICAvLyBwcmVzZXRzOyBhIHByZXNldCBvbmx5IHNldHMgdGhlIGRheXMuXG4gICAgcHJvdmlkZVJlcG9ydERhdGVQaWNrZXIoKSxcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIEZzRmlsdGVyTW9kdWxlLFxuICAgIEZzTWVudU1vZHVsZSxcbiAgICBGc0FpQ2hhdENvbXBvbmVudCxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIFJlcG9ydENhbnZhc0NvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBaVJlcG9ydENvbXBvbmVudCB7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGlzIHZpZXcgaXMgZm9jdXNlZCBvbiDigJQgc3VwcGxpZWQgYnkgdGhlIGhvc3QgZnJvbSB0aGUgcm91dGUuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEFQSSBiYXNlIGZvciB0aGUgcmVwb3J0cyArIGNoYXQgZW5kcG9pbnRzOyBvdmVycmlkZSB0byBtb3VudCBlbHNld2hlcmUuXG4gIHB1YmxpYyByZWFkb25seSBiYXNlUGF0aCA9IGlucHV0PHN0cmluZz4oJ3JlcG9ydHMnKTtcblxuICAvLyBUaGUgcXVlcnkgcGFyYW0gYSByZXBvcnQgcmVhZHMgaXRzIG9wZW5pbmcgcGFnZSBmcm9tIChhIGxpbmsgaW4gYSB0aWNrZXRcbiAgLy8gY2FuIG5hbWUgYSBwYWdlOiA/cGFnZT03KS4gSXQgaXMgcmVhZCBvbmNlLCB3aGVuIGEgcmVwb3J0IG9wZW5zLCBhbmRcbiAgLy8gbmV2ZXIgd3JpdHRlbjogYSByZXBvcnQga2VlcHMgbm8gc3RhdGUgaW4gdGhlIGJyb3dzZXIgVVJMLiBJdHMgZmlsdGVycyxcbiAgLy8gdGhlIHBhZ2Ugb24gc2NyZWVuIGFuZCB0aGUgcmVzdCBsaXZlIGluIHRoZSByZXBvcnQncyBzdGF0ZVxuICAvLyAoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKSwgc28gYSByZWxvYWQgb3BlbnMgdGhlIHJlcG9ydCBvbiBpdHNcbiAgLy8gZGVmYXVsdHMuIEEgaG9zdCB0aGF0IHdhbnRzIG5vIHBhZ2UgcmVhZCBzZXRzIHRoaXMgdG8gbnVsbC5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyBkZWxldGVkIGZyb20gaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIGhvc3Qgcm91dGVzIGJhY2sgdG9cbiAgLy8gdGhlIGxpc3RpbmcuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVkID0gb3V0cHV0PFJlcG9ydD4oKTtcblxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZSDigJQgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3JcbiAgLy8gdGhlaXIgb3duIHJlYXNvbnMuIE5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgVVJMLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUNoYW5nZWQgPSBvdXRwdXQ8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSBwYWdlIHRoZSBjYW52YXMgc2hvdWxkIG9wZW4gb246IHRoZSA/cGFnZT0gdGhlIHJlcG9ydCBvcGVuZWQgd2l0aFxuICAvLyAocmVhZCBvbmNlIHBlciByZXBvcnQpLiBDbGVhcmVkIGFzIHNvb24gYXMgdGhlIGNhbnZhcyByZXBvcnRzIGJhY2ssIHNvIGFcbiAgLy8gbGF0ZXIgaW4tYXBwIHBhZ2UgY2hhbmdlIGlzIG5ldmVyIGZvdWdodCBieSBhIHN0YWxlIHZhbHVlLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBwYWdlIHRoZSBjaGF0IGlzIGJvdW5kIHRvOiB0aGUgb25lIG9uIHNjcmVlbi4gQSByZXBvcnQgY29udmVyc2F0aW9uXG4gIC8vIGJlbG9uZ3MgdG8gZXhhY3RseSBvbmUgcGFnZSwgc28gdGhpcyBib3RoIHNjb3BlcyB0aGUgY29udmVyc2F0aW9uIGxpc3QgYW5kXG4gIC8vIGJlY29tZXMgdGhlIG5ldyBjb252ZXJzYXRpb24ncyBwYWdlLiBBIHNpZ25hbCBiZWNhdXNlIGl0IGZlZWRzXG4gIC8vIFtyZXF1ZXN0RGF0YV0g4oCUIGNoYW5naW5nIGl0IGlzIHdoYXQgcmVsb2FkcyB0aGUgcGFuZWwgb250byB0aGUgbmV3IHBhZ2Unc1xuICAvLyBjb252ZXJzYXRpb25zLiBOdWxsIHVudGlsIHRoZSBjYW52YXMgcmVwb3J0cyB3aGljaCBwYWdlIGl0IG9wZW5lZCBvbiwgd2hpY2hcbiAgLy8ga2VlcHMgdGhlIGNoYXQgZnJvbSBsaXN0aW5nIGFnYWluc3QgYSBwYWdlIGd1ZXNzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2hhdFBhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IHRoZSBjaGF0IHNlbmRzIHdpdGggZXZlcnkgY29udmVyc2F0aW9uIGNhbGw6IHRoZSByZXBvcnQsIGFuZCB0aGUgcGFnZVxuICAvLyBpdCBpcyBib3VuZCB0by5cbiAgLy9cbiAgLy8gcmVwb3J0UGFnZUlkIGlzIE9NSVRURUQsIG5vdCBzZW50IGFzIG51bGwsIHdoaWxlIHRoZSBvcGVuIHBhZ2UgaXMgdW5rbm93bi5cbiAgLy8gVGhlIGJhY2tlbmQgcmVhZHMgYSBQUkVTRU5UIHJlcG9ydFBhZ2VJZCBvZiAwL251bGwgYXMgXCJ0aGUgcmVwb3J0J3MgZWFybGllcixcbiAgLy8gcGFnZS1sZXNzIGNvbnZlcnNhdGlvbnNcIiwgc28gc2VuZGluZyBudWxsIGJlZm9yZSB0aGUgY2FudmFzIGhhcyByZXBvcnRlZCBpblxuICAvLyB3b3VsZCBhc2sgZm9yIHRoZSB3cm9uZyBsaXN0IOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBiaW5kIGEgY29udmVyc2F0aW9uIHN0YXJ0ZWRcbiAgLy8gaW4gdGhhdCB3aW5kb3cgdG8gbm8gcGFnZSBhdCBhbGwuXG4gIC8vXG4gIC8vIFRoZSBjaGF0IGlzIGFsc28gaGVsZCBjbG9zZWQgKFtyZWFkeV0gaW4gdGhlIHRlbXBsYXRlKSB1bnRpbCB0aGUgcGFnZSBpc1xuICAvLyBrbm93biwgc28gdGhpcyBwYXJ0aWFsIGNvbnRleHQgaXMgbmV2ZXIgYWN0dWFsbHkgc2VudDogb24gYSBmcmVzaCBsb2FkIHRoZVxuICAvLyByZXBvcnQgaGFzIHRvIGFycml2ZSBhbmQgdGhlIGNhbnZhcyBoYXMgdG8gcmVuZGVyIGJlZm9yZSBhbnkgcGFnZSBleGlzdHMsXG4gIC8vIGFuZCBhIGxpc3QgZmV0Y2hlZCBpbiB0aGF0IHdpbmRvdyB3b3VsZCBiZSB0aGUgd2hvbGUgcmVwb3J0J3MgY29udmVyc2F0aW9uc1xuICAvLyDigJQgdGhlIHVuc2NvcGVkIGxpc3QsIHNob3duIGFuZCBhdXRvLXNlbGVjdGVkIGJlZm9yZSB0aGUgcmVhbCBvbmUgbGFuZHMuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UmVxdWVzdERhdGEgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlcG9ydFBhZ2VJZCA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFBhZ2VJZCA9PT0gbnVsbFxuICAgICAgPyB7IHJlcG9ydElkOiB0aGlzLnJlcG9ydElkKCkgfVxuICAgICAgOiB7IHJlcG9ydElkOiB0aGlzLnJlcG9ydElkKCksIHJlcG9ydFBhZ2VJZCB9O1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0LWxldmVsIGZpbHRlciB0b29sYmFyIChmcy1maWx0ZXIpLiBSZWJ1aWx0IHdoZW5ldmVyIHRoZSBsb2FkZWRcbiAgLy8gcmVwb3J0IChhbmQgdGh1cyBpdHMgZ3JvdXBzKSBjaGFuZ2VzLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RmlsdGVyQ29uZmlnID0gc2lnbmFsPEZpbHRlckNvbmZpZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEdhdGVzIHRoZSB0b29sYmFyIGZzLWZpbHRlciBzbyBpdCBpc24ndCByZW5kZXJlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgLy8gcHV0IGluIGl0IOKAlCBubyByZXBvcnQtbGV2ZWwgZmlsdGVycyBhbmQgbm8gZ3JvdXAtYnkgY29udHJvbC5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydEhhc0ZpbHRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydEdyb3VwcygpLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICB9KTtcblxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgKGF0IGluaXQpLiBUaGUgdGVtcGxhdGUga2V5cyB0aGVcbiAgLy8gdG9vbGJhciBmcy1maWx0ZXIgb24gdGhpcyBzaWduYXR1cmUgc28gaXQncyByZWNyZWF0ZWQgKGFuZCByZS1yZWFkcyB0aGVcbiAgLy8gcmVidWlsdCBjb25maWcpIHdoZW5ldmVyIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RmlsdGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgYmFyIHdhcyBidWlsdCBmb3I6IGEgcmVzZXQgdG8gdGhlIGRlZmF1bHRzXG4gICAgICAvLyByZXBsYWNlcyBldmVyeSB2YWx1ZSBhdCBvbmNlLlxuICAgICAgdGhpcy5fYmFyVmVyc2lvbigpLFxuICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB6b25lIGlzIHBhcnQgb2YgaXQgdG9vOiBhIHpvbmUgY2hhbmdlIHJlLXJlc29sdmVzIHJlbGF0aXZlXG4gICAgICAvLyBwcmVzZXRzLCBhbmQgdGhlIGJhciBtdXN0IGJlIHJlY3JlYXRlZCB0byBzaG93IHRoZSBuZXcgZGF5cy5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCksXG4gICAgICAvLyBUaGUgc3RvcmVkIGRlZmF1bHQgaXMgcGFydCBvZiB0aGUgc2lnbmF0dXJlOiBzYXZpbmcgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnRcbiAgICAgIC8vIHNldHRpbmdzIHJlYnVpbGRzIHRoZSBjb25maWcsIGJ1dCB3aXRob3V0IGEga2V5IGNoYW5nZSBmcy1maWx0ZXIga2VlcHNcbiAgICAgIC8vIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAgZ3JvdXBCeVNpZ25hdHVyZSh0aGlzLnJlcG9ydCgpKSxcbiAgICAgIC4uLnRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfToke2dyb3VwLmxhYmVsfToke2RlZmF1bHRTaWduYXR1cmUoZ3JvdXApfWApLFxuICAgICAgLy8gQSBwYWdlIGdyb3VwIHNob3dzIG9uIGl0cyBvd24gcGFnZSBvbmx5LCBzbyBzdWNoIGEgYmFyIGlzIHJlY3JlYXRlZFxuICAgICAgLy8gd2hlbiB0aGUgcGFnZSBvbiBzY3JlZW4gY2hhbmdlcy5cbiAgICAgIC4uLihoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkgPyBbYHBhZ2U6JHt0aGlzLmNoYXRQYWdlSWQoKX1gXSA6IFtdKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfSk7XG5cbiAgQFZpZXdDaGlsZCgnc3BsaXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF9zcGxpdCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXRQYW5lbCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgX2NoYXRQYW5lbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE9ubHkgdGhlIGNhbnZhcyBrbm93cyB3aGljaCBwYWdlIGlzIG9uIHNjcmVlbiwgYW5kIGEgcGFnZS1zY29wZWQgZXhwb3J0XG4gIC8vIGhhcyB0byBhc2sgaXQuXG4gIEBWaWV3Q2hpbGQoUmVwb3J0Q2FudmFzQ29tcG9uZW50KVxuICBwcml2YXRlIF9jYW52YXM/OiBSZXBvcnRDYW52YXNDb21wb25lbnQ7XG5cbiAgLy8gVGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgYmFyLCB3aGlsZSBpdCBpcyBkcmF3bi4gQSBzYXZlZCBmaWx0ZXIgYmVpbmdcbiAgLy8gcGlja2VkIHJlYWRzIHRoZSBiYXIncyB2YWx1ZXMgb2ZmIGl0IChfa2VlcEJhck9uUGljaykuXG4gIEBWaWV3Q2hpbGQoRmlsdGVyQ29tcG9uZW50KVxuICBwcml2YXRlIF9yZXBvcnRCYXI/OiBGaWx0ZXJDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcmVwb3J0QWlDaGF0RGF0YSA9IGluamVjdChSZXBvcnRBaUNoYXREYXRhKTtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9maWx0ZXJPcHRpb25zID0gaW5qZWN0KFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZXhwb3J0U2VydmljZSA9IGluamVjdChSZXBvcnRFeHBvcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfY29sbGVjdG9yID0gaW5qZWN0KFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UpO1xuICBwcml2YXRlIF9wcm9jZXNzID0gaW5qZWN0KEZzUHJvY2Vzcyk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLy8gVGhlIHN0YXRlIHZlcnNpb24gdGhlIGJhciB3YXMgbGFzdCBidWlsdCBmb3IgKHJlcG9ydEZpbHRlcktleSkuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2JhclZlcnNpb24gPSBzaWduYWwoMCk7XG5cbiAgLy8gVGhlIHJlcG9ydCBiYXIncyB2YWx1ZXMgYXMgdGhleSB3ZXJlIHRoZSBtb21lbnQgZnMtZmlsdGVyIHJlYWQgYSBzYXZlZFxuICAvLyBmaWx0ZXIncyB2YWx1ZXMsIG9yIG51bGwgb3V0c2lkZSB0aGF0IG1vbWVudC4gQSBwaWNrIHNldHMgZXZlcnkgaXRlbSBvZlxuICAvLyB0aGUgYmFyIGZyb20gdGhlIHNhdmVkIGZpbHRlcidzIHZhbHVlczsgZWFjaCBpdGVtIGEgc2F2ZWQgZmlsdGVyIG5ldmVyXG4gIC8vIGhvbGRzICh0aGUgZ3JvdXAtYnkgZ3JhaW4sIHRoZSBtYXRjaCwgYSBwYWdlJ3Mgb3duIGZpbHRlcnMpIGlzIHB1dCBiYWNrXG4gIC8vIHRvIGl0cyBub3RlZCB2YWx1ZSBhcyBpdCBpcyBzZXQgKF9rZWVwSXRlbU9uUGljaykuXG4gIHByaXZhdGUgX2JhclZhbHVlc0F0UGljazogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICAvLyBUaGUgcmVwb3J0IHRoZSBzY3JlZW4gd2FzIG9wZW5lZCBvbiBpdHMgZmlyc3Qgc2F2ZWQgZmlsdGVyIGZvclxuICAvLyAoX29wZW5PbkZpcnN0U2F2ZWRGaWx0ZXIpLCBvciBudWxsIGJlZm9yZSB0aGF0LlxuICBwcml2YXRlIF9vcGVuZWRPblNhdmVkRmlsdGVyUmVwb3J0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVhY2ggY2hhdCB0dXJuIGNhcnJpZXMgd2hhdCB0aGUgdmlld2VyIGhhcyBvbiBzY3JlZW4uIE9ubHkgdGhlIGZ1bmN0aW9uXG4gICAgLy8gaXMgc2V0IGhlcmU7IGl0IGlzIGNhbGxlZCB3aGVuIGEgdHVybiBpcyBzZW50LlxuICAgIHRoaXMuX3JlcG9ydEFpQ2hhdERhdGEudHVybkRhdGEgPSAoKSA9PiAoeyB2aWV3ZXJTdGF0ZTogdGhpcy5fY2hhdFZpZXdlclN0YXRlKCkgfSk7XG5cbiAgICAvLyBQb2ludCB0aGUgc2hhcmVkIGRhdGEgZ2F0ZXdheSBhdCB0aGUgY29uZmlndXJlZCBiYXNlIGZpcnN0IChiZWZvcmUgYW55XG4gICAgLy8gbG9hZCBiZWxvdyByZWFkcyBpdCkuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydERhdGEuYmFzZVBhdGggPSB0aGlzLmJhc2VQYXRoKCk7XG4gICAgfSk7XG5cbiAgICAvLyAoUmUpbG9hZCB3aGVuZXZlciB0aGUgaG9zdCBzd2l0Y2hlcyB0aGUgcmVwb3J0IGlkLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0SWQoKTtcblxuICAgICAgLy8gVGhlIHBhZ2UgdGhpcyByZXBvcnQgb3BlbnMgb24sIGZyb20gdGhlID9wYWdlPSB0aGUgVVJMIGFscmVhZHkgaG9sZHMuXG4gICAgICAvLyBSZWFkIHBlciByZXBvcnQgcmF0aGVyIHRoYW4gb25jZSBhdCBjb25zdHJ1Y3Rpb246IHRoZSBob3N0IG1heSBzd2FwXG4gICAgICAvLyByZXBvcnRzIG9uIHRoZSBzYW1lIHJvdXRlLCBhbmQgZWFjaCBhcnJpdmFsIGNhcnJpZXMgaXRzIG93biA/cGFnZT0uXG4gICAgICBjb25zdCBwYWdlSWQgPSB0aGlzLl9wYWdlSWRGcm9tVXJsKCk7XG5cbiAgICAgIC8vIE9ubHkgdGhlIHJlcG9ydCBpZCBhbmQgdGhlIHBhZ2UgcGFyYW0gcmUtcnVuIHRoaXMuIFRoZSB2aWV3IHN0YXRlIGJlbG93XG4gICAgICAvLyBpcyB3cml0dGVuIGhlcmUgYW5kIHJlYWQgYnkgdGhlIGNvbmZpZyBidWlsZCwgc28gaXQgc3RheXMgdW50cmFja2VkLlxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0TW9kZS5zZXQoZmFsc2UpO1xuXG4gICAgICAgIC8vIEEgbmV3IHJlcG9ydCdzIHBhZ2VzIGFyZSBub3QgdGhpcyByZXBvcnQncyBwYWdlcyDigJQgZHJvcCB0aGUgYmluZGluZ1xuICAgICAgICAvLyB1bnRpbCBpdHMgY2FudmFzIHNheXMgd2hpY2ggcGFnZSBpdCBsYW5kZWQgb24uXG4gICAgICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMucGFnZUlkLnNldChwYWdlSWQpO1xuXG4gICAgICAgIGlmIChyZXBvcnRJZCAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXBvcnQuc2V0KG51bGwpO1xuICAgICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gcmVzZXRUb0RlZmF1bHRzKCkgbW92ZXMgdGhlIHN0YXRlIHZlcnNpb24uIFRoZSBiYXIgaXMgYnVpbHQgYWdhaW4gZm9yXG4gICAgLy8gaXQsIGFuZCByZXBvcnRGaWx0ZXJLZXksIHdoaWNoIGNhcnJpZXMgaXQsIHJlY3JlYXRlcyBmcy1maWx0ZXI6IGl0IHJlYWRzXG4gICAgLy8gaXRzIGNvbmZpZyBvbmNlLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSB0aGlzLl9iYXJWZXJzaW9uKCkpIHtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS51cGRhdGUoKGVkaXRNb2RlKSA9PiAhZWRpdE1vZGUpO1xuICB9XG5cbiAgLy8gVGhlIGVkaXQgdG9vbHMgbGl2ZSBpbiB0aGlzIHRvb2xiYXIsIGJ1dCB0aGUgY2FudmFzIG93bnMgd2hhdCB0aGV5IGFjdCBvblxuICAvLyAodGhlIGFjdGl2ZSBwYWdlLCB0aGUgaGVhZGVyL2Zvb3RlciBiYW5kcywgd2hpY2ggbGF5ZXIgaXMgbGl2ZSkuXG4gIHB1YmxpYyBnZXQgaXNNYXN0ZXJNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW52YXM/Lm1hc3Rlck1vZGUoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8uYWRkVGV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1hc3Rlck1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FudmFzPy50b2dnbGVNYXN0ZXJNb2RlKCk7XG4gIH1cblxuICAvLyBSZXBvcnQgc2V0dGluZ3Mg4oCUIG5hbWUsIHBhZ2Ugc2l6ZSwgZGVsZXRlLiBUaGVcbiAgLy8gZGlhbG9nIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmOyB3ZSByZWFjdCB0byB3aGF0IGl0IHJlcG9ydHMgYmFjay5cbiAgcHVibGljIHJlcG9ydFNldHRpbmdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydC5pZDtcblxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB1bmtub3duLCBSZXBvcnRTZXR0aW5nc1Jlc3VsdD4oUmVwb3J0U2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgcmVwb3J0IH0sXG4gICAgICB3aWR0aDogJzQ2MHB4JyxcbiAgICB9KTtcbiAgICBjb25zdCBzZXR0aW5ncyA9IGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnZGVsZXRlZCcpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZWQuZW1pdChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHNhdmUgdGhhdCBmYWlsZWQgcGFydCB3YXkgKGEgcmVmdXNlZCBuYW1lKSBtYXkgc3RpbGwgaGF2ZSBzdG9yZWRcbiAgICAgICAgLy8gdGhlIGZpbHRlcnMgYmVmb3JlIGl0LCBzbyBhIGRpc21pc3NlZCBkaWFsb2cgdGhhdCB3cm90ZSByZWxvYWRzIHRvby5cbiAgICAgICAgaWYgKHJlc3VsdD8uYWN0aW9uID09PSAnc2F2ZWQnIHx8IHNldHRpbmdzLndyb3RlKCkpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb21wb25lbnQgc2V0dGluZ3Mg4oCUIHRpdGxlLCBleGFjdCBnZW9tZXRyeSwgYW5kIHRoZSBkaWFnbm9zdGljIHZpZXdzXG4gIC8vIChTUUwsIGNvbmZpZywgZmlsdGVyIHdpcmluZykuXG4gIHB1YmxpYyBjb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCB8fCAhdGhpcy5fY2FudmFzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICAvLyBUaGUgZGlhbG9nIGdldHMgd2hhdCB0aGUgY29tcG9uZW50J3MgdGl0bGUgdG9rZW5zIGZpbGwgd2l0aCB3aGVyZSBpdCBpc1xuICAgIC8vIGRyYXduLCBmb3IgdGhlIHRpdGxlJ3MgSW5zZXJ0IGZpZWxkIG1lbnUgYW5kIHRoZSBsaW5lIHNheWluZyBob3cgaXQgcmVhZHMuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW48Q29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsIENvbXBvbmVudFNldHRpbmdzRGlhbG9nRGF0YSwgQ29tcG9uZW50U2V0dGluZ3NSZXN1bHQ+KFxuICAgICAgQ29tcG9uZW50U2V0dGluZ3NDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGRhdGE6IHsgcmVwb3J0LCBjb21wb25lbnQsIHRva2VuczogdGhpcy5fY2FudmFzLmNvbXBvbmVudFRva2Vucyhjb21wb25lbnQpIH0sXG4gICAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gRmlsdGVyIGFkZC9yZW1vdmUvbGV2ZWwgY2hhbmdlcyBwZXJzaXN0IGltbWVkaWF0ZWx5IGluc2lkZSB0aGUgZGlhbG9nIChub1xuICAgIC8vIFwic2F2ZVwiKSBhbmQgY2FuIGxlYXZlIGl0IGJ5IGFuIGV4aXQgdGhhdCBjYXJyaWVzIG5vIHJlc3VsdCwgc28gdGhleSBhcmVcbiAgICAvLyBhbm5vdW5jZWQgYXMgdGhleSBsYW5kLiBUaGUgcmVsb2FkIHdhaXRzIGZvciB0aGUgY2xvc2Ugc28gdGhlIGNhbnZhcyBpc24ndFxuICAgIC8vIHJlLXJlbmRlcmluZyB1bmRlcm5lYXRoIGFuIG9wZW4gZGlhbG9nLlxuICAgIGxldCBmaWx0ZXJzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5maWx0ZXJzQ2hhbmdlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gZmlsdGVyc0NoYW5nZWQgPSB0cnVlKTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gVGhlIGRpYWxvZyBjb25maXJtcyArIHBlcmZvcm1zIHRoZSBkZWxldGUgaXRzZWxmLiBUaGUgY29tcG9uZW50IGlzXG4gICAgICAgIC8vIGdvbmUgZnJvbSB0aGUgcmVwb3J0LCBzbyByZWxvYWQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgaXQgb3V0IGxvY2FsbHkg4oCUXG4gICAgICAgIC8vIGl0cyBmaWx0ZXJzIHdlbnQgd2l0aCBpdCwgd2hpY2ggdGhlIHJlcG9ydCBiYXIgaGFzIHRvIGJlIHJlYnVpbHQgZm9yLlxuICAgICAgICBpZiAocmVzdWx0Py5kZWxldGVkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVwb3J0J3MgZmlsdGVyIGdyb3VwcyBjaGFuZ2VkLCBzbyB0aGUgcmVwb3J0IGJhciBhbmQgdGhlXG4gICAgICAgIC8vIG9uLWNvbXBvbmVudCBzdHJpcHMgaGF2ZSB0byBiZSByZWJ1aWx0IGZyb20gYSBmcmVzaCByZXBvcnQuXG4gICAgICAgIGlmIChmaWx0ZXJzQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90aGluZyBlbHNlIGluIHRoZSBkaWFsb2cgdG91Y2hlcyB0aGUgcXVlcnkg4oCUIHRpdGxlIGFuZCBwYWRkaW5nIGFyZVxuICAgICAgICAvLyBwcmVzZW50YXRpb24uIFJlcGFpbnQgdGhlIG9uZSBjb21wb25lbnQgaXQgd2FzIG9wZW5lZCBmb3IgYW5kIGxlYXZlXG4gICAgICAgIC8vIGV2ZXJ5IG90aGVyIGNvbXBvbmVudCdzIGRhdGEsIGFuZCBpdHMgcXVlcnksIGFsb25lLlxuICAgICAgICBpZiAocmVzdWx0Py5zZXR0aW5ncykge1xuICAgICAgICAgIHRoaXMuX2NhbnZhcz8uYXBwbHlDb21wb25lbnRTZXR0aW5ncyhjb21wb25lbnQuaWQsIHJlc3VsdC5zZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGNhbnZhcyBtb3ZlZCB0byBhbm90aGVyIHBhZ2UuIFRoZSByZXBvcnQtbGV2ZWwgZmlsdGVycyBzdGF5IGFzIHRoZXlcbiAgLy8gYXJlICh0aGV5IGxpdmUgaW4gdGhlIHN0YXRlIHNlcnZpY2UpLCBhbmQgdGhlIFVSTCBpcyBsZWZ0IGFsb25lLlxuICBwdWJsaWMgb25DYW52YXNQYWdlQ2hhbmdlZChwYWdlSWQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBUaGUgYXNrZWQtZm9yIHBhZ2UgaGFzIGJlZW4gY29uc3VtZWQ7IGZyb20gaGVyZSB0aGUgY2FudmFzIG93bnMgdGhlIHBhZ2UuXG4gICAgdGhpcy5wYWdlSWQuc2V0KG51bGwpO1xuICAgIHRoaXMuY2hhdFBhZ2VJZC5zZXQocGFnZUlkKTtcbiAgICAvLyBUaGUgb3BlbiBwYWdlIGlzIHBhcnQgb2YgdGhlIHN0YXRlIHRoZSB0aWxlcyBhbmQgZXhwb3J0cyByZWFkLlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFBhZ2UocGFnZUlkKTtcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZUlkKTtcblxuICAgIC8vIFRoZSBiYXIgc2hvd3MgdGhlIHBhZ2UgZ3JvdXBzIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbiAgICBpZiAoaGFzUGFnZUdyb3VwKHRoaXMucmVwb3J0KCkpKSB7XG4gICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgY2hhbmdlZCB0aGUgcmVwb3J0J3Mgc3RydWN0dXJlIChhZGRlZCBhIHBhZ2UpIOKAlCByZS1mZXRjaCBzbyB0aGVcbiAgLy8gbmV3IHBhZ2UgcmVuZGVyczsgdGhlIGNhbnZhcyBsYW5kcyB0aGUgdmlldyBvbiBpdC5cbiAgcHVibGljIG9uQ2FudmFzUmVwb3J0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0LmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBFeHBvcnQgdGhlIHJlcG9ydCB0byBQb3dlclBvaW50LCBlbnRpcmVseSBjbGllbnQtc2lkZSAobmF0aXZlIGVkaXRhYmxlXG4gIC8vIGNoYXJ0czsgcGFnZSA9IHNsaWRlKS4gVGhlIGRvY2sgc2hvd3MgcHJvZ3Jlc3MgdW50aWwgdGhlIGZpbGUgc2F2ZXMuXG4gIHB1YmxpYyBleHBvcnRQb3dlcnBvaW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdFeHBvcnRpbmcgUG93ZXJQb2ludCcsXG4gICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLnBvd2VycG9pbnQocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gRXhwb3J0IHRvIFBERiwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG9mZnNjcmVlbiBFQ2hhcnRzIGF0IDPDlzsgcGFnZSA9IFBERiBwYWdlKS5cbiAgcHVibGljIGV4cG9ydFBkZigpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBERicsXG4gICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLnBkZihyZXBvcnQpLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgd2hvbGUgcmVwb3J0IGFzIGZpbGVzIGluIG9uZSBhY3Rpb246IHRoZSBzZXJ2ZXIgd3JpdGVzIG9uZSBDU1YgcGVyXG4gIC8vIGNvbXBvbmVudCwgZWFjaCB3aGF0IHRoZSBzY3JlZW4gc2hvd3MgKGEgY2hhcnQgb3IgS1BJIGFzIGRyYXduLCBhdCB0aGVcbiAgLy8gdmlld2VyJ3MgZ3JvdXAtYnkgZ3JhaW47IGEgbGlzdCBpbiBmdWxsKSwgYW5kIHppcHMgdGhlbSBmb2xkZXJlZCBieSBwYWdlXG4gIC8vIHdpdGggYW4gRXhwb3J0IE5vdGVzLnR4dCB0aGF0IHJlY29yZHMgdGhlIGZpbHRlcnMgYXMgdGhlIGJhciByZWFkcyB0aGVtLlxuICAvLyBFYWNoIGZpbGUgY2FycmllcyBpdHMgdGlsZSdzIG93biBzdGF0ZSAoemlwRXhwb3J0U3RhdGVzKTogYSBsaXN0J3Mgc29ydCxcbiAgLy8gc2VhcmNoIGFuZCBoaWRkZW4gY29sdW1ucywgYSBjaGFydCdzIGRyaWxsIHBhdGggYW5kIHRoZSBncm91cHMgdGhhdCBtYXRjaFxuICAvLyAnYW55JzsgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCByZWFkIGl0IHVzZXMgZWFjaCBsaXN0J3Mgc2F2ZWQgc29ydC4gVGhlXG4gIC8vIG5vdGVzIGdldCB0aGUgZmlsdGVyIGxpbmVzIGFzIHRoZSBjb3ZlciB3b3JkcyB0aGVtIChleHBvcnRMaW5lczsgYSBUaGlzXG4gIC8vIFBhZ2UgemlwIG5hbWVzIG9ubHkgdGhlIGdyb3VwcyB0aGF0IHJlYWNoIHRoZSBwYWdlKSwgYW5kIGVhY2ggZmlsZSBpc1xuICAvLyBuYW1lZCBhZnRlciBpdHMgdGlsZSdzIHRpdGxlIGFzIHRoZSBjYW52YXMgaGVhZGVyIHJlYWRzIGl0ICh0aXRsZXMpLiBBbGxcbiAgLy8gb2YgaXQgaXMgcmVhZCBvbmNlLCB3aGVuIHRoZSBleHBvcnQgc3RhcnRzIChleHBvcnRXb3JkaW5nKS4gYHRoaXNQYWdlYFxuICAvLyBuYXJyb3dzIGl0IHRvIHRoZSBwYWdlIHRoZSBjYW52YXMgaXMgc2hvd2luZy4gVW5saWtlIHRoZSBQREYvUG93ZXJQb2ludFxuICAvLyBleHBvcnRzIHRoZSBmaWxlcyBhcmUgd3JpdHRlbiBzZXJ2ZXItc2lkZSwgc28gdGhleSBhcmUgbm90IGNhcHBlZCBieVxuICAvLyB3aGF0IGEgc2xpZGUgY2FuIGhvbGQuXG4gIHB1YmxpYyBleHBvcnREYXRhKHRoaXNQYWdlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUlkID0gdGhpc1BhZ2UgPyB0aGlzLl9jYW52YXM/LmFjdGl2ZVBhZ2U/LmlkID8/IG51bGwgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yUmVwb3J0KHJlcG9ydCwgcGFnZUlkKTtcbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2NvbGxlY3Rvci5zbmFwc2hvdChyZXBvcnQpO1xuICAgIGNvbnN0IHN0YXRlcyA9IHppcEV4cG9ydFN0YXRlcyhyZXBvcnQsIHNuYXBzaG90LnN0YXRlLCBwYWdlSWQpO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgICdFeHBvcnRpbmcgZGF0YScsXG4gICAgICB0aGlzLl9jb2xsZWN0b3IuZXhwb3J0V29yZGluZyhyZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoeyBsaW5lcywgdGl0bGVzIH0pID0+IHRoaXMuX3JlcG9ydERhdGEuZXhwb3J0UmVwb3J0KFxuICAgICAgICAgICAgcmVwb3J0LmlkLFxuICAgICAgICAgICAgZmlsdGVycyxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIGZyZXF1ZW5jeSxcbiAgICAgICAgICAgIGxpbmVzLFxuICAgICAgICAgICAgc3RhdGVzLFxuICAgICAgICAgICAgdGl0bGVzLFxuICAgICAgICAgICkpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBSZWFjdCB0byBlYWNoIGNoYXQgdHVybiAoZnMtY2hhdCBoYW5kbGVzIHRoZSByZXF1ZXN0ICsgcGVyc2lzdGVuY2UpOyB3ZVxuICAvLyBvbmx5IGNhcmUgYWJvdXQgdGhlIHJlcG9ydCBzaWRlIGVmZmVjdHMgdGhpcyBjb250ZXh0J3MgYmFja2VuZCBmbGFncy5cbiAgcHVibGljIG9uQ2hhdFJlc3BvbnNlKHJlc3BvbnNlOiBGc0FpQ2hhdFJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XG4gICAgaWYgKHJlcG9ydElkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRSZXNwb25zZSA9IHJlc3BvbnNlIGFzIEZzQWlDaGF0UmVzcG9uc2UgJiBSZXBvcnRDaGF0UmVzcG9uc2U7XG5cbiAgICAvLyBBIHN0cnVjdHVyYWwgY2hhbmdlIG9yIGEgcmVuYW1lIGJvdGggcmUtZmV0Y2ggdGhlIHJlcG9ydCAoc2Vzc2lvbiBmaWx0ZXJcbiAgICAvLyB2YWx1ZXMgc3Vydml2ZSk7IGEgcmVuYW1lIGFkZGl0aW9uYWxseSBub3RpZmllcyB0aGUgaG9zdCBzbyBpdCBjYW5cbiAgICAvLyByZWZyZXNoIGEgYnJlYWRjcnVtYiAvIHRpdGxlLlxuICAgIGlmIChyZXBvcnRSZXNwb25zZS5yZXBvcnRDaGFuZ2VkIHx8IHJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpIHtcbiAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQsICEhcmVwb3J0UmVzcG9uc2UucmVwb3J0UmVuYW1lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhZyB0aGUgZGl2aWRlciBiZXR3ZWVuIHRoZSBjaGF0IGFuZCBjYW52YXMgcGFuZXMgKHBvaW50ZXItY2FwdHVyZSBsb29wXG4gIC8vIG91dHNpZGUgQW5ndWxhcikuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgaGFuZGxlID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGhhbmRsZS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcblxuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgY29uc3QgbW92ZSA9IChlOiBQb2ludGVyRXZlbnQpID0+IHRoaXMuX3Jlc2l6ZVRvKGUuY2xpZW50WCk7XG4gICAgICBjb25zdCBlbmQgPSAoKSA9PiB7XG4gICAgICAgIGhhbmRsZS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgICAgIHRoaXMuX3NwbGl0Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIGVuZCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaGF0IHRoZSB2aWV3ZXIgaGFzIG9uIHNjcmVlbiBhcyBhIGNoYXQgdHVybiBzZW5kcyBpdC4gVGhlIGNhbnZhc1xuICAvLyBzZWxlY3Rpb24gY291bnRzIG9ubHkgaW4gZWRpdCBtb2RlOiBpdCBpcyBkcmF3biBvbmx5IHRoZW4sIGFuZCBpdCBpcyBrZXB0XG4gIC8vIChub3QgY2xlYXJlZCkgd2hlbiBlZGl0IG1vZGUgaXMgbGVmdC4gVGhlIG1hdGNoIGlzIHNlbnQgb25seSB3aGlsZSBpdCBpc1xuICAvLyAnYW55JywgYW5kIHRoZSBkcmlsbGVkIGNoYXJ0cyBvbmx5IHdoZW4gb25lIGlzIGRyaWxsZWQuXG4gIHByaXZhdGUgX2NoYXRWaWV3ZXJTdGF0ZSgpOiBSZXBvcnRDaGF0Vmlld2VyU3RhdGUge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fZmlsdGVyU3RhdGUuc25hcHNob3QoKTtcbiAgICBjb25zdCBkcmlsbHMgPSBjaGF0Vmlld2VyRHJpbGxzKHNuYXBzaG90LCB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkubG9jYWxlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBncmFudWxhcml0eTogdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCksXG4gICAgICBzZWxlY3RlZENvbXBvbmVudElkOiB0aGlzLmVkaXRNb2RlKCkgPyB0aGlzLl9jYW52YXM/LnNlbGVjdGVkQ29tcG9uZW50SWQoKSA/PyBudWxsIDogbnVsbCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuX2ZpbHRlclN0YXRlLnZpZXdlckZpbHRlcnMoKSxcbiAgICAgIC4uLmNoYXRWaWV3ZXJNYXRjaChzbmFwc2hvdCksXG4gICAgICAuLi4oZHJpbGxzLmxlbmd0aCA/IHsgZHJpbGxzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2UgaWQgdGhlIFVSTCBob2xkcyByaWdodCBub3cgKD9wYWdlPSwgcmVhZCBvbmx5KSwgb3IgbnVsbCB3aGVuIHRoZVxuICAvLyBwYWdlIHBhcmFtIGlzIG9mZiBvciB0aGUgdmFsdWUgaXMgbm90IGEgdXNhYmxlIGlkLlxuICBwcml2YXRlIF9wYWdlSWRGcm9tVXJsKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xuICAgIGlmICghcGFyYW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IE51bWJlcih0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChwYXJhbSkpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYWdlSWQpICYmIHBhZ2VJZCA+IDAgPyBwYWdlSWQgOiBudWxsO1xuICB9XG5cbiAgLy8gRXZlcnkgbG9hZCBzZXRzIHRoZSB2aWV3ZXIgc3RhdGUgdXAgZm9yIHRoZSByZXBvcnQgKGluaXQpOiBpdHMgZmlyc3RcbiAgLy8gbG9hZCBvcGVucyBpdCBvbiBpdHMgYXV0aG9yZWQgZGVmYXVsdHMsIGFuZCBhIGxhdGVyIG9uZSAoYSBjaGF0IGVkaXQsIGFcbiAgLy8gc2V0dGluZ3Mgc2F2ZSkga2VlcHMgdGhlIHN0YXRlIGluIG1lbW9yeS5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXBvcnQ6IFJlcG9ydCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICAgICAgaWYgKGVtaXRSZW5hbWVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5hbWVkLmVtaXQocmVwb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZXBvcnQtbGV2ZWwgZmlsdGVyIGdyb3VwcyBpbiB0aGVpciBzYXZlZCBvcmRlciDigJQgdGhlIG9uZXMgdGhhdCByZW5kZXIgaW5cbiAgLy8gdGhlIHRvb2xiYXIgKGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIG9uIHRoZWlyIGNvbXBvbmVudHMpLCB3aXRoXG4gIC8vIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4uXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gcmVwb3J0QmFyR3JvdXBzKHRoaXMucmVwb3J0KCksIHRoaXMuY2hhdFBhZ2VJZCgpKTtcbiAgfVxuXG4gIC8vIChSZSlidWlsZCB0aGUgdG9vbGJhciBmcy1maWx0ZXIgY29uZmlnIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBpdGVtcyBhbmRcbiAgLy8gdGhlbiB0aGUgZ3JvdXAtYnkgY29udHJvbC5cbiAgcHJpdmF0ZSBfYnVpbGRSZXBvcnRDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydD8uaWQgPz8gbnVsbDtcblxuICAgIC8vIERyb3AgYSBncmFpbiB0aGUgY29udHJvbCBubyBsb25nZXIgb2ZmZXJzIOKAlCB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdFxuICAgIC8vIG1pZC1zZXNzaW9uLCBhbmQgYW4gb3ZlcnJpZGUgdGhlIHZpZXdlciBjYW4ndCBzZWUgaXMgd29yc2UgdGhhbiBub25lLlxuICAgIGlmIChyZXBvcnQgJiYgIWlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3kobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVhdHVyZXMgPSByZXBvcnQ/LnZpZXdlckZlYXR1cmVzID8/IFtdO1xuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcbiAgICAgID8gdGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9maWx0ZXJPcHRpb25zLCByZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSwgZmVhdHVyZXMpKVxuICAgICAgOiBbXTtcblxuICAgIC8vIFRoZSBncm91cC1ieSBjb250cm9sIGxlYWRzIHRoZSBiYXIsIGFoZWFkIG9mIGV2ZXJ5IGZpbHRlcjogaXQgc2V0cyB0aGVcbiAgICAvLyBncmFpbiB0aGUgd2hvbGUgcmVwb3J0IGlzIHJlYWQgYXQsIHNvIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBhIHZpZXdlclxuICAgIC8vIGRlY2lkZXMuIEl0IGlzIG5vdCBhIGZpbHRlciBncm91cCDigJQgaXQgcmUtYnVja2V0cyByb3dzIHJhdGhlciB0aGFuXG4gICAgLy8gbmFycm93aW5nIHRoZW0g4oCUIHNvIGl0IGlzIHBsYWNlZCBoZXJlIHJhdGhlciB0aGFuIG9yZGVyZWQgYW1vbmcgdGhlbS5cbiAgICBjb25zdCBncm91cEJ5SXRlbSA9IHRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gICAgaWYgKGdyb3VwQnlJdGVtKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KGdyb3VwQnlJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lIGNsb3NlcyB0aGUgYmFyLlxuICAgIGNvbnN0IG1hdGNoSXRlbSA9IHRoaXMuX21hdGNoSXRlbSgpO1xuICAgIGlmIChtYXRjaEl0ZW0pIHtcbiAgICAgIGl0ZW1zLnB1c2gobWF0Y2hJdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlZEZpbHRlcnMgPSB0aGlzLl9zYXZlZEZpbHRlcnNDb25maWcoKTtcblxuICAgIHRoaXMuX2JhclZlcnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKTtcbiAgICB0aGlzLnJlcG9ydEZpbHRlckNvbmZpZy5zZXQoe1xuICAgICAgLy8gZnMtZmlsdGVyIG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBmaWx0ZXIgc3RhdGU6IGEgcmVwb3J0XG4gICAgICAvLyBrZWVwcyBubyBzdGF0ZSBpbiB0aGUgVVJMLiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Ugb3ducyB0aGUgdmFsdWVzLlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBzYXZlZEZpbHRlcnMgPyB0aGlzLl9rZWVwT25QaWNrKGl0ZW1zKSA6IGl0ZW1zLFxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHRoaXMuX2JhckNoYW5nZWQocXVlcnkgPz8ge30sICEhbWF0Y2hJdGVtKSxcbiAgICAgIC8vICdDbGVhciBmaWx0ZXJzJyBwdXRzIHRoZSBzY3JlZW4gYmFjayBvbiB0aGUgcmVwb3J0J3MgYXV0aG9yZWRcbiAgICAgIC8vIGRlZmF1bHRzIGFuZCBkcm9wcyB0aGUgdGVtcG9yYXJ5IGxheWVyLiBmcy1maWx0ZXIgcmVwb3J0cyBpdHMgb3duXG4gICAgICAvLyBjbGVhcmVkIGl0ZW1zIChjaGFuZ2UpIGp1c3QgYmVmb3JlIHRoaXMsIHNvIHRoZSByZXNldCB3aW5zLlxuICAgICAgY2xlYXI6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc2V0VG9EZWZhdWx0cygpLFxuICAgICAgLy8gVGhlIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB3aGF0IGEgY2xlYXJcbiAgICAgIC8vIHJldHVybnMgdG8gKEM1KS5cbiAgICAgIGNsZWFyVmlzaWJsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZGlmZmVyc0Zyb21EZWZhdWx0cygpLFxuICAgICAgc2F2ZWRGaWx0ZXJzLFxuICAgICAgLy8gZnMtZmlsdGVyIGNhbGxzIGluaXQgb25jZSBpdHMgc2F2ZWQgZmlsdGVycyBhcmUgbG9hZGVkLlxuICAgICAgLi4uKHNhdmVkRmlsdGVycyAmJiByZXBvcnRJZCA/IHsgaW5pdDogKCkgPT4gdGhpcy5fb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZCkgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0IG9wZW5zIG9uIGl0cyBmaXJzdCBzYXZlZCBmaWx0ZXI6IG9uY2UgaXRzIHNhdmVkIGZpbHRlcnMgYXJlXG4gIC8vIGZpcnN0IGxvYWRlZCwgdGhlIGZpcnN0IG9uZSBpcyBwaWNrZWQgYXMgYSB2aWV3ZXIgd291bGQgcGljayBpdCwgc28gaXRcbiAgLy8gYXBwbGllcyBvbiBldmVyeSBwYWdlIHRocm91Z2ggdGhlIHNhbWUgY2hhbmdlIChfYmFyQ2hhbmdlZCkuIE9uY2UgcGVyXG4gIC8vIHJlcG9ydCBvcGVuZWQ6IHRoZSBiYXIgaXMgcmVjcmVhdGVkIGFzIHRoZSBzY3JlZW4gY2hhbmdlcywgYW5kIGEgbGF0ZXJcbiAgLy8gYnVpbGQgbXVzdCBub3QgcGljayBpdCBhZ2FpbiBvdmVyIHRoZSB2aWV3ZXIncyBvd24gZWRpdHMuIFJlb3JkZXJpbmcgdGhlXG4gIC8vIHNhdmVkIGZpbHRlcnMgY2hhbmdlcyB3aGljaCBvbmUgYSByZXBvcnQgb3BlbnMgb24sIGZvciBldmVyeW9uZS5cbiAgcHJpdmF0ZSBfb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2F2ZWRGaWx0ZXJDb250cm9sbGVyID0gdGhpcy5fcmVwb3J0QmFyPy5zYXZlZEZpbHRlckNvbnRyb2xsZXI7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID09PSByZXBvcnRJZCB8fCAhc2F2ZWRGaWx0ZXJDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICBjb25zdCBbZmlyc3RdID0gc2F2ZWRGaWx0ZXJDb250cm9sbGVyLnNhdmVkRmlsdGVycztcbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIHNhdmVkRmlsdGVyQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoZmlyc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBiYXIncyBzYXZlZCBmaWx0ZXJzLCBzaGFyZWQgYnkgZXZlcnlvbmUgd2hvIG1heSBvcGVuIHRoZSByZXBvcnQsIG9yXG4gIC8vIHVuZGVmaW5lZCB3aGVuIHRoZSBiYXIgaGFzIG5vbmUgdG8gb2ZmZXI6IGEgcmVwb3J0IG5vdCB5ZXQgc2F2ZWQgaGFzIG5vXG4gIC8vIGlkIHRvIGtlZXAgdGhlbSB1bmRlciwgYW5kIGEgYmFyIHdpdGggbm8gcmVwb3J0LXdpZGUgZmlsdGVyIGhhcyBub3RoaW5nXG4gIC8vIGEgc2F2ZWQgZmlsdGVyIGhvbGRzLiBmcy1maWx0ZXIncyBvd24gU2F2ZWQgZmlsdGVycyBtZW51IGxpc3RzIHRoZW0sXG4gIC8vIHNhdmVzIHRoZSBiYXIncyB2YWx1ZXMgYXMgYSBuZXcgb25lIG9yIG92ZXIgdGhlIHBpY2tlZCBvbmUsIG9yZGVycyBhbmRcbiAgLy8gZGVsZXRlcyB0aGVtLiBXaGF0IGl0IHNhdmVzIGlzIGtlcHQgdG8gdGhlIHJlcG9ydC13aWRlIGZpbHRlcnNcbiAgLy8gKHNhdmVkRmlsdGVyVmFsdWVzKTogYSBwYWdlJ3Mgb3duIGZpbHRlcnMsIHRoZSBncmFpbiBhbmQgdGhlIG1hdGNoIGFyZVxuICAvLyBsZWZ0IG91dC4gVGhlIGxpc3QgaXMgcmVhZCBldmVyeSB0aW1lIHRoZSBiYXIgaXMgYnVpbHQ7IG9uZSB0aGF0IGNhbm5vdFxuICAvLyBiZSByZWFkIHNob3dzIGFzIGVtcHR5IHJhdGhlciB0aGFuIGtlZXBpbmcgdGhlIGJhciBmcm9tIGRyYXdpbmcuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyc0NvbmZpZygpOiBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0KCk/LmlkID8/IG51bGw7XG5cbiAgICBpZiAoIXJlcG9ydElkIHx8ICFzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLl9yZXBvcnRHcm91cHMoKSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb2FkOiAoKSA9PiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAgIC5zYXZlZEZpbHRlcnMocmVwb3J0SWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgUmVwb3J0U2F2ZWRGaWx0ZXJbXSkpLFxuICAgICAgICAgIG1hcCgoc2F2ZWRGaWx0ZXJzKSA9PiAoc2F2ZWRGaWx0ZXJzID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSxcbiAgICAgICAgKSxcbiAgICAgIHNhdmU6IChzYXZlZEZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzID0gc2F2ZWRGaWx0ZXJWYWx1ZXMoc2F2ZWRGaWx0ZXIuZmlsdGVycywgdGhpcy5fc2F2ZWRGaWx0ZXJHcm91cHMoKSk7XG4gICAgICAgIGNvbnN0IHNhdmUkID0gc2F2ZWRGaWx0ZXIuaWRcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCksIHtcbiAgICAgICAgICAgIC4uLihzYXZlZEZpbHRlci5uYW1lID8geyBuYW1lOiBzYXZlZEZpbHRlci5uYW1lIH0gOiB7fSksXG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVNhdmVkRmlsdGVyKHJlcG9ydElkLCB7IG5hbWU6IHNhdmVkRmlsdGVyLm5hbWUgPz8gJycsIGZpbHRlcnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNhdmUkLnBpcGUobWFwKChzYXZlZCkgPT4gdGhpcy5fYmFyU2F2ZWRGaWx0ZXIoc2F2ZWQpKSk7XG4gICAgICB9LFxuICAgICAgb3JkZXI6IChzYXZlZEZpbHRlcnMpID0+IHRoaXMuX3JlcG9ydERhdGFcbiAgICAgICAgLnNhdmVTYXZlZEZpbHRlclBvc2l0aW9ucyhyZXBvcnRJZCwgc2F2ZWRGaWx0ZXJzLm1hcCgoc2F2ZWRGaWx0ZXIpID0+IE51bWJlcihzYXZlZEZpbHRlci5pZCkpKVxuICAgICAgICAucGlwZShtYXAoKG9yZGVyZWQpID0+IChvcmRlcmVkID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSksXG4gICAgICBkZWxldGU6IChzYXZlZEZpbHRlcikgPT4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgICAuZGVsZXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCkpXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBzYXZlZEZpbHRlcikpLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgcmVwb3J0LXdpZGUgZmlsdGVyIGdyb3VwczogdGhlIG9uZXMgYSBzYXZlZCBmaWx0ZXIgaG9sZHMuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyR3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiBzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLnJlcG9ydCgpPy5maWx0ZXJHcm91cHMpO1xuICB9XG5cbiAgLy8gQSBzYXZlZCBmaWx0ZXIgYXMgdGhlIGJhcidzIG1lbnUgaG9sZHMgaXQuIEl0cyB2YWx1ZXMgYXJlIGtlcHQgdG8gdGhlXG4gIC8vIHJlcG9ydC13aWRlIGZpbHRlcnMgdGhlIHJlcG9ydCBoYXMgbm93IChhIGtleSBpdCBubyBsb25nZXIgaGFzLCBvciBhXG4gIC8vIHZhbHVlIGl0cyBmaWx0ZXIgY2FuIG5vIGxvbmdlciB0YWtlLCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGFwcGxpZWQpLCBhbmRcbiAgLy8gZWFjaCByZWFkIG9mIHRoZW0gaGFuZHMgb3V0IGEgY29weSwgc28gbm90aGluZyB0aGUgYmFyIGRvZXMgdG8gdGhlIHZhbHVlc1xuICAvLyBpdCBzZXQgY2hhbmdlcyB0aGUgc2F2ZWQgZmlsdGVyLiBBIHJlYWQgYWxzbyBub3RlcyB0aGUgYmFyJ3MgdmFsdWVzXG4gIC8vIChfa2VlcEJhck9uUGljayk6IHBpY2tpbmcgYSBzYXZlZCBmaWx0ZXIgcmVhZHMgaXRzIHZhbHVlcyBhbmQgc2V0cyB0aGVcbiAgLy8gYmFyIGZyb20gdGhlbSBpbiBvbmUgZ28sIGFuZCB0aGUgaXRlbXMgaXQgZG9lcyBub3QgaG9sZCBhcmUgcHV0IGJhY2suXG4gIHByaXZhdGUgX2JhclNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyOiBSZXBvcnRTYXZlZEZpbHRlcik6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVycyA9IHNhdmVkRmlsdGVyVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMsIHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkpO1xuICAgIGNvbnN0IGtlZXBCYXIgPSAoKSA9PiB0aGlzLl9rZWVwQmFyT25QaWNrKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNhdmVkRmlsdGVyLmlkLFxuICAgICAgbmFtZTogc2F2ZWRGaWx0ZXIubmFtZSxcbiAgICAgIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICBrZWVwQmFyKCk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm90ZXMgdGhlIGJhcidzIHZhbHVlcyBmb3IgYSBwaWNrIG9mIGEgc2F2ZWQgZmlsdGVyIChfYmFyVmFsdWVzQXRQaWNrKS5cbiAgLy8gZnMtZmlsdGVyIHNldHMgdGhlIGJhciBmcm9tIHRoZSBzYXZlZCBmaWx0ZXIncyB2YWx1ZXMgaW4gdGhlIHNhbWUgdGFza1xuICAvLyBhcyBpdCByZWFkcyB0aGVtLCBzbyB0aGUgbm90ZSBpcyBkcm9wcGVkIG9uY2UgdGhpcyB0YXNrIGlzIGRvbmU6IGFueVxuICAvLyBvdGhlciByZWFkIG9mIGEgc2F2ZWQgZmlsdGVyJ3MgdmFsdWVzIChpdHMgcm93IGluIFZpZXcgYWxsLCBhIHNhdmUpIHNldHNcbiAgLy8gbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcEJhck9uUGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlcG9ydEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2JhclZhbHVlc0F0UGljayA9IHsgLi4udGhpcy5fcmVwb3J0QmFyLnZhbHVlcyB9O1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX2JhclZhbHVlc0F0UGljayA9IG51bGwpO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIGl0ZW1zLCBlYWNoIG9uZSBhIHNhdmVkIGZpbHRlciBkb2VzIG5vdCBob2xkICh0aGUgZ3JvdXAtYnlcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgYSBwYWdlJ3Mgb3duIGZpbHRlcnMpIHNldCBiYWNrIHRvIGl0cyB2YWx1ZSB3aGVuIGEgcGlja1xuICAvLyBvZiBhIHNhdmVkIGZpbHRlciBzZXRzIGl0LiBmcy1maWx0ZXIgc2V0cyBldmVyeSBpdGVtIGZyb20gYSBzYXZlZCBmaWx0ZXJcbiAgLy8gYW5kIGNhbGxzIGVhY2ggb25lJ3MgY2hhbmdlIGJlZm9yZSBpdCByZXBvcnRzIHRoZSBiYXIncyBjaGFuZ2UsIHNvIHRoZVxuICAvLyBjaGFuZ2UgdGhlIGJhciByZXBvcnRzIGNhcnJpZXMgdGhlc2UgaXRlbXMgYXMgdGhleSB3ZXJlOiB0aGUgcGljayBtb3Zlc1xuICAvLyB0aGUgcmVwb3J0LXdpZGUgZmlsdGVycyBvbmx5LCBvbiBldmVyeSBwYWdlLCB0aHJvdWdoIHRoZSBzYW1lIGNoYW5nZSBhc1xuICAvLyBhIHZpZXdlcidzIG93biBlZGl0IChfYmFyQ2hhbmdlZCkuIE9uIGFueSBvdGhlciBjaGFuZ2UgYW4gaXRlbSdzIGNoYW5nZVxuICAvLyBjb21lcyBhZnRlciB0aGUgYmFyJ3MsIHdpdGggbm8gcGljayBub3RlZCwgYW5kIGRvZXMgbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcE9uUGljayhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSk6IElGaWx0ZXJDb25maWdJdGVtW10ge1xuICAgIGNvbnN0IGhlbGQgPSBuZXcgU2V0KHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkubWFwKChncm91cCkgPT4gZ3JvdXBJdGVtTmFtZShncm91cCkpKTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IChoZWxkLmhhcyhpdGVtLm5hbWUpXG4gICAgICA/IGl0ZW1cbiAgICAgIDogeyAuLi5pdGVtLCBjaGFuZ2U6IChiYXJJdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4pID0+IHRoaXMuX2tlZXBJdGVtT25QaWNrKGJhckl0ZW0pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBJdGVtT25QaWNrKGl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9iYXJWYWx1ZXNBdFBpY2spIHtcbiAgICAgIGl0ZW0uc2V0VmFsdWUodGhpcy5fYmFyVmFsdWVzQXRQaWNrW2l0ZW0ubmFtZV0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgdmFsdWVzIGludG8gdGhlIHN0YXRlOiBldmVyeSBncm91cCBpdCBzaG93cywgdGhlIGdyYWluIGFuZCxcbiAgLy8gd2hlbiB0aGUgYmFyIGhhcyB0aGUgY29udHJvbCwgdGhlIG1hdGNoLlxuICBwcml2YXRlIF9iYXJDaGFuZ2VkKHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaGFzTWF0Y2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXBJZCwgdmFsdWUgfSBvZiBncm91cFZhbHVlc0Zyb21RdWVyeShxdWVyeSwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8vIE5vdCBhIGZpbHRlciBncm91cCDigJQgdGhlIGdyYWluIGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBxdWVyeS5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3koKHF1ZXJ5W0dST1VQX0JZX0lURU1dIGFzIENoYXJ0R3JhbnVsYXJpdHkpIHx8IG51bGwpO1xuICAgIC8vIE5vciBpcyB0aGUgbWF0Y2g7IGEgYmFyIHdpdGhvdXQgdGhlIGNvbnRyb2wgbGVhdmVzIGl0IGFzIGl0IGlzLlxuICAgIGlmIChoYXNNYXRjaCkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TWF0Y2gobWF0Y2hGcm9tUXVlcnkocXVlcnkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBhcyBhbiBmcy1maWx0ZXIgaXRlbSwgb3IgbnVsbCB3aGVuIHRoZSByZXBvcnRcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUl0ZW0oKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbShyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIE1hdGNoIGNvbnRyb2wsIHNlZWRlZCB3aXRoIHRoZSBtYXRjaCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlblxuICAvLyB0aGUgYmFyIGhvbGRzIGZld2VyIHRoYW4gdHdvIGdyb3VwcyB0aGF0IGNvbWJpbmUuXG4gIHByaXZhdGUgX21hdGNoSXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIHJldHVybiBtYXRjaEZpbHRlckl0ZW0odGhpcy5yZXBvcnQoKSwgdGhpcy5fcmVwb3J0R3JvdXBzKCksIHRoaXMuY2hhdFBhZ2VJZCgpLCB0aGlzLl9maWx0ZXJTdGF0ZS5tYXRjaCgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydCBmcy1jb2x1bW5cIj5cblxuICA8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0X19oZWFkZXIgZnMtcm93LmFsaWduLWNlbnRlclwiPlxuICAgIDxoMiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdGl0bGUgZnMtZmxleFwiPnt7IHJlcG9ydCgpPy5uYW1lIH19PC9oMj5cblxuICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMsIHdpdGggdGhlXG4gICAgICAgICAgIHJlcG9ydCdzIHNhdmVkIGZpbHRlcnMgaW4gZnMtZmlsdGVyJ3Mgb3duIFNhdmVkIGZpbHRlcnMgbWVudS5cbiAgICAgICAgICAgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZVxuICAgICAgICAgICBmaWx0ZXIgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZVxuICAgICAgICAgICBibG9jayBpcyByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMoKSkge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleSgpXTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj5cbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdC5cbiAgICAgICAgICAgT25lIHN0eWxlIGZvciBhbGwgdGhyZWUg4oCUIG91dGxpbmVkLCBpY29uIGFuZCB0ZXh0LiBcIkhlYWRlciAmIGZvb3RlclwiXG4gICAgICAgICAgIGlzIGEgdG9nZ2xlOiBpdCBrZWVwcyBpdHMgbGFiZWwgYW5kIHR1cm5zIGdyYXkgd2hpbGUgaXQgaXMgb24uIC0tPlxuICAgICAgQGlmIChlZGl0TW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2VkaXQtdG9vbHMgZnMtcm93LmFsaWduLWNlbnRlci5nYXAteHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBhIGJsb2NrIG9mIHRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgQWRkIHRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX21hc3RlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNYXN0ZXJNb2RlID8gJ0JhY2sgdG8gZWRpdGluZyB0aGlzIHBhZ2UnIDogJ0VkaXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHNob3duIG9uIGV2ZXJ5IHBhZ2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICBIZWFkZXIgJiBmb290ZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gT25lIGljb24gZm9yIGJvdGggc3RhdGVzOiBpdCByZWFkcyBhcyBwcmVzc2VkIHdoaWxlIGVkaXRpbmcgcmF0aGVyXG4gICAgICAgICAgIHRoYW4gc3dhcHBpbmcgdG8gc29tZXRoaW5nIGVsc2UuIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X190b2dnbGVcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiZWRpdE1vZGUoKSA/ICdEb25lIGVkaXRpbmcnIDogJ0VkaXQgbGF5b3V0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmRhc2hib2FyZF9jdXN0b21pemU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0XCJcbiAgICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJleHBvcnRNZW51XCI+XG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxmcy1tZW51ICNleHBvcnRNZW51PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBvd2VycG9pbnQoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQb3dlclBvaW50XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UGRmKClcIj5cbiAgICAgICAgICBFeHBvcnQgUERGXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSgpXCI+XG4gICAgICAgICAgRXhwb3J0IFJhdyBEYXRhXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSlcIj5cbiAgICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YSAoVGhpcyBQYWdlKVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIH1cbiAgICAgIDwvZnMtbWVudT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZXBvcnQgc2V0dGluZ3NcIlxuICAgICAgICAgIChjbGljayk9XCJyZXBvcnRTZXR0aW5ncygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAgICNzcGxpdFxuICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3NwbGl0IGZzLXJvdy5hbGlnbi1zdGFydFwiPlxuICAgIDxmcy1haS1jaGF0XG4gICAgICAgICNjaGF0UGFuZWxcbiAgICAgICAgY2xhc3M9XCJjaGF0XCJcbiAgICAgICAgW2Jhc2VQYXRoXT1cImJhc2VQYXRoKClcIlxuICAgICAgICBbcmVxdWVzdERhdGFdPVwiY2hhdFJlcXVlc3REYXRhKClcIlxuICAgICAgICBbcmVhZHldPVwiY2hhdFBhZ2VJZCgpICE9PSBudWxsXCJcbiAgICAgICAgKHJlc3BvbnNlKT1cIm9uQ2hhdFJlc3BvbnNlKCRldmVudClcIj5cbiAgICA8L2ZzLWFpLWNoYXQ+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicmVzaXplclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3ZXIgZnMtZmxleCBmcy1jb2x1bW5cIj5cbiAgICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgICAgPGFwcC1yZXBvcnQtY2FudmFzXG4gICAgICAgICAgICBbcmVwb3J0XT1cInJlcG9ydCgpXCJcbiAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgICAgIFtwYWdlSWRdPVwicGFnZUlkKClcIlxuICAgICAgICAgICAgKGNvbXBvbmVudFNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzKCRldmVudClcIlxuICAgICAgICAgICAgKHJlcG9ydENoYW5nZWQpPVwib25DYW52YXNSZXBvcnRDaGFuZ2VkKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cIm9uQ2FudmFzUGFnZUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L2FwcC1yZXBvcnQtY2FudmFzPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
718
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnQvZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ3RHLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQ0ssZUFBZSxFQUFnQixjQUFjLEdBQ3hELE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxT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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLCBFbGVtZW50UmVmLCBOZ1pvbmUsIFZpZXdDaGlsZCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRGlzcGxheUFwaUVycm9yIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYXBpJztcbmltcG9ydCB7XG4gIEJhc2VJdGVtLCBGaWx0ZXJDb21wb25lbnQsIEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIElGaWx0ZXJDb25maWdJdGVtLCBJRmlsdGVyU2F2ZWRGaWx0ZXIsIElGaWx0ZXJTYXZlZEZpbHRlcnNDb25maWcsXG59IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzUHJvY2VzcyB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBwcm92aWRlRWNoYXJ0c0NvcmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IEZzQWlDaGF0Q29tcG9uZW50LCBGc0FpQ2hhdERhdGEsIEZzQWlDaGF0UmVzcG9uc2UgfSBmcm9tICdAZmlyZXN0aXRjaC9haSc7XG5cbmltcG9ydCB7IFJlcG9ydENhbnZhc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcmVwb3J0LWNhbnZhcy9yZXBvcnQtY2FudmFzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXBvcnRBaUNoYXREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQtYWktY2hhdC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0LFxufSBmcm9tICcuLi8uLi9kaWFsb2dzL2NvbXBvbmVudC1zZXR0aW5ncy9jb21wb25lbnQtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCBSZXBvcnRTZXR0aW5nc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvcmVwb3J0LXNldHRpbmdzL3JlcG9ydC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0Q29sbGVjdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2V4cG9ydC9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LWV4cG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXBkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcG9ydFBwdHhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXhwb3J0L3JlcG9ydC1wcHR4LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9leHBvcnQvcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlclN0YXRlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItc3RhdGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFNhdmVkRmlsdGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtc2F2ZWQtZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LCBSZXBvcnQsIFJlcG9ydENoYXRSZXNwb25zZSxcbiAgUmVwb3J0Q29tcG9uZW50IGFzIFJlcG9ydENvbXBvbmVudE1vZGVsLCBSZXBvcnRGaWx0ZXJHcm91cCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGNoYXRWaWV3ZXJEcmlsbHMsIGNoYXRWaWV3ZXJNYXRjaCwgY2hhdFZpZXdlclRpbGVzIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWNoYXQtdmlld2VyLXN0YXRlJztcbmltcG9ydCB7IHByb3ZpZGVSZXBvcnREYXRlUGlja2VyIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWRhdGUtcHJlc2V0cyc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwQnlGaWx0ZXJJdGVtLCBncm91cEJ5U2lnbmF0dXJlLCBncm91cEl0ZW1OYW1lLCBncm91cFZhbHVlc0Zyb21RdWVyeSxcbiAgaGFzUGFnZUdyb3VwLCBpc0dyYW51bGFyaXR5T2ZmZXJlZCwgbWF0Y2hGaWx0ZXJJdGVtLCBtYXRjaEZyb21RdWVyeSwgcmVwb3J0QmFyR3JvdXBzLFxufSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IHNhdmVkRmlsdGVyR3JvdXBzLCBzYXZlZEZpbHRlclZhbHVlcyB9IGZyb20gJy4uLy4uL3JlcG9ydC1zYXZlZC1maWx0ZXJzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLCBkZWZhdWx0U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IHppcEV4cG9ydFN0YXRlcyB9IGZyb20gJy4uLy4uL3RpbGUtZGF0YS1zdGF0ZSc7XG5cblxuLy8gQSBzaW5nbGUgcmVwb3J0OiB0aGUgQUkgY2hhdCBvbiB0aGUgbGVmdCwgdGhlIHJlcG9ydCBjYW52YXMgb24gdGhlIHJpZ2h0LFxuLy8gdW5kZXIgYW4gSDIgdGl0bGUgKyBzZXR0aW5ncyBnZWFyLiBUaGUgaG9zdCBzdXBwbGllcyBbcmVwb3J0SWRdIChmcm9tIGl0c1xuLy8gcm91dGUpIGFuZCBzd2l0Y2hlcyByZXBvcnRzIHRocm91Z2ggaXRzIG93biByb3V0ZXMg4oCUIHRoaXMgY29tcG9uZW50IG5ldmVyXG4vLyBwaWNrcyBvbmUuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZnMtYWktcmVwb3J0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG4gIHByb3ZpZGVyczogW1xuICAgIC8vIFNlc3Npb24gZmlsdGVyIHN0YXRlIGlzIHBlci1vcGVuLXJlcG9ydCwgbm90IGFwcC1nbG9iYWw7IHRoZSBleHBvcnRcbiAgICAvLyBzZXJ2aWNlcyByZXNvbHZlIGZpbHRlcnMgdGhyb3VnaCBpdCwgc28gdGhleSBsaXZlIGF0IHRoZSBzYW1lIGxldmVsLlxuICAgIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSxcbiAgICAvLyBUaGUgYmFycycgc2VsZWN0IGxpc3RzLCBuYXJyb3dlZCBieSB0aGUgb3RoZXIgZmlsdGVyczsgcGVyIG9wZW4gcmVwb3J0LlxuICAgIFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICAgIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2UsXG4gICAgUmVwb3J0UHB0eFNlcnZpY2UsXG4gICAgUmVwb3J0UGRmU2VydmljZSxcbiAgICBSZXBvcnRUZXh0TGF5b3V0U2VydmljZSxcbiAgICBSZXBvcnRFeHBvcnRTZXJ2aWNlLFxuICAgIC8vIGZzLWFpLWNoYXQgc2l0cyBpbiB0aGlzIHRlbXBsYXRlLCBzbyBpdCByZXNvbHZlcyBpdHMgZ2F0ZXdheSBoZXJlOiB0aGVcbiAgICAvLyByZXBvcnQgb25lLCB3aGljaCBhZGRzIHRoZSB2aWV3ZXIncyBzdGF0ZSB0byBlYWNoIHR1cm4gaXQgc2VuZHMuXG4gICAgUmVwb3J0QWlDaGF0RGF0YSxcbiAgICB7IHByb3ZpZGU6IEZzQWlDaGF0RGF0YSwgdXNlRXhpc3Rpbmc6IFJlcG9ydEFpQ2hhdERhdGEgfSxcbiAgICAvLyBUcmVlLXNoYWtlbiBFQ2hhcnRzIGNvcmUgKyB0aGUgJ3JlcG9ydCcgaG91c2UgdGhlbWUsIGxvYWRlZCBsYXppbHkuXG4gICAgcHJvdmlkZUVjaGFydHNDb3JlKHsgZWNoYXJ0czogKCkgPT4gaW1wb3J0KCcuLi8uLi90aGVtZS9lY2hhcnRzJykudGhlbigobW9kdWxlKSA9PiBtb2R1bGUuZGVmYXVsdCkgfSksXG4gICAgLy8gVGhlIGJhcidzIGRhdGUgcGlja2VycyBzdGFydCB0aGVpciB3ZWVrcyBvbiBNb25kYXkgYW5kIGxpc3QgdGhlIGJ1aWx0LWluXG4gICAgLy8gcHJlc2V0czsgYSBwcmVzZXQgb25seSBzZXRzIHRoZSBkYXlzLlxuICAgIHByb3ZpZGVSZXBvcnREYXRlUGlja2VyKCksXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgRnNBaUNoYXRDb21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBSZXBvcnRDYW52YXNDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzQWlSZXBvcnRDb21wb25lbnQge1xuXG4gIC8vIFRoZSByZXBvcnQgdGhpcyB2aWV3IGlzIGZvY3VzZWQgb24g4oCUIHN1cHBsaWVkIGJ5IHRoZSBob3N0IGZyb20gdGhlIHJvdXRlLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBBUEkgYmFzZSBmb3IgdGhlIHJlcG9ydHMgKyBjaGF0IGVuZHBvaW50czsgb3ZlcnJpZGUgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZVBhdGggPSBpbnB1dDxzdHJpbmc+KCdyZXBvcnRzJyk7XG5cbiAgLy8gVGhlIHF1ZXJ5IHBhcmFtIHRoYXQgY2FycmllcyB0aGUgcGFnZSBvbiBzY3JlZW4gKD9wYWdlPTcpLiBBIHJlcG9ydCBvcGVuc1xuICAvLyBvbiB0aGUgcGFnZSBpdCBuYW1lcywgYW5kIGVhY2ggbW92ZSB0byBhbm90aGVyIHBhZ2Ugd3JpdGVzIGl0LCBpbiBwbGFjZSxcbiAgLy8gc28gYSByZWZyZXNoIG9yIGEgc2hhcmVkIGxpbmsgY29tZXMgYmFjayB0byB0aGUgc2FtZSBwYWdlLiBJdCBpcyB0aGUgb25seVxuICAvLyBzdGF0ZSBhIHJlcG9ydCBrZWVwcyBpbiB0aGUgVVJMOiBpdHMgZmlsdGVycyBhbmQgdGhlIHJlc3QgbGl2ZSBpbiB0aGVcbiAgLy8gcmVwb3J0J3Mgc3RhdGUgKFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuIEEgaG9zdCB0aGF0IG1vdW50cyBzZXZlcmFsXG4gIC8vIHJlcG9ydHMgb24gb25lIHJvdXRlLCBvciB3YW50cyBubyBVUkwgd3JpdGVzLCBzZXRzIHRoaXMgdG8gbnVsbC5cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VRdWVyeVBhcmFtID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4oJ3BhZ2UnKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyBkZWxldGVkIGZyb20gaXRzIHNldHRpbmdzIGRpYWxvZyDigJQgdGhlIGhvc3Qgcm91dGVzIGJhY2sgdG9cbiAgLy8gdGhlIGxpc3RpbmcuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0IHdhcyByZW5hbWVkIChzZXR0aW5ncywgb3IgdGhlIGFnZW50KSDigJQgdGhlIGhvc3QgY2FuIHJlZnJlc2ggYVxuICAvLyBicmVhZGNydW1iIC8gZG9jdW1lbnQgdGl0bGUuXG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVkID0gb3V0cHV0PFJlcG9ydD4oKTtcblxuICAvLyBUaGUgdmlld2VyIG1vdmVkIHRvIGFub3RoZXIgcGFnZSDigJQgZm9yIGhvc3RzIHRoYXQgdHJhY2sgdGhlIG9wZW4gcGFnZSBmb3JcbiAgLy8gdGhlaXIgb3duIHJlYXNvbnMuIE5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgVVJMLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUNoYW5nZWQgPSBvdXRwdXQ8bnVtYmVyIHwgbnVsbD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0ID0gc2lnbmFsPFJlcG9ydCB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSBwYWdlIHRoZSBjYW52YXMgc2hvdWxkIG9wZW4gb246IHRoZSA/cGFnZT0gdGhlIHJlcG9ydCBvcGVuZWQgd2l0aFxuICAvLyAocmVhZCBvbmNlIHBlciByZXBvcnQpLiBDbGVhcmVkIGFzIHNvb24gYXMgdGhlIGNhbnZhcyByZXBvcnRzIGJhY2ssIHNvIGFcbiAgLy8gbGF0ZXIgaW4tYXBwIHBhZ2UgY2hhbmdlIGlzIG5ldmVyIGZvdWdodCBieSBhIHN0YWxlIHZhbHVlLlxuICBwdWJsaWMgcmVhZG9ubHkgcGFnZUlkID0gc2lnbmFsPG51bWJlciB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBwYWdlIHRoZSBjaGF0IGlzIGJvdW5kIHRvOiB0aGUgb25lIG9uIHNjcmVlbi4gQSByZXBvcnQgY29udmVyc2F0aW9uXG4gIC8vIGJlbG9uZ3MgdG8gZXhhY3RseSBvbmUgcGFnZSwgc28gdGhpcyBib3RoIHNjb3BlcyB0aGUgY29udmVyc2F0aW9uIGxpc3QgYW5kXG4gIC8vIGJlY29tZXMgdGhlIG5ldyBjb252ZXJzYXRpb24ncyBwYWdlLiBBIHNpZ25hbCBiZWNhdXNlIGl0IGZlZWRzXG4gIC8vIFtyZXF1ZXN0RGF0YV0g4oCUIGNoYW5naW5nIGl0IGlzIHdoYXQgcmVsb2FkcyB0aGUgcGFuZWwgb250byB0aGUgbmV3IHBhZ2Unc1xuICAvLyBjb252ZXJzYXRpb25zLiBOdWxsIHVudGlsIHRoZSBjYW52YXMgcmVwb3J0cyB3aGljaCBwYWdlIGl0IG9wZW5lZCBvbiwgd2hpY2hcbiAgLy8ga2VlcHMgdGhlIGNoYXQgZnJvbSBsaXN0aW5nIGFnYWluc3QgYSBwYWdlIGd1ZXNzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2hhdFBhZ2VJZCA9IHNpZ25hbDxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IHRoZSBjaGF0IHNlbmRzIHdpdGggZXZlcnkgY29udmVyc2F0aW9uIGNhbGw6IHRoZSByZXBvcnQsIGFuZCB0aGUgcGFnZVxuICAvLyBpdCBpcyBib3VuZCB0by5cbiAgLy9cbiAgLy8gcmVwb3J0UGFnZUlkIGlzIE9NSVRURUQsIG5vdCBzZW50IGFzIG51bGwsIHdoaWxlIHRoZSBvcGVuIHBhZ2UgaXMgdW5rbm93bi5cbiAgLy8gVGhlIGJhY2tlbmQgcmVhZHMgYSBQUkVTRU5UIHJlcG9ydFBhZ2VJZCBvZiAwL251bGwgYXMgXCJ0aGUgcmVwb3J0J3MgZWFybGllcixcbiAgLy8gcGFnZS1sZXNzIGNvbnZlcnNhdGlvbnNcIiwgc28gc2VuZGluZyBudWxsIGJlZm9yZSB0aGUgY2FudmFzIGhhcyByZXBvcnRlZCBpblxuICAvLyB3b3VsZCBhc2sgZm9yIHRoZSB3cm9uZyBsaXN0IOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBiaW5kIGEgY29udmVyc2F0aW9uIHN0YXJ0ZWRcbiAgLy8gaW4gdGhhdCB3aW5kb3cgdG8gbm8gcGFnZSBhdCBhbGwuXG4gIC8vXG4gIC8vIFRoZSBjaGF0IGlzIGFsc28gaGVsZCBjbG9zZWQgKFtyZWFkeV0gaW4gdGhlIHRlbXBsYXRlKSB1bnRpbCB0aGUgcGFnZSBpc1xuICAvLyBrbm93biwgc28gdGhpcyBwYXJ0aWFsIGNvbnRleHQgaXMgbmV2ZXIgYWN0dWFsbHkgc2VudDogb24gYSBmcmVzaCBsb2FkIHRoZVxuICAvLyByZXBvcnQgaGFzIHRvIGFycml2ZSBhbmQgdGhlIGNhbnZhcyBoYXMgdG8gcmVuZGVyIGJlZm9yZSBhbnkgcGFnZSBleGlzdHMsXG4gIC8vIGFuZCBhIGxpc3QgZmV0Y2hlZCBpbiB0aGF0IHdpbmRvdyB3b3VsZCBiZSB0aGUgd2hvbGUgcmVwb3J0J3MgY29udmVyc2F0aW9uc1xuICAvLyDigJQgdGhlIHVuc2NvcGVkIGxpc3QsIHNob3duIGFuZCBhdXRvLXNlbGVjdGVkIGJlZm9yZSB0aGUgcmVhbCBvbmUgbGFuZHMuXG4gIHB1YmxpYyByZWFkb25seSBjaGF0UmVxdWVzdERhdGEgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKCkgPT4ge1xuICAgIGNvbnN0IHJlcG9ydFBhZ2VJZCA9IHRoaXMuY2hhdFBhZ2VJZCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFBhZ2VJZCA9PT0gbnVsbFxuICAgICAgPyB7IHJlcG9ydElkOiB0aGlzLnJlcG9ydElkKCkgfVxuICAgICAgOiB7IHJlcG9ydElkOiB0aGlzLnJlcG9ydElkKCksIHJlcG9ydFBhZ2VJZCB9O1xuICB9KTtcblxuICAvLyBUaGUgcmVwb3J0LWxldmVsIGZpbHRlciB0b29sYmFyIChmcy1maWx0ZXIpLiBSZWJ1aWx0IHdoZW5ldmVyIHRoZSBsb2FkZWRcbiAgLy8gcmVwb3J0IChhbmQgdGh1cyBpdHMgZ3JvdXBzKSBjaGFuZ2VzLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RmlsdGVyQ29uZmlnID0gc2lnbmFsPEZpbHRlckNvbmZpZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIEdhdGVzIHRoZSB0b29sYmFyIGZzLWZpbHRlciBzbyBpdCBpc24ndCByZW5kZXJlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAgLy8gcHV0IGluIGl0IOKAlCBubyByZXBvcnQtbGV2ZWwgZmlsdGVycyBhbmQgbm8gZ3JvdXAtYnkgY29udHJvbC5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydEhhc0ZpbHRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydEdyb3VwcygpLmxlbmd0aCA+IDAgfHwgISF0aGlzLl9ncm91cEJ5SXRlbSgpO1xuICB9KTtcblxuICAvLyBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmx5IG9uY2UgKGF0IGluaXQpLiBUaGUgdGVtcGxhdGUga2V5cyB0aGVcbiAgLy8gdG9vbGJhciBmcy1maWx0ZXIgb24gdGhpcyBzaWduYXR1cmUgc28gaXQncyByZWNyZWF0ZWQgKGFuZCByZS1yZWFkcyB0aGVcbiAgLy8gcmVidWlsdCBjb25maWcpIHdoZW5ldmVyIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzLlxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0RmlsdGVyS2V5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgYmFyIHdhcyBidWlsdCBmb3I6IGEgcmVzZXQgdG8gdGhlIGRlZmF1bHRzXG4gICAgICAvLyByZXBsYWNlcyBldmVyeSB2YWx1ZSBhdCBvbmNlLlxuICAgICAgdGhpcy5fYmFyVmVyc2lvbigpLFxuICAgICAgLy8gVGhlIGVmZmVjdGl2ZSB6b25lIGlzIHBhcnQgb2YgaXQgdG9vOiBhIHpvbmUgY2hhbmdlIHJlLXJlc29sdmVzIHJlbGF0aXZlXG4gICAgICAvLyBwcmVzZXRzLCBhbmQgdGhlIGJhciBtdXN0IGJlIHJlY3JlYXRlZCB0byBzaG93IHRoZSBuZXcgZGF5cy5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCksXG4gICAgICAvLyBUaGUgc3RvcmVkIGRlZmF1bHQgaXMgcGFydCBvZiB0aGUgc2lnbmF0dXJlOiBzYXZpbmcgYSBuZXcgZGVmYXVsdCBpbiByZXBvcnRcbiAgICAgIC8vIHNldHRpbmdzIHJlYnVpbGRzIHRoZSBjb25maWcsIGJ1dCB3aXRob3V0IGEga2V5IGNoYW5nZSBmcy1maWx0ZXIga2VlcHNcbiAgICAgIC8vIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAgZ3JvdXBCeVNpZ25hdHVyZSh0aGlzLnJlcG9ydCgpKSxcbiAgICAgIC4uLnRoaXMuX3JlcG9ydEdyb3VwcygpLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfToke2dyb3VwLmxhYmVsfToke2RlZmF1bHRTaWduYXR1cmUoZ3JvdXApfWApLFxuICAgICAgLy8gQSBwYWdlIGdyb3VwIHNob3dzIG9uIGl0cyBvd24gcGFnZSBvbmx5LCBzbyBzdWNoIGEgYmFyIGlzIHJlY3JlYXRlZFxuICAgICAgLy8gd2hlbiB0aGUgcGFnZSBvbiBzY3JlZW4gY2hhbmdlcy5cbiAgICAgIC4uLihoYXNQYWdlR3JvdXAodGhpcy5yZXBvcnQoKSkgPyBbYHBhZ2U6JHt0aGlzLmNoYXRQYWdlSWQoKX1gXSA6IFtdKSxcbiAgICBdLmpvaW4oJ3wnKTtcbiAgfSk7XG5cbiAgQFZpZXdDaGlsZCgnc3BsaXQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIF9zcGxpdCE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXRQYW5lbCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgX2NoYXRQYW5lbCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE9ubHkgdGhlIGNhbnZhcyBrbm93cyB3aGljaCBwYWdlIGlzIG9uIHNjcmVlbiwgYW5kIGEgcGFnZS1zY29wZWQgZXhwb3J0XG4gIC8vIGhhcyB0byBhc2sgaXQuXG4gIEBWaWV3Q2hpbGQoUmVwb3J0Q2FudmFzQ29tcG9uZW50KVxuICBwcml2YXRlIF9jYW52YXM/OiBSZXBvcnRDYW52YXNDb21wb25lbnQ7XG5cbiAgLy8gVGhlIHJlcG9ydC1sZXZlbCBmaWx0ZXIgYmFyLCB3aGlsZSBpdCBpcyBkcmF3bi4gQSBzYXZlZCBmaWx0ZXIgYmVpbmdcbiAgLy8gcGlja2VkIHJlYWRzIHRoZSBiYXIncyB2YWx1ZXMgb2ZmIGl0IChfa2VlcEJhck9uUGljaykuXG4gIEBWaWV3Q2hpbGQoRmlsdGVyQ29tcG9uZW50KVxuICBwcml2YXRlIF9yZXBvcnRCYXI/OiBGaWx0ZXJDb21wb25lbnQ7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfcmVwb3J0QWlDaGF0RGF0YSA9IGluamVjdChSZXBvcnRBaUNoYXREYXRhKTtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9ucyA9IGluamVjdChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgX2V4cG9ydFNlcnZpY2UgPSBpbmplY3QoUmVwb3J0RXhwb3J0U2VydmljZSk7XG4gIHByaXZhdGUgX2NvbGxlY3RvciA9IGluamVjdChSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBiYXIgd2FzIGxhc3QgYnVpbHQgZm9yIChyZXBvcnRGaWx0ZXJLZXkpLlxuICBwcml2YXRlIHJlYWRvbmx5IF9iYXJWZXJzaW9uID0gc2lnbmFsKDApO1xuXG4gIC8vIFRoZSByZXBvcnQgYmFyJ3MgdmFsdWVzIGFzIHRoZXkgd2VyZSB0aGUgbW9tZW50IGZzLWZpbHRlciByZWFkIGEgc2F2ZWRcbiAgLy8gZmlsdGVyJ3MgdmFsdWVzLCBvciBudWxsIG91dHNpZGUgdGhhdCBtb21lbnQuIEEgcGljayBzZXRzIGV2ZXJ5IGl0ZW0gb2ZcbiAgLy8gdGhlIGJhciBmcm9tIHRoZSBzYXZlZCBmaWx0ZXIncyB2YWx1ZXM7IGVhY2ggaXRlbSBhIHNhdmVkIGZpbHRlciBuZXZlclxuICAvLyBob2xkcyAodGhlIGdyb3VwLWJ5IGdyYWluLCB0aGUgbWF0Y2gsIGEgcGFnZSdzIG93biBmaWx0ZXJzKSBpcyBwdXQgYmFja1xuICAvLyB0byBpdHMgbm90ZWQgdmFsdWUgYXMgaXQgaXMgc2V0IChfa2VlcEl0ZW1PblBpY2spLlxuICBwcml2YXRlIF9iYXJWYWx1ZXNBdFBpY2s6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVGhlIHJlcG9ydCB0aGUgc2NyZWVuIHdhcyBvcGVuZWQgb24gaXRzIGZpcnN0IHNhdmVkIGZpbHRlciBmb3JcbiAgLy8gKF9vcGVuT25GaXJzdFNhdmVkRmlsdGVyKSwgb3IgbnVsbCBiZWZvcmUgdGhhdC5cbiAgcHJpdmF0ZSBfb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFYWNoIGNoYXQgdHVybiBjYXJyaWVzIHdoYXQgdGhlIHZpZXdlciBoYXMgb24gc2NyZWVuLiBPbmx5IHRoZSBmdW5jdGlvblxuICAgIC8vIGlzIHNldCBoZXJlOyBpdCBpcyBjYWxsZWQgd2hlbiBhIHR1cm4gaXMgc2VudC5cbiAgICB0aGlzLl9yZXBvcnRBaUNoYXREYXRhLnR1cm5EYXRhID0gKCkgPT4gKHsgdmlld2VyU3RhdGU6IHRoaXMuX2NoYXRWaWV3ZXJTdGF0ZSgpIH0pO1xuXG4gICAgLy8gUG9pbnQgdGhlIHNoYXJlZCBkYXRhIGdhdGV3YXkgYXQgdGhlIGNvbmZpZ3VyZWQgYmFzZSBmaXJzdCAoYmVmb3JlIGFueVxuICAgIC8vIGxvYWQgYmVsb3cgcmVhZHMgaXQpLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xuICAgIH0pO1xuXG4gICAgLy8gKFJlKWxvYWQgd2hlbmV2ZXIgdGhlIGhvc3Qgc3dpdGNoZXMgdGhlIHJlcG9ydCBpZC5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcmVwb3J0SWQgPSB0aGlzLnJlcG9ydElkKCk7XG5cbiAgICAgIC8vIFRoZSBwYWdlIHRoaXMgcmVwb3J0IG9wZW5zIG9uLCBmcm9tIHRoZSA/cGFnZT0gdGhlIFVSTCBhbHJlYWR5IGhvbGRzLlxuICAgICAgLy8gUmVhZCBwZXIgcmVwb3J0IHJhdGhlciB0aGFuIG9uY2UgYXQgY29uc3RydWN0aW9uOiB0aGUgaG9zdCBtYXkgc3dhcFxuICAgICAgLy8gcmVwb3J0cyBvbiB0aGUgc2FtZSByb3V0ZSwgYW5kIGVhY2ggYXJyaXZhbCBjYXJyaWVzIGl0cyBvd24gP3BhZ2U9LlxuICAgICAgY29uc3QgcGFnZUlkID0gdGhpcy5fcGFnZUlkRnJvbVVybCgpO1xuXG4gICAgICAvLyBPbmx5IHRoZSByZXBvcnQgaWQgYW5kIHRoZSBwYWdlIHBhcmFtIHJlLXJ1biB0aGlzLiBUaGUgdmlldyBzdGF0ZSBiZWxvd1xuICAgICAgLy8gaXMgd3JpdHRlbiBoZXJlIGFuZCByZWFkIGJ5IHRoZSBjb25maWcgYnVpbGQsIHNvIGl0IHN0YXlzIHVudHJhY2tlZC5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZWRpdE1vZGUuc2V0KGZhbHNlKTtcblxuICAgICAgICAvLyBBIG5ldyByZXBvcnQncyBwYWdlcyBhcmUgbm90IHRoaXMgcmVwb3J0J3MgcGFnZXMg4oCUIGRyb3AgdGhlIGJpbmRpbmdcbiAgICAgICAgLy8gdW50aWwgaXRzIGNhbnZhcyBzYXlzIHdoaWNoIHBhZ2UgaXQgbGFuZGVkIG9uLlxuICAgICAgICB0aGlzLmNoYXRQYWdlSWQuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnBhZ2VJZC5zZXQocGFnZUlkKTtcblxuICAgICAgICBpZiAocmVwb3J0SWQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVwb3J0LnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIHJlc2V0VG9EZWZhdWx0cygpIG1vdmVzIHRoZSBzdGF0ZSB2ZXJzaW9uLiBUaGUgYmFyIGlzIGJ1aWx0IGFnYWluIGZvclxuICAgIC8vIGl0LCBhbmQgcmVwb3J0RmlsdGVyS2V5LCB3aGljaCBjYXJyaWVzIGl0LCByZWNyZWF0ZXMgZnMtZmlsdGVyOiBpdCByZWFkc1xuICAgIC8vIGl0cyBjb25maWcgb25jZS5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAodmVyc2lvbiAhPT0gdGhpcy5fYmFyVmVyc2lvbigpKSB7XG4gICAgICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9idWlsZFJlcG9ydENvbmZpZygpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUVkaXRNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUudXBkYXRlKChlZGl0TW9kZSkgPT4gIWVkaXRNb2RlKTtcbiAgfVxuXG4gIC8vIFRoZSBlZGl0IHRvb2xzIGxpdmUgaW4gdGhpcyB0b29sYmFyLCBidXQgdGhlIGNhbnZhcyBvd25zIHdoYXQgdGhleSBhY3Qgb25cbiAgLy8gKHRoZSBhY3RpdmUgcGFnZSwgdGhlIGhlYWRlci9mb290ZXIgYmFuZHMsIHdoaWNoIGxheWVyIGlzIGxpdmUpLlxuICBwdWJsaWMgZ2V0IGlzTWFzdGVyTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FudmFzPy5tYXN0ZXJNb2RlKCkgPz8gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgYWRkVGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXM/LmFkZFRleHQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVNYXN0ZXJNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbnZhcz8udG9nZ2xlTWFzdGVyTW9kZSgpO1xuICB9XG5cbiAgLy8gUmVwb3J0IHNldHRpbmdzIOKAlCBuYW1lLCBwYWdlIHNpemUsIGRlbGV0ZS4gVGhlXG4gIC8vIGRpYWxvZyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZjsgd2UgcmVhY3QgdG8gd2hhdCBpdCByZXBvcnRzIGJhY2suXG4gIHB1YmxpYyByZXBvcnRTZXR0aW5ncygpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0SWQgPSByZXBvcnQuaWQ7XG5cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3BlbjxSZXBvcnRTZXR0aW5nc0NvbXBvbmVudCwgdW5rbm93biwgUmVwb3J0U2V0dGluZ3NSZXN1bHQ+KFJlcG9ydFNldHRpbmdzQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7IHJlcG9ydCB9LFxuICAgICAgd2lkdGg6ICc0NjBweCcsXG4gICAgfSk7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2U7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5kZWxldGVkLmVtaXQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBzYXZlIHRoYXQgZmFpbGVkIHBhcnQgd2F5IChhIHJlZnVzZWQgbmFtZSkgbWF5IHN0aWxsIGhhdmUgc3RvcmVkXG4gICAgICAgIC8vIHRoZSBmaWx0ZXJzIGJlZm9yZSBpdCwgc28gYSBkaXNtaXNzZWQgZGlhbG9nIHRoYXQgd3JvdGUgcmVsb2FkcyB0b28uXG4gICAgICAgIGlmIChyZXN1bHQ/LmFjdGlvbiA9PT0gJ3NhdmVkJyB8fCBzZXR0aW5ncy53cm90ZSgpKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZFJlcG9ydChyZXBvcnRJZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQ29tcG9uZW50IHNldHRpbmdzIOKAlCB0aXRsZSwgZXhhY3QgZ2VvbWV0cnksIGFuZCB0aGUgZGlhZ25vc3RpYyB2aWV3c1xuICAvLyAoU1FMLCBjb25maWcsIGZpbHRlciB3aXJpbmcpLlxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnRNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMucmVwb3J0KCk7XG4gICAgaWYgKCFyZXBvcnQgfHwgIXRoaXMuX2NhbnZhcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9ydElkID0gcmVwb3J0LmlkO1xuXG4gICAgLy8gVGhlIGRpYWxvZyBnZXRzIHdoYXQgdGhlIGNvbXBvbmVudCdzIHRpdGxlIHRva2VucyBmaWxsIHdpdGggd2hlcmUgaXQgaXNcbiAgICAvLyBkcmF3biwgZm9yIHRoZSB0aXRsZSdzIEluc2VydCBmaWVsZCBtZW51IGFuZCB0aGUgbGluZSBzYXlpbmcgaG93IGl0IHJlYWRzLlxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuPENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LCBDb21wb25lbnRTZXR0aW5nc0RpYWxvZ0RhdGEsIENvbXBvbmVudFNldHRpbmdzUmVzdWx0PihcbiAgICAgIENvbXBvbmVudFNldHRpbmdzQ29tcG9uZW50LFxuICAgICAge1xuICAgICAgICBkYXRhOiB7IHJlcG9ydCwgY29tcG9uZW50LCB0b2tlbnM6IHRoaXMuX2NhbnZhcy5jb21wb25lbnRUb2tlbnMoY29tcG9uZW50KSB9LFxuICAgICAgICB3aWR0aDogJzY0MHB4JyxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpbHRlciBhZGQvcmVtb3ZlL2xldmVsIGNoYW5nZXMgcGVyc2lzdCBpbW1lZGlhdGVseSBpbnNpZGUgdGhlIGRpYWxvZyAobm9cbiAgICAvLyBcInNhdmVcIikgYW5kIGNhbiBsZWF2ZSBpdCBieSBhbiBleGl0IHRoYXQgY2FycmllcyBubyByZXN1bHQsIHNvIHRoZXkgYXJlXG4gICAgLy8gYW5ub3VuY2VkIGFzIHRoZXkgbGFuZC4gVGhlIHJlbG9hZCB3YWl0cyBmb3IgdGhlIGNsb3NlIHNvIHRoZSBjYW52YXMgaXNuJ3RcbiAgICAvLyByZS1yZW5kZXJpbmcgdW5kZXJuZWF0aCBhbiBvcGVuIGRpYWxvZy5cbiAgICBsZXQgZmlsdGVyc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZmlsdGVyc0NoYW5nZWRcbiAgICAgIC5waXBlKHRha2VVbnRpbChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IGZpbHRlcnNDaGFuZ2VkID0gdHJ1ZSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIC8vIFRoZSBkaWFsb2cgY29uZmlybXMgKyBwZXJmb3JtcyB0aGUgZGVsZXRlIGl0c2VsZi4gVGhlIGNvbXBvbmVudCBpc1xuICAgICAgICAvLyBnb25lIGZyb20gdGhlIHJlcG9ydCwgc28gcmVsb2FkIHJhdGhlciB0aGFuIHBhdGNoaW5nIGl0IG91dCBsb2NhbGx5IOKAlFxuICAgICAgICAvLyBpdHMgZmlsdGVycyB3ZW50IHdpdGggaXQsIHdoaWNoIHRoZSByZXBvcnQgYmFyIGhhcyB0byBiZSByZWJ1aWx0IGZvci5cbiAgICAgICAgaWYgKHJlc3VsdD8uZGVsZXRlZCkge1xuICAgICAgICAgIHRoaXMuX2xvYWRSZXBvcnQocmVwb3J0SWQpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHJlcG9ydCdzIGZpbHRlciBncm91cHMgY2hhbmdlZCwgc28gdGhlIHJlcG9ydCBiYXIgYW5kIHRoZVxuICAgICAgICAvLyBvbi1jb21wb25lbnQgc3RyaXBzIGhhdmUgdG8gYmUgcmVidWlsdCBmcm9tIGEgZnJlc2ggcmVwb3J0LlxuICAgICAgICBpZiAoZmlsdGVyc0NoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGhpbmcgZWxzZSBpbiB0aGUgZGlhbG9nIHRvdWNoZXMgdGhlIHF1ZXJ5IOKAlCB0aXRsZSBhbmQgcGFkZGluZyBhcmVcbiAgICAgICAgLy8gcHJlc2VudGF0aW9uLiBSZXBhaW50IHRoZSBvbmUgY29tcG9uZW50IGl0IHdhcyBvcGVuZWQgZm9yIGFuZCBsZWF2ZVxuICAgICAgICAvLyBldmVyeSBvdGhlciBjb21wb25lbnQncyBkYXRhLCBhbmQgaXRzIHF1ZXJ5LCBhbG9uZS5cbiAgICAgICAgaWYgKHJlc3VsdD8uc2V0dGluZ3MpIHtcbiAgICAgICAgICB0aGlzLl9jYW52YXM/LmFwcGx5Q29tcG9uZW50U2V0dGluZ3MoY29tcG9uZW50LmlkLCByZXN1bHQuc2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgbW92ZWQgdG8gYW5vdGhlciBwYWdlLiBUaGUgcmVwb3J0LWxldmVsIGZpbHRlcnMgc3RheSBhcyB0aGV5XG4gIC8vIGFyZSAodGhleSBsaXZlIGluIHRoZSBzdGF0ZSBzZXJ2aWNlKTsgdGhlIHBhZ2UgZ29lcyBpbnRvIHRoZSBVUkwuXG4gIHB1YmxpYyBvbkNhbnZhc1BhZ2VDaGFuZ2VkKHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIC8vIFRoZSBhc2tlZC1mb3IgcGFnZSBoYXMgYmVlbiBjb25zdW1lZDsgZnJvbSBoZXJlIHRoZSBjYW52YXMgb3ducyB0aGUgcGFnZS5cbiAgICB0aGlzLnBhZ2VJZC5zZXQobnVsbCk7XG4gICAgdGhpcy5jaGF0UGFnZUlkLnNldChwYWdlSWQpO1xuICAgIC8vIFRoZSBvcGVuIHBhZ2UgaXMgcGFydCBvZiB0aGUgc3RhdGUgdGhlIHRpbGVzIGFuZCBleHBvcnRzIHJlYWQuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0UGFnZShwYWdlSWQpO1xuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChwYWdlSWQpO1xuICAgIHRoaXMuX3dyaXRlUGFnZVRvVXJsKHBhZ2VJZCk7XG5cbiAgICAvLyBUaGUgYmFyIHNob3dzIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4uXG4gICAgaWYgKGhhc1BhZ2VHcm91cCh0aGlzLnJlcG9ydCgpKSkge1xuICAgICAgdGhpcy5fYnVpbGRSZXBvcnRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIGNoYW5nZWQgdGhlIHJlcG9ydCdzIHN0cnVjdHVyZSAoYWRkZWQgYSBwYWdlKSDigJQgcmUtZmV0Y2ggc28gdGhlXG4gIC8vIG5ldyBwYWdlIHJlbmRlcnM7IHRoZSBjYW52YXMgbGFuZHMgdGhlIHZpZXcgb24gaXQuXG4gIHB1YmxpYyBvbkNhbnZhc1JlcG9ydENoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAocmVwb3J0KSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHRoZSByZXBvcnQgdG8gUG93ZXJQb2ludCwgZW50aXJlbHkgY2xpZW50LXNpZGUgKG5hdGl2ZSBlZGl0YWJsZVxuICAvLyBjaGFydHM7IHBhZ2UgPSBzbGlkZSkuIFRoZSBkb2NrIHNob3dzIHByb2dyZXNzIHVudGlsIHRoZSBmaWxlIHNhdmVzLlxuICBwdWJsaWMgZXhwb3J0UG93ZXJwb2ludCgpOiB2b2lkIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuICAgIGlmICghcmVwb3J0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnRXhwb3J0aW5nIFBvd2VyUG9pbnQnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wb3dlcnBvaW50KHJlcG9ydCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIEV4cG9ydCB0byBQREYsIGVudGlyZWx5IGNsaWVudC1zaWRlIChvZmZzY3JlZW4gRUNoYXJ0cyBhdCAzw5c7IHBhZ2UgPSBQREYgcGFnZSkuXG4gIHB1YmxpYyBleHBvcnRQZGYoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3MucnVuKFxuICAgICAgJ0V4cG9ydGluZyBQREYnLFxuICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5wZGYocmVwb3J0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIHdob2xlIHJlcG9ydCBhcyBmaWxlcyBpbiBvbmUgYWN0aW9uOiB0aGUgc2VydmVyIHdyaXRlcyBvbmUgQ1NWIHBlclxuICAvLyBjb21wb25lbnQsIGVhY2ggd2hhdCB0aGUgc2NyZWVuIHNob3dzIChhIGNoYXJ0IG9yIEtQSSBhcyBkcmF3biwgYXQgdGhlXG4gIC8vIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluOyBhIGxpc3QgaW4gZnVsbCksIGFuZCB6aXBzIHRoZW0gZm9sZGVyZWQgYnkgcGFnZVxuICAvLyB3aXRoIGFuIEV4cG9ydCBOb3Rlcy50eHQgdGhhdCByZWNvcmRzIHRoZSBmaWx0ZXJzIGFzIHRoZSBiYXIgcmVhZHMgdGhlbS5cbiAgLy8gRWFjaCBmaWxlIGNhcnJpZXMgaXRzIHRpbGUncyBvd24gc3RhdGUgKHppcEV4cG9ydFN0YXRlcyk6IGEgbGlzdCdzIHNvcnQsXG4gIC8vIHNlYXJjaCBhbmQgaGlkZGVuIGNvbHVtbnMsIGEgY2hhcnQncyBkcmlsbCBwYXRoIGFuZCB0aGUgZ3JvdXBzIHRoYXQgbWF0Y2hcbiAgLy8gJ2FueSc7IGEgc2VydmVyIHRoYXQgZG9lcyBub3QgcmVhZCBpdCB1c2VzIGVhY2ggbGlzdCdzIHNhdmVkIHNvcnQuIFRoZVxuICAvLyBub3RlcyBnZXQgdGhlIGZpbHRlciBsaW5lcyBhcyB0aGUgY292ZXIgd29yZHMgdGhlbSAoZXhwb3J0TGluZXM7IGEgVGhpc1xuICAvLyBQYWdlIHppcCBuYW1lcyBvbmx5IHRoZSBncm91cHMgdGhhdCByZWFjaCB0aGUgcGFnZSksIGFuZCBlYWNoIGZpbGUgaXNcbiAgLy8gbmFtZWQgYWZ0ZXIgaXRzIHRpbGUncyB0aXRsZSBhcyB0aGUgY2FudmFzIGhlYWRlciByZWFkcyBpdCAodGl0bGVzKS4gQWxsXG4gIC8vIG9mIGl0IGlzIHJlYWQgb25jZSwgd2hlbiB0aGUgZXhwb3J0IHN0YXJ0cyAoZXhwb3J0V29yZGluZykuIGB0aGlzUGFnZWBcbiAgLy8gbmFycm93cyBpdCB0byB0aGUgcGFnZSB0aGUgY2FudmFzIGlzIHNob3dpbmcuIFVubGlrZSB0aGUgUERGL1Bvd2VyUG9pbnRcbiAgLy8gZXhwb3J0cyB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gc2VydmVyLXNpZGUsIHNvIHRoZXkgYXJlIG5vdCBjYXBwZWQgYnlcbiAgLy8gd2hhdCBhIHNsaWRlIGNhbiBob2xkLlxuICBwdWJsaWMgZXhwb3J0RGF0YSh0aGlzUGFnZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBpZiAoIXJlcG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHRoaXNQYWdlID8gdGhpcy5fY2FudmFzPy5hY3RpdmVQYWdlPy5pZCA/PyBudWxsIDogbnVsbDtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvclJlcG9ydChyZXBvcnQsIHBhZ2VJZCk7XG4gICAgY29uc3QgZnJlcXVlbmN5ID0gdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9jb2xsZWN0b3Iuc25hcHNob3QocmVwb3J0KTtcbiAgICBjb25zdCBzdGF0ZXMgPSB6aXBFeHBvcnRTdGF0ZXMocmVwb3J0LCBzbmFwc2hvdC5zdGF0ZSwgcGFnZUlkKTtcblxuICAgIHRoaXMuX3Byb2Nlc3MuZG93bmxvYWQoXG4gICAgICAnRXhwb3J0aW5nIGRhdGEnLFxuICAgICAgdGhpcy5fY29sbGVjdG9yLmV4cG9ydFdvcmRpbmcocmVwb3J0LCBzbmFwc2hvdCwgcGFnZUlkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHsgbGluZXMsIHRpdGxlcyB9KSA9PiB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydFJlcG9ydChcbiAgICAgICAgICAgIHJlcG9ydC5pZCxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHN0YXRlcyxcbiAgICAgICAgICAgIHRpdGxlcyxcbiAgICAgICAgICApKSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLy8gUmVhY3QgdG8gZWFjaCBjaGF0IHR1cm4gKGZzLWNoYXQgaGFuZGxlcyB0aGUgcmVxdWVzdCArIHBlcnNpc3RlbmNlKTsgd2VcbiAgLy8gb25seSBjYXJlIGFib3V0IHRoZSByZXBvcnQgc2lkZSBlZmZlY3RzIHRoaXMgY29udGV4dCdzIGJhY2tlbmQgZmxhZ3MuXG4gIHB1YmxpYyBvbkNoYXRSZXNwb25zZShyZXNwb25zZTogRnNBaUNoYXRSZXNwb25zZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlcG9ydElkID0gdGhpcy5yZXBvcnRJZCgpO1xuICAgIGlmIChyZXBvcnRJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0UmVzcG9uc2UgPSByZXNwb25zZSBhcyBGc0FpQ2hhdFJlc3BvbnNlICYgUmVwb3J0Q2hhdFJlc3BvbnNlO1xuXG4gICAgLy8gQSBzdHJ1Y3R1cmFsIGNoYW5nZSBvciBhIHJlbmFtZSBib3RoIHJlLWZldGNoIHRoZSByZXBvcnQgKHNlc3Npb24gZmlsdGVyXG4gICAgLy8gdmFsdWVzIHN1cnZpdmUpOyBhIHJlbmFtZSBhZGRpdGlvbmFsbHkgbm90aWZpZXMgdGhlIGhvc3Qgc28gaXQgY2FuXG4gICAgLy8gcmVmcmVzaCBhIGJyZWFkY3J1bWIgLyB0aXRsZS5cbiAgICBpZiAocmVwb3J0UmVzcG9uc2UucmVwb3J0Q2hhbmdlZCB8fCByZXBvcnRSZXNwb25zZS5yZXBvcnRSZW5hbWVkKSB7XG4gICAgICB0aGlzLl9sb2FkUmVwb3J0KHJlcG9ydElkLCAhIXJlcG9ydFJlc3BvbnNlLnJlcG9ydFJlbmFtZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyYWcgdGhlIGRpdmlkZXIgYmV0d2VlbiB0aGUgY2hhdCBhbmQgY2FudmFzIHBhbmVzIChwb2ludGVyLWNhcHR1cmUgbG9vcFxuICAvLyBvdXRzaWRlIEFuZ3VsYXIpLlxuICBwdWJsaWMgb25SZXNpemVTdGFydChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vdmUgPSAoZTogUG9pbnRlckV2ZW50KSA9PiB0aGlzLl9yZXNpemVUbyhlLmNsaWVudFgpO1xuICAgICAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgICAgICBoYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgICAgICB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc2l6aW5nJyk7XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBvbiBzY3JlZW4gYXMgYSBjaGF0IHR1cm4gc2VuZHMgaXQuIFRoZSBjYW52YXNcbiAgLy8gc2VsZWN0aW9uIGNvdW50cyBvbmx5IGluIGVkaXQgbW9kZTogaXQgaXMgZHJhd24gb25seSB0aGVuLCBhbmQgaXQgaXMga2VwdFxuICAvLyAobm90IGNsZWFyZWQpIHdoZW4gZWRpdCBtb2RlIGlzIGxlZnQuIFRoZSBtYXRjaCBpcyBzZW50IG9ubHkgd2hpbGUgaXQgaXNcbiAgLy8gJ2FueScsIHRoZSBkcmlsbGVkIGNoYXJ0cyBvbmx5IHdoZW4gb25lIGlzIGRyaWxsZWQsIGFuZCB0aGUgdGFibGVzIG9ubHlcbiAgLy8gd2hlbiB0aGUgYm91bmQgcGFnZSBzaG93cyBvbmUsIGVhY2ggd2l0aCB0aGUgbGF5b3V0IHRoZSB2aWV3ZXIgaGFzIGl0IGluXG4gIC8vIHdoaWxlIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBzdG9yZWQgb25lLlxuICBwcml2YXRlIF9jaGF0Vmlld2VyU3RhdGUoKTogUmVwb3J0Q2hhdFZpZXdlclN0YXRlIHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuX2ZpbHRlclN0YXRlLnNuYXBzaG90KCk7XG4gICAgY29uc3QgZHJpbGxzID0gY2hhdFZpZXdlckRyaWxscyhzbmFwc2hvdCwgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSk7XG4gICAgY29uc3QgdGlsZXMgPSBjaGF0Vmlld2VyVGlsZXMoXG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5yZXBvcnQoKSxcbiAgICAgIHRoaXMuY2hhdFBhZ2VJZCgpLFxuICAgICAgKGNvbXBvbmVudCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JpZFNlc3Npb25MYXlvdXQoY29tcG9uZW50KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdyYW51bGFyaXR5OiB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKSxcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50SWQ6IHRoaXMuZWRpdE1vZGUoKSA/IHRoaXMuX2NhbnZhcz8uc2VsZWN0ZWRDb21wb25lbnRJZCgpID8/IG51bGwgOiBudWxsLFxuICAgICAgZmlsdGVyczogdGhpcy5fZmlsdGVyU3RhdGUudmlld2VyRmlsdGVycygpLFxuICAgICAgLi4uY2hhdFZpZXdlck1hdGNoKHNuYXBzaG90KSxcbiAgICAgIC4uLihkcmlsbHMubGVuZ3RoID8geyBkcmlsbHMgfSA6IHt9KSxcbiAgICAgIC4uLih0aWxlcy5sZW5ndGggPyB7IHRpbGVzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc2l6ZVRvKGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9zcGxpdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF0aW8gPSAoY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoO1xuICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigwLjgsIE1hdGgubWF4KDAuMiwgcmF0aW8pKTtcbiAgICB0aGlzLl9jaGF0UGFuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5mbGV4QmFzaXMgPSBgJHtjbGFtcGVkICogMTAwfSVgO1xuICB9XG5cbiAgLy8gVGhlIHBhZ2Ugb24gc2NyZWVuIGludG8gdGhlIFVSTCAoP3BhZ2U9KSwgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGhpc3RvcnlcbiAgLy8gZW50cnkgcmF0aGVyIHRoYW4gYWRkaW5nIG9uZSwgc28gQmFjayBsZWF2ZXMgdGhlIHJlcG9ydCBpbnN0ZWFkIG9mXG4gIC8vIHN0ZXBwaW5nIHRocm91Z2ggaXRzIHBhZ2VzLiBPbmx5IHRoZSBwYWdlIHBhcmFtIGlzIHRvdWNoZWQ7IHRoZSBob3N0J3NcbiAgLy8gb3duIHF1ZXJ5IHBhcmFtcyBzdGF5LiBOb3RoaW5nIGlzIHdyaXR0ZW4gd2hlbiB0aGUgcGFyYW0gaXMgb2ZmLCBvciB3aGVuXG4gIC8vIHRoZSBVUkwgYWxyZWFkeSBuYW1lcyB0aGUgcGFnZS5cbiAgcHJpdmF0ZSBfd3JpdGVQYWdlVG9VcmwocGFnZUlkOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyYW0gPSB0aGlzLnBhZ2VRdWVyeVBhcmFtKCk7XG4gICAgaWYgKCFwYXJhbSB8fCAhcGFnZUlkIHx8IHRoaXMuX3BhZ2VJZEZyb21VcmwoKSA9PT0gcGFnZUlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICByZWxhdGl2ZVRvOiB0aGlzLl9yb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IFtwYXJhbV06IHBhZ2VJZCB9LFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgIHJlcGxhY2VVcmw6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgcGFnZSBpZCB0aGUgVVJMIGhvbGRzIHJpZ2h0IG5vdyAoP3BhZ2U9KSwgb3IgbnVsbCB3aGVuIHRoZSBwYWdlIHBhcmFtXG4gIC8vIGlzIG9mZiBvciB0aGUgdmFsdWUgaXMgbm90IGEgdXNhYmxlIGlkLlxuICBwcml2YXRlIF9wYWdlSWRGcm9tVXJsKCk6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYWdlUXVlcnlQYXJhbSgpO1xuICAgIGlmICghcGFyYW0pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IE51bWJlcih0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldChwYXJhbSkpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYWdlSWQpICYmIHBhZ2VJZCA+IDAgPyBwYWdlSWQgOiBudWxsO1xuICB9XG5cbiAgLy8gRXZlcnkgbG9hZCBzZXRzIHRoZSB2aWV3ZXIgc3RhdGUgdXAgZm9yIHRoZSByZXBvcnQgKGluaXQpOiBpdHMgZmlyc3RcbiAgLy8gbG9hZCBvcGVucyBpdCBvbiBpdHMgYXV0aG9yZWQgZGVmYXVsdHMsIGFuZCBhIGxhdGVyIG9uZSAoYSBjaGF0IGVkaXQsIGFcbiAgLy8gc2V0dGluZ3Mgc2F2ZSkga2VlcHMgdGhlIHN0YXRlIGluIG1lbW9yeS5cbiAgcHJpdmF0ZSBfbG9hZFJlcG9ydChyZXBvcnRJZDogbnVtYmVyLCBlbWl0UmVuYW1lZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVwb3J0RGF0YS5nZXQocmVwb3J0SWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXBvcnQ6IFJlcG9ydCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuaW5pdChyZXBvcnQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVwb3J0OiBSZXBvcnQpID0+IHtcbiAgICAgICAgdGhpcy5yZXBvcnQuc2V0KHJlcG9ydCk7XG4gICAgICAgIHRoaXMuX2J1aWxkUmVwb3J0Q29uZmlnKCk7XG5cbiAgICAgICAgaWYgKGVtaXRSZW5hbWVkKSB7XG4gICAgICAgICAgdGhpcy5yZW5hbWVkLmVtaXQocmVwb3J0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZXBvcnQtbGV2ZWwgZmlsdGVyIGdyb3VwcyBpbiB0aGVpciBzYXZlZCBvcmRlciDigJQgdGhlIG9uZXMgdGhhdCByZW5kZXIgaW5cbiAgLy8gdGhlIHRvb2xiYXIgKGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIG9uIHRoZWlyIGNvbXBvbmVudHMpLCB3aXRoXG4gIC8vIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4uXG4gIHByaXZhdGUgX3JlcG9ydEdyb3VwcygpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgICByZXR1cm4gcmVwb3J0QmFyR3JvdXBzKHRoaXMucmVwb3J0KCksIHRoaXMuY2hhdFBhZ2VJZCgpKTtcbiAgfVxuXG4gIC8vIChSZSlidWlsZCB0aGUgdG9vbGJhciBmcy1maWx0ZXIgY29uZmlnIOKAlCB0aGUgcmVwb3J0LWxldmVsIGZpbHRlciBpdGVtcyBhbmRcbiAgLy8gdGhlbiB0aGUgZ3JvdXAtYnkgY29udHJvbC5cbiAgcHJpdmF0ZSBfYnVpbGRSZXBvcnRDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5yZXBvcnQoKTtcbiAgICBjb25zdCByZXBvcnRJZCA9IHJlcG9ydD8uaWQgPz8gbnVsbDtcblxuICAgIC8vIERyb3AgYSBncmFpbiB0aGUgY29udHJvbCBubyBsb25nZXIgb2ZmZXJzIOKAlCB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdFxuICAgIC8vIG1pZC1zZXNzaW9uLCBhbmQgYW4gb3ZlcnJpZGUgdGhlIHZpZXdlciBjYW4ndCBzZWUgaXMgd29yc2UgdGhhbiBub25lLlxuICAgIGlmIChyZXBvcnQgJiYgIWlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5KCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3kobnVsbCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVhdHVyZXMgPSByZXBvcnQ/LnZpZXdlckZlYXR1cmVzID8/IFtdO1xuICAgIGNvbnN0IGl0ZW1zID0gcmVwb3J0SWRcbiAgICAgID8gdGhpcy5fcmVwb3J0R3JvdXBzKCkubWFwKChncm91cCkgPT5cbiAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9maWx0ZXJPcHRpb25zLCByZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSwgZmVhdHVyZXMpKVxuICAgICAgOiBbXTtcblxuICAgIC8vIFRoZSBncm91cC1ieSBjb250cm9sIGxlYWRzIHRoZSBiYXIsIGFoZWFkIG9mIGV2ZXJ5IGZpbHRlcjogaXQgc2V0cyB0aGVcbiAgICAvLyBncmFpbiB0aGUgd2hvbGUgcmVwb3J0IGlzIHJlYWQgYXQsIHNvIGl0IGlzIHRoZSBmaXJzdCB0aGluZyBhIHZpZXdlclxuICAgIC8vIGRlY2lkZXMuIEl0IGlzIG5vdCBhIGZpbHRlciBncm91cCDigJQgaXQgcmUtYnVja2V0cyByb3dzIHJhdGhlciB0aGFuXG4gICAgLy8gbmFycm93aW5nIHRoZW0g4oCUIHNvIGl0IGlzIHBsYWNlZCBoZXJlIHJhdGhlciB0aGFuIG9yZGVyZWQgYW1vbmcgdGhlbS5cbiAgICBjb25zdCBncm91cEJ5SXRlbSA9IHRoaXMuX2dyb3VwQnlJdGVtKCk7XG4gICAgaWYgKGdyb3VwQnlJdGVtKSB7XG4gICAgICBpdGVtcy51bnNoaWZ0KGdyb3VwQnlJdGVtKTtcbiAgICB9XG5cbiAgICAvLyBIb3cgdGhlIGdyb3VwcyBjb21iaW5lIGNsb3NlcyB0aGUgYmFyLlxuICAgIGNvbnN0IG1hdGNoSXRlbSA9IHRoaXMuX21hdGNoSXRlbSgpO1xuICAgIGlmIChtYXRjaEl0ZW0pIHtcbiAgICAgIGl0ZW1zLnB1c2gobWF0Y2hJdGVtKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlZEZpbHRlcnMgPSB0aGlzLl9zYXZlZEZpbHRlcnNDb25maWcoKTtcblxuICAgIHRoaXMuX2JhclZlcnNpb24uc2V0KHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKTtcbiAgICB0aGlzLnJlcG9ydEZpbHRlckNvbmZpZy5zZXQoe1xuICAgICAgLy8gZnMtZmlsdGVyIG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBmaWx0ZXIgc3RhdGU6IGEgcmVwb3J0XG4gICAgICAvLyBrZWVwcyBubyBzdGF0ZSBpbiB0aGUgVVJMLiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Ugb3ducyB0aGUgdmFsdWVzLlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBzYXZlZEZpbHRlcnMgPyB0aGlzLl9rZWVwT25QaWNrKGl0ZW1zKSA6IGl0ZW1zLFxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHRoaXMuX2JhckNoYW5nZWQocXVlcnkgPz8ge30sICEhbWF0Y2hJdGVtKSxcbiAgICAgIC8vICdDbGVhciBmaWx0ZXJzJyBwdXRzIHRoZSBzY3JlZW4gYmFjayBvbiB0aGUgcmVwb3J0J3MgYXV0aG9yZWRcbiAgICAgIC8vIGRlZmF1bHRzIGFuZCBkcm9wcyB0aGUgdGVtcG9yYXJ5IGxheWVyLiBmcy1maWx0ZXIgcmVwb3J0cyBpdHMgb3duXG4gICAgICAvLyBjbGVhcmVkIGl0ZW1zIChjaGFuZ2UpIGp1c3QgYmVmb3JlIHRoaXMsIHNvIHRoZSByZXNldCB3aW5zLlxuICAgICAgY2xlYXI6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc2V0VG9EZWZhdWx0cygpLFxuICAgICAgLy8gVGhlIGNoaXAgc2hvd3MgZXhhY3RseSB3aGlsZSB0aGUgc2NyZWVuIGRpZmZlcnMgZnJvbSB3aGF0IGEgY2xlYXJcbiAgICAgIC8vIHJldHVybnMgdG8gKEM1KS5cbiAgICAgIGNsZWFyVmlzaWJsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZGlmZmVyc0Zyb21EZWZhdWx0cygpLFxuICAgICAgc2F2ZWRGaWx0ZXJzLFxuICAgICAgLy8gZnMtZmlsdGVyIGNhbGxzIGluaXQgb25jZSBpdHMgc2F2ZWQgZmlsdGVycyBhcmUgbG9hZGVkLlxuICAgICAgLi4uKHNhdmVkRmlsdGVycyAmJiByZXBvcnRJZCA/IHsgaW5pdDogKCkgPT4gdGhpcy5fb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZCkgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0IG9wZW5zIG9uIGl0cyBmaXJzdCBzYXZlZCBmaWx0ZXI6IG9uY2UgaXRzIHNhdmVkIGZpbHRlcnMgYXJlXG4gIC8vIGZpcnN0IGxvYWRlZCwgdGhlIGZpcnN0IG9uZSBpcyBwaWNrZWQgYXMgYSB2aWV3ZXIgd291bGQgcGljayBpdCwgc28gaXRcbiAgLy8gYXBwbGllcyBvbiBldmVyeSBwYWdlIHRocm91Z2ggdGhlIHNhbWUgY2hhbmdlIChfYmFyQ2hhbmdlZCkuIE9uY2UgcGVyXG4gIC8vIHJlcG9ydCBvcGVuZWQ6IHRoZSBiYXIgaXMgcmVjcmVhdGVkIGFzIHRoZSBzY3JlZW4gY2hhbmdlcywgYW5kIGEgbGF0ZXJcbiAgLy8gYnVpbGQgbXVzdCBub3QgcGljayBpdCBhZ2FpbiBvdmVyIHRoZSB2aWV3ZXIncyBvd24gZWRpdHMuIFJlb3JkZXJpbmcgdGhlXG4gIC8vIHNhdmVkIGZpbHRlcnMgY2hhbmdlcyB3aGljaCBvbmUgYSByZXBvcnQgb3BlbnMgb24sIGZvciBldmVyeW9uZS5cbiAgcHJpdmF0ZSBfb3Blbk9uRmlyc3RTYXZlZEZpbHRlcihyZXBvcnRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2F2ZWRGaWx0ZXJDb250cm9sbGVyID0gdGhpcy5fcmVwb3J0QmFyPy5zYXZlZEZpbHRlckNvbnRyb2xsZXI7XG5cbiAgICBpZiAodGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID09PSByZXBvcnRJZCB8fCAhc2F2ZWRGaWx0ZXJDb250cm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3BlbmVkT25TYXZlZEZpbHRlclJlcG9ydElkID0gcmVwb3J0SWQ7XG5cbiAgICBjb25zdCBbZmlyc3RdID0gc2F2ZWRGaWx0ZXJDb250cm9sbGVyLnNhdmVkRmlsdGVycztcbiAgICBpZiAoZmlyc3QpIHtcbiAgICAgIHNhdmVkRmlsdGVyQ29udHJvbGxlci5zZXRBY3RpdmVGaWx0ZXIoZmlyc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBiYXIncyBzYXZlZCBmaWx0ZXJzLCBzaGFyZWQgYnkgZXZlcnlvbmUgd2hvIG1heSBvcGVuIHRoZSByZXBvcnQsIG9yXG4gIC8vIHVuZGVmaW5lZCB3aGVuIHRoZSBiYXIgaGFzIG5vbmUgdG8gb2ZmZXI6IGEgcmVwb3J0IG5vdCB5ZXQgc2F2ZWQgaGFzIG5vXG4gIC8vIGlkIHRvIGtlZXAgdGhlbSB1bmRlciwgYW5kIGEgYmFyIHdpdGggbm8gcmVwb3J0LXdpZGUgZmlsdGVyIGhhcyBub3RoaW5nXG4gIC8vIGEgc2F2ZWQgZmlsdGVyIGhvbGRzLiBmcy1maWx0ZXIncyBvd24gU2F2ZWQgZmlsdGVycyBtZW51IGxpc3RzIHRoZW0sXG4gIC8vIHNhdmVzIHRoZSBiYXIncyB2YWx1ZXMgYXMgYSBuZXcgb25lIG9yIG92ZXIgdGhlIHBpY2tlZCBvbmUsIG9yZGVycyBhbmRcbiAgLy8gZGVsZXRlcyB0aGVtLiBXaGF0IGl0IHNhdmVzIGlzIGtlcHQgdG8gdGhlIHJlcG9ydC13aWRlIGZpbHRlcnNcbiAgLy8gKHNhdmVkRmlsdGVyVmFsdWVzKTogYSBwYWdlJ3Mgb3duIGZpbHRlcnMsIHRoZSBncmFpbiBhbmQgdGhlIG1hdGNoIGFyZVxuICAvLyBsZWZ0IG91dC4gVGhlIGxpc3QgaXMgcmVhZCBldmVyeSB0aW1lIHRoZSBiYXIgaXMgYnVpbHQ7IG9uZSB0aGF0IGNhbm5vdFxuICAvLyBiZSByZWFkIHNob3dzIGFzIGVtcHR5IHJhdGhlciB0aGFuIGtlZXBpbmcgdGhlIGJhciBmcm9tIGRyYXdpbmcuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyc0NvbmZpZygpOiBJRmlsdGVyU2F2ZWRGaWx0ZXJzQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXBvcnRJZCA9IHRoaXMucmVwb3J0KCk/LmlkID8/IG51bGw7XG5cbiAgICBpZiAoIXJlcG9ydElkIHx8ICFzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLl9yZXBvcnRHcm91cHMoKSkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb2FkOiAoKSA9PiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAgIC5zYXZlZEZpbHRlcnMocmVwb3J0SWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgUmVwb3J0U2F2ZWRGaWx0ZXJbXSkpLFxuICAgICAgICAgIG1hcCgoc2F2ZWRGaWx0ZXJzKSA9PiAoc2F2ZWRGaWx0ZXJzID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSxcbiAgICAgICAgKSxcbiAgICAgIHNhdmU6IChzYXZlZEZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJzID0gc2F2ZWRGaWx0ZXJWYWx1ZXMoc2F2ZWRGaWx0ZXIuZmlsdGVycywgdGhpcy5fc2F2ZWRGaWx0ZXJHcm91cHMoKSk7XG4gICAgICAgIGNvbnN0IHNhdmUkID0gc2F2ZWRGaWx0ZXIuaWRcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCksIHtcbiAgICAgICAgICAgIC4uLihzYXZlZEZpbHRlci5uYW1lID8geyBuYW1lOiBzYXZlZEZpbHRlci5uYW1lIH0gOiB7fSksXG4gICAgICAgICAgICBmaWx0ZXJzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVNhdmVkRmlsdGVyKHJlcG9ydElkLCB7IG5hbWU6IHNhdmVkRmlsdGVyLm5hbWUgPz8gJycsIGZpbHRlcnMgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNhdmUkLnBpcGUobWFwKChzYXZlZCkgPT4gdGhpcy5fYmFyU2F2ZWRGaWx0ZXIoc2F2ZWQpKSk7XG4gICAgICB9LFxuICAgICAgb3JkZXI6IChzYXZlZEZpbHRlcnMpID0+IHRoaXMuX3JlcG9ydERhdGFcbiAgICAgICAgLnNhdmVTYXZlZEZpbHRlclBvc2l0aW9ucyhyZXBvcnRJZCwgc2F2ZWRGaWx0ZXJzLm1hcCgoc2F2ZWRGaWx0ZXIpID0+IE51bWJlcihzYXZlZEZpbHRlci5pZCkpKVxuICAgICAgICAucGlwZShtYXAoKG9yZGVyZWQpID0+IChvcmRlcmVkID8/IFtdKS5tYXAoKHNhdmVkRmlsdGVyKSA9PiB0aGlzLl9iYXJTYXZlZEZpbHRlcihzYXZlZEZpbHRlcikpKSksXG4gICAgICBkZWxldGU6IChzYXZlZEZpbHRlcikgPT4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgICAuZGVsZXRlU2F2ZWRGaWx0ZXIocmVwb3J0SWQsIE51bWJlcihzYXZlZEZpbHRlci5pZCkpXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBzYXZlZEZpbHRlcikpLFxuICAgIH07XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgcmVwb3J0LXdpZGUgZmlsdGVyIGdyb3VwczogdGhlIG9uZXMgYSBzYXZlZCBmaWx0ZXIgaG9sZHMuXG4gIHByaXZhdGUgX3NhdmVkRmlsdGVyR3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIHJldHVybiBzYXZlZEZpbHRlckdyb3Vwcyh0aGlzLnJlcG9ydCgpPy5maWx0ZXJHcm91cHMpO1xuICB9XG5cbiAgLy8gQSBzYXZlZCBmaWx0ZXIgYXMgdGhlIGJhcidzIG1lbnUgaG9sZHMgaXQuIEl0cyB2YWx1ZXMgYXJlIGtlcHQgdG8gdGhlXG4gIC8vIHJlcG9ydC13aWRlIGZpbHRlcnMgdGhlIHJlcG9ydCBoYXMgbm93IChhIGtleSBpdCBubyBsb25nZXIgaGFzLCBvciBhXG4gIC8vIHZhbHVlIGl0cyBmaWx0ZXIgY2FuIG5vIGxvbmdlciB0YWtlLCBpcyBkcm9wcGVkIHJhdGhlciB0aGFuIGFwcGxpZWQpLCBhbmRcbiAgLy8gZWFjaCByZWFkIG9mIHRoZW0gaGFuZHMgb3V0IGEgY29weSwgc28gbm90aGluZyB0aGUgYmFyIGRvZXMgdG8gdGhlIHZhbHVlc1xuICAvLyBpdCBzZXQgY2hhbmdlcyB0aGUgc2F2ZWQgZmlsdGVyLiBBIHJlYWQgYWxzbyBub3RlcyB0aGUgYmFyJ3MgdmFsdWVzXG4gIC8vIChfa2VlcEJhck9uUGljayk6IHBpY2tpbmcgYSBzYXZlZCBmaWx0ZXIgcmVhZHMgaXRzIHZhbHVlcyBhbmQgc2V0cyB0aGVcbiAgLy8gYmFyIGZyb20gdGhlbSBpbiBvbmUgZ28sIGFuZCB0aGUgaXRlbXMgaXQgZG9lcyBub3QgaG9sZCBhcmUgcHV0IGJhY2suXG4gIHByaXZhdGUgX2JhclNhdmVkRmlsdGVyKHNhdmVkRmlsdGVyOiBSZXBvcnRTYXZlZEZpbHRlcik6IElGaWx0ZXJTYXZlZEZpbHRlciB7XG4gICAgY29uc3QgZmlsdGVycyA9IHNhdmVkRmlsdGVyVmFsdWVzKHNhdmVkRmlsdGVyLmZpbHRlcnMsIHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkpO1xuICAgIGNvbnN0IGtlZXBCYXIgPSAoKSA9PiB0aGlzLl9rZWVwQmFyT25QaWNrKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHNhdmVkRmlsdGVyLmlkLFxuICAgICAgbmFtZTogc2F2ZWRGaWx0ZXIubmFtZSxcbiAgICAgIGdldCBmaWx0ZXJzKCkge1xuICAgICAgICBrZWVwQmFyKCk7XG5cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm90ZXMgdGhlIGJhcidzIHZhbHVlcyBmb3IgYSBwaWNrIG9mIGEgc2F2ZWQgZmlsdGVyIChfYmFyVmFsdWVzQXRQaWNrKS5cbiAgLy8gZnMtZmlsdGVyIHNldHMgdGhlIGJhciBmcm9tIHRoZSBzYXZlZCBmaWx0ZXIncyB2YWx1ZXMgaW4gdGhlIHNhbWUgdGFza1xuICAvLyBhcyBpdCByZWFkcyB0aGVtLCBzbyB0aGUgbm90ZSBpcyBkcm9wcGVkIG9uY2UgdGhpcyB0YXNrIGlzIGRvbmU6IGFueVxuICAvLyBvdGhlciByZWFkIG9mIGEgc2F2ZWQgZmlsdGVyJ3MgdmFsdWVzIChpdHMgcm93IGluIFZpZXcgYWxsLCBhIHNhdmUpIHNldHNcbiAgLy8gbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcEJhck9uUGljaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlcG9ydEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2JhclZhbHVlc0F0UGljayA9IHsgLi4udGhpcy5fcmVwb3J0QmFyLnZhbHVlcyB9O1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX2JhclZhbHVlc0F0UGljayA9IG51bGwpO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIGl0ZW1zLCBlYWNoIG9uZSBhIHNhdmVkIGZpbHRlciBkb2VzIG5vdCBob2xkICh0aGUgZ3JvdXAtYnlcbiAgLy8gZ3JhaW4sIHRoZSBtYXRjaCwgYSBwYWdlJ3Mgb3duIGZpbHRlcnMpIHNldCBiYWNrIHRvIGl0cyB2YWx1ZSB3aGVuIGEgcGlja1xuICAvLyBvZiBhIHNhdmVkIGZpbHRlciBzZXRzIGl0LiBmcy1maWx0ZXIgc2V0cyBldmVyeSBpdGVtIGZyb20gYSBzYXZlZCBmaWx0ZXJcbiAgLy8gYW5kIGNhbGxzIGVhY2ggb25lJ3MgY2hhbmdlIGJlZm9yZSBpdCByZXBvcnRzIHRoZSBiYXIncyBjaGFuZ2UsIHNvIHRoZVxuICAvLyBjaGFuZ2UgdGhlIGJhciByZXBvcnRzIGNhcnJpZXMgdGhlc2UgaXRlbXMgYXMgdGhleSB3ZXJlOiB0aGUgcGljayBtb3Zlc1xuICAvLyB0aGUgcmVwb3J0LXdpZGUgZmlsdGVycyBvbmx5LCBvbiBldmVyeSBwYWdlLCB0aHJvdWdoIHRoZSBzYW1lIGNoYW5nZSBhc1xuICAvLyBhIHZpZXdlcidzIG93biBlZGl0IChfYmFyQ2hhbmdlZCkuIE9uIGFueSBvdGhlciBjaGFuZ2UgYW4gaXRlbSdzIGNoYW5nZVxuICAvLyBjb21lcyBhZnRlciB0aGUgYmFyJ3MsIHdpdGggbm8gcGljayBub3RlZCwgYW5kIGRvZXMgbm90aGluZy5cbiAgcHJpdmF0ZSBfa2VlcE9uUGljayhpdGVtczogSUZpbHRlckNvbmZpZ0l0ZW1bXSk6IElGaWx0ZXJDb25maWdJdGVtW10ge1xuICAgIGNvbnN0IGhlbGQgPSBuZXcgU2V0KHRoaXMuX3NhdmVkRmlsdGVyR3JvdXBzKCkubWFwKChncm91cCkgPT4gZ3JvdXBJdGVtTmFtZShncm91cCkpKTtcblxuICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW0pID0+IChoZWxkLmhhcyhpdGVtLm5hbWUpXG4gICAgICA/IGl0ZW1cbiAgICAgIDogeyAuLi5pdGVtLCBjaGFuZ2U6IChiYXJJdGVtOiBCYXNlSXRlbTxJRmlsdGVyQ29uZmlnSXRlbT4pID0+IHRoaXMuX2tlZXBJdGVtT25QaWNrKGJhckl0ZW0pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2tlZXBJdGVtT25QaWNrKGl0ZW06IEJhc2VJdGVtPElGaWx0ZXJDb25maWdJdGVtPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9iYXJWYWx1ZXNBdFBpY2spIHtcbiAgICAgIGl0ZW0uc2V0VmFsdWUodGhpcy5fYmFyVmFsdWVzQXRQaWNrW2l0ZW0ubmFtZV0sIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYmFyJ3MgdmFsdWVzIGludG8gdGhlIHN0YXRlOiBldmVyeSBncm91cCBpdCBzaG93cywgdGhlIGdyYWluIGFuZCxcbiAgLy8gd2hlbiB0aGUgYmFyIGhhcyB0aGUgY29udHJvbCwgdGhlIG1hdGNoLlxuICBwcml2YXRlIF9iYXJDaGFuZ2VkKHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaGFzTWF0Y2g6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHsgZ3JvdXBJZCwgdmFsdWUgfSBvZiBncm91cFZhbHVlc0Zyb21RdWVyeShxdWVyeSwgdGhpcy5fcmVwb3J0R3JvdXBzKCkpKSB7XG4gICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRWYWx1ZShncm91cElkLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8vIE5vdCBhIGZpbHRlciBncm91cCDigJQgdGhlIGdyYWluIGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBxdWVyeS5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRGcmVxdWVuY3koKHF1ZXJ5W0dST1VQX0JZX0lURU1dIGFzIENoYXJ0R3JhbnVsYXJpdHkpIHx8IG51bGwpO1xuICAgIC8vIE5vciBpcyB0aGUgbWF0Y2g7IGEgYmFyIHdpdGhvdXQgdGhlIGNvbnRyb2wgbGVhdmVzIGl0IGFzIGl0IGlzLlxuICAgIGlmIChoYXNNYXRjaCkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TWF0Y2gobWF0Y2hGcm9tUXVlcnkocXVlcnkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBhcyBhbiBmcy1maWx0ZXIgaXRlbSwgb3IgbnVsbCB3aGVuIHRoZSByZXBvcnRcbiAgLy8gaGFzIG5vbmUgdG8gc2hvdy4gU2VlZGVkIGZyb20gdGhlIHNlc3Npb24gc3RhdGUgc28gdGhlIGdyYWluIHRoZSB2aWV3ZXJcbiAgLy8gcGlja2VkIHN1cnZpdmVzIHRoZSByZXBvcnQgYmVpbmcgcmUtZmV0Y2hlZCBhZnRlciBhIGNoYXQgZWRpdC5cbiAgcHJpdmF0ZSBfZ3JvdXBCeUl0ZW0oKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLnJlcG9ydCgpO1xuXG4gICAgcmV0dXJuIHJlcG9ydFxuICAgICAgPyBncm91cEJ5RmlsdGVySXRlbShyZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gVGhlIGJhcidzIE1hdGNoIGNvbnRyb2wsIHNlZWRlZCB3aXRoIHRoZSBtYXRjaCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlblxuICAvLyB0aGUgYmFyIGhvbGRzIGZld2VyIHRoYW4gdHdvIGdyb3VwcyB0aGF0IGNvbWJpbmUuXG4gIHByaXZhdGUgX21hdGNoSXRlbSgpOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICAgIHJldHVybiBtYXRjaEZpbHRlckl0ZW0odGhpcy5yZXBvcnQoKSwgdGhpcy5fcmVwb3J0R3JvdXBzKCksIHRoaXMuY2hhdFBhZ2VJZCgpLCB0aGlzLl9maWx0ZXJTdGF0ZS5tYXRjaCgpKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZzLWFpLXJlcG9ydCBmcy1jb2x1bW5cIj5cblxuICA8ZGl2IGNsYXNzPVwiZnMtYWktcmVwb3J0X19oZWFkZXIgZnMtcm93LmFsaWduLWNlbnRlclwiPlxuICAgIDxoMiBjbGFzcz1cImZzLWFpLXJlcG9ydF9fdGl0bGUgZnMtZmxleFwiPnt7IHJlcG9ydCgpPy5uYW1lIH19PC9oMj5cblxuICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgIDwhLS0gUmVwb3J0LWxldmVsIGZpbHRlcnMsIGlubGluZSB3aXRoIHRoZSB0b29sYmFyIGFjdGlvbnMsIHdpdGggdGhlXG4gICAgICAgICAgIHJlcG9ydCdzIHNhdmVkIGZpbHRlcnMgaW4gZnMtZmlsdGVyJ3Mgb3duIFNhdmVkIGZpbHRlcnMgbWVudS5cbiAgICAgICAgICAgZnMtZmlsdGVyIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBzbyBpdCdzIGtleWVkIG9uIHRoZVxuICAgICAgICAgICBmaWx0ZXIgc2lnbmF0dXJlOiB3aGVuIHRoZSByZXBvcnQtbGV2ZWwgZmlsdGVyIHNldCBjaGFuZ2VzIHRoZVxuICAgICAgICAgICBibG9jayBpcyByZWNyZWF0ZWQgYW5kIHJlLXJlYWRzIHRoZSByZWJ1aWx0IGNvbmZpZy4gLS0+XG4gICAgICBAaWYgKHJlcG9ydEhhc0ZpbHRlcnMoKSkge1xuICAgICAgICBAZm9yIChrZXkgb2YgW3JlcG9ydEZpbHRlcktleSgpXTsgdHJhY2sga2V5KSB7XG4gICAgICAgICAgPGZzLWZpbHRlclxuICAgICAgICAgICAgICBjbGFzcz1cImZzLWFpLXJlcG9ydF9fZmlsdGVyc1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwicmVwb3J0RmlsdGVyQ29uZmlnKClcIj5cbiAgICAgICAgICA8L2ZzLWZpbHRlcj5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFdoYXQgbGF5b3V0IGVkaXRpbmcgY2FuIGFkZCBvciBzd2l0Y2ggdG8sIGFuZCB0aGUgd2F5IG91dCBvZiBpdC5cbiAgICAgICAgICAgT25lIHN0eWxlIGZvciBhbGwgdGhyZWUg4oCUIG91dGxpbmVkLCBpY29uIGFuZCB0ZXh0LiBcIkhlYWRlciAmIGZvb3RlclwiXG4gICAgICAgICAgIGlzIGEgdG9nZ2xlOiBpdCBrZWVwcyBpdHMgbGFiZWwgYW5kIHR1cm5zIGdyYXkgd2hpbGUgaXQgaXMgb24uIC0tPlxuICAgICAgQGlmIChlZGl0TW9kZSgpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1haS1yZXBvcnRfX2VkaXQtdG9vbHMgZnMtcm93LmFsaWduLWNlbnRlci5nYXAteHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkZCBhIGJsb2NrIG9mIHRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkVGV4dCgpXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+dGl0bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgQWRkIHRleHRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX21hc3RlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNNYXN0ZXJNb2RlXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNNYXN0ZXJNb2RlID8gJ0JhY2sgdG8gZWRpdGluZyB0aGlzIHBhZ2UnIDogJ0VkaXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHNob3duIG9uIGV2ZXJ5IHBhZ2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1hc3Rlck1vZGUoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPndlYl9hc3NldDwvbWF0LWljb24+XG4gICAgICAgICAgICBIZWFkZXIgJiBmb290ZXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVjazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb25lIGVkaXRpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gT25lIGljb24gZm9yIGJvdGggc3RhdGVzOiBpdCByZWFkcyBhcyBwcmVzc2VkIHdoaWxlIGVkaXRpbmcgcmF0aGVyXG4gICAgICAgICAgIHRoYW4gc3dhcHBpbmcgdG8gc29tZXRoaW5nIGVsc2UuIC0tPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiZnMtYWktcmVwb3J0X190b2dnbGVcIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZWRpdE1vZGUoKVwiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiZWRpdE1vZGUoKSA/ICdEb25lIGVkaXRpbmcnIDogJ0VkaXQgbGF5b3V0J1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXRNb2RlKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmRhc2hib2FyZF9jdXN0b21pemU8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0XCJcbiAgICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJleHBvcnRNZW51XCI+XG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxmcy1tZW51ICNleHBvcnRNZW51PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBvd2VycG9pbnQoKVwiPlxuICAgICAgICAgIEV4cG9ydCBQb3dlclBvaW50XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0UGRmKClcIj5cbiAgICAgICAgICBFeHBvcnQgUERGXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RGF0YSgpXCI+XG4gICAgICAgICAgRXhwb3J0IFJhdyBEYXRhXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIEBpZiAoKHJlcG9ydCgpPy5wYWdlcz8ubGVuZ3RoID8/IDApID4gMSkge1xuICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydERhdGEodHJ1ZSlcIj5cbiAgICAgICAgICAgIEV4cG9ydCBSYXcgRGF0YSAoVGhpcyBQYWdlKVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIH1cbiAgICAgIDwvZnMtbWVudT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZXBvcnQgc2V0dGluZ3NcIlxuICAgICAgICAgIChjbGljayk9XCJyZXBvcnRTZXR0aW5ncygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAgICNzcGxpdFxuICAgICAgY2xhc3M9XCJmcy1haS1yZXBvcnRfX3NwbGl0IGZzLXJvdy5hbGlnbi1zdGFydFwiPlxuICAgIDxmcy1haS1jaGF0XG4gICAgICAgICNjaGF0UGFuZWxcbiAgICAgICAgY2xhc3M9XCJjaGF0XCJcbiAgICAgICAgW2Jhc2VQYXRoXT1cImJhc2VQYXRoKClcIlxuICAgICAgICBbcmVxdWVzdERhdGFdPVwiY2hhdFJlcXVlc3REYXRhKClcIlxuICAgICAgICBbcmVhZHldPVwiY2hhdFBhZ2VJZCgpICE9PSBudWxsXCJcbiAgICAgICAgKHJlc3BvbnNlKT1cIm9uQ2hhdFJlc3BvbnNlKCRldmVudClcIj5cbiAgICA8L2ZzLWFpLWNoYXQ+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicmVzaXplclwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJ2aWV3ZXIgZnMtZmxleCBmcy1jb2x1bW5cIj5cbiAgICAgIEBpZiAocmVwb3J0KCkpIHtcbiAgICAgICAgPGFwcC1yZXBvcnQtY2FudmFzXG4gICAgICAgICAgICBbcmVwb3J0XT1cInJlcG9ydCgpXCJcbiAgICAgICAgICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZSgpXCJcbiAgICAgICAgICAgIFtwYWdlSWRdPVwicGFnZUlkKClcIlxuICAgICAgICAgICAgKGNvbXBvbmVudFNldHRpbmdzKT1cImNvbXBvbmVudFNldHRpbmdzKCRldmVudClcIlxuICAgICAgICAgICAgKHJlcG9ydENoYW5nZWQpPVwib25DYW52YXNSZXBvcnRDaGFuZ2VkKClcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cIm9uQ2FudmFzUGFnZUNoYW5nZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L2FwcC1yZXBvcnQtY2FudmFzPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -4,7 +4,7 @@ import * as echarts from 'echarts/core';
4
4
  export { echarts as default };
5
5
  import { LabelLayout } from 'echarts/features';
6
6
  import { CanvasRenderer } from 'echarts/renderers';
7
- import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-Bnv62suw.mjs';
7
+ import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-CHPA7sla.mjs';
8
8
 
9
9
  // Tree-shaken ECharts build for the reports renderer: only the chart types and
10
10
  // components the option-builder emits are registered, keeping the lazy chunk
@@ -63,4 +63,4 @@ echarts.registerTheme('report', {
63
63
  axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },
64
64
  },
65
65
  });
66
- //# sourceMappingURL=firestitch-report-echarts-DKXlgu1D.mjs.map
66
+ //# sourceMappingURL=firestitch-report-echarts-CoaGXKET.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"firestitch-report-echarts-DKXlgu1D.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}
1
+ {"version":3,"file":"firestitch-report-echarts-CoaGXKET.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}