@provoly/dashboard 1.4.57 → 1.4.59

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 (97) hide show
  1. package/esm2022/admin/components/admin-abac-rules/admin-abac-rules-form/admin-abac-rules-form.component.mjs +1 -1
  2. package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +1 -1
  3. package/esm2022/admin/components/admin-abac-rules/components/metadata-condition/metadata-condition.component.mjs +1 -1
  4. package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +1 -1
  5. package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +1 -1
  6. package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +1 -1
  7. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +1 -1
  8. package/esm2022/admin/components/admin-dataset/admin-form-dataset/admin-form-dataset.component.mjs +1 -1
  9. package/esm2022/admin/components/admin-environment/admin-environment-form/admin-environment-form.component.mjs +1 -1
  10. package/esm2022/admin/components/admin-fields/admin-fields-form/admin-fields-form.component.mjs +1 -1
  11. package/esm2022/admin/components/admin-links/admin-links-new/admin-links-new.component.mjs +1 -1
  12. package/esm2022/admin/components/admin-metadata/shared/form-metadata/form-metadata.component.mjs +1 -1
  13. package/esm2022/admin/components/admin-metadata-rules/shared/admin-form-metadata-rules/admin-form-metadata-rules.component.mjs +1 -1
  14. package/esm2022/components/metadata-editor/metadata-editor.component.mjs +1 -1
  15. package/esm2022/components/scheme-picker/scheme-picker.component.mjs +1 -1
  16. package/esm2022/filters/autocomplete/autocomplete.component.mjs +1 -1
  17. package/esm2022/filters/list/list-filter.component.mjs +1 -1
  18. package/esm2022/import/components/form/import-form.component.mjs +1 -1
  19. package/esm2022/import/components/list/import-list.component.mjs +1 -1
  20. package/esm2022/lib/core/components/overlay/dialog.service.mjs +4 -2
  21. package/esm2022/lib/core/components/select/select.component.mjs +8 -4
  22. package/esm2022/lib/core/components/share/access-rights-share/access-rights-share.component.mjs +1 -1
  23. package/esm2022/lib/core/components/share/legacy-share/share.component.mjs +1 -1
  24. package/esm2022/lib/dashboard/components/context-menu/object-edition/object-edition.component.mjs +1 -1
  25. package/esm2022/lib/dashboard/components/dashboard.component.mjs +22 -12
  26. package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-list/datasource-list.component.mjs +1 -1
  27. package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +90 -19
  28. package/esm2022/lib/dashboard/store/dashboard.selectors.mjs +3 -2
  29. package/esm2022/lib/dashboard/store/manifest.service.mjs +5 -3
  30. package/esm2022/pipeline-components/filter/component/filter.component.mjs +1 -1
  31. package/esm2022/pipeline-components/input-datasource/component/input-datasource.component.mjs +1 -1
  32. package/esm2022/pipeline-components/output-dataset/component/output-dataset.component.mjs +1 -1
  33. package/esm2022/restitution/components/restitution/restitution.component.mjs +1 -1
  34. package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +1 -1
  35. package/esm2022/search/search-mono-class/components/search-mono-class/search-mono-class.component.mjs +1 -1
  36. package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +1 -1
  37. package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +1 -1
  38. package/esm2022/toolbox/components/filter-settings/filter-settings.component.mjs +1 -1
  39. package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +1 -1
  40. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +1 -1
  41. package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +1 -1
  42. package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +1 -1
  43. package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +1 -1
  44. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +1 -1
  45. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +1 -1
  46. package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +1 -1
  47. package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +5 -5
  48. package/fesm2022/provoly-dashboard-admin.mjs +13 -13
  49. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  50. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +1 -1
  51. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
  52. package/fesm2022/provoly-dashboard-components-scheme-picker.mjs +1 -1
  53. package/fesm2022/provoly-dashboard-components-scheme-picker.mjs.map +1 -1
  54. package/fesm2022/provoly-dashboard-filters-autocomplete.mjs +1 -1
  55. package/fesm2022/provoly-dashboard-filters-autocomplete.mjs.map +1 -1
  56. package/fesm2022/provoly-dashboard-filters-list.mjs +1 -1
  57. package/fesm2022/provoly-dashboard-filters-list.mjs.map +1 -1
  58. package/fesm2022/provoly-dashboard-import.mjs +2 -2
  59. package/fesm2022/provoly-dashboard-import.mjs.map +1 -1
  60. package/fesm2022/provoly-dashboard-pipeline-components-filter.mjs +1 -1
  61. package/fesm2022/provoly-dashboard-pipeline-components-filter.mjs.map +1 -1
  62. package/fesm2022/provoly-dashboard-pipeline-components-input-datasource.mjs +1 -1
  63. package/fesm2022/provoly-dashboard-pipeline-components-input-datasource.mjs.map +1 -1
  64. package/fesm2022/provoly-dashboard-pipeline-components-output-dataset.mjs +1 -1
  65. package/fesm2022/provoly-dashboard-pipeline-components-output-dataset.mjs.map +1 -1
  66. package/fesm2022/provoly-dashboard-restitution.mjs +1 -1
  67. package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
  68. package/fesm2022/provoly-dashboard-search.mjs +4 -4
  69. package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
  70. package/fesm2022/provoly-dashboard-toolbox.mjs +2 -2
  71. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  72. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +1 -1
  73. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  74. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
  75. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
  76. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +1 -1
  77. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
  78. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +1 -1
  79. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
  80. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +1 -1
  81. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  82. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +1 -1
  83. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  84. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +1 -1
  85. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
  86. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +4 -4
  87. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  88. package/fesm2022/provoly-dashboard.mjs +206 -118
  89. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  90. package/lib/core/components/overlay/dialog.service.d.ts +2 -0
  91. package/lib/core/components/select/select.component.d.ts +3 -2
  92. package/lib/dashboard/components/dashboard.component.d.ts +8 -1
  93. package/lib/dashboard/components/widgets/header/widget-header.component.d.ts +18 -1
  94. package/lib/dashboard/store/dashboard.selectors.d.ts +17 -0
  95. package/lib/dashboard/store/manifest.service.d.ts +11 -2
  96. package/package.json +37 -37
  97. package/styles/components/_o-widget.scss +28 -0
@@ -24,12 +24,13 @@ import { DataSourceSelectors } from '../../core/store/data-source/data-source.se
24
24
  import * as i0 from "@angular/core";
25
25
  import * as i1 from "@ngrx/store";
26
26
  import * as i2 from "@angular/cdk/overlay";
27
- import * as i3 from "../../core/components/icon/icon.component";
28
- import * as i4 from "@provoly/dashboard/components/page-loader";
29
- import * as i5 from "./widgets/widget-instanciator/widget-instanciator.component";
30
- import * as i6 from "./context-menu/context-menu.component";
31
- import * as i7 from "@angular/common";
32
- import * as i8 from "../../core/i18n/i18n.pipe";
27
+ import * as i3 from "../store/manifest.service";
28
+ import * as i4 from "../../core/components/icon/icon.component";
29
+ import * as i5 from "@provoly/dashboard/components/page-loader";
30
+ import * as i6 from "./widgets/widget-instanciator/widget-instanciator.component";
31
+ import * as i7 from "./context-menu/context-menu.component";
32
+ import * as i8 from "@angular/common";
33
+ import * as i9 from "../../core/i18n/i18n.pipe";
33
34
  export const MIME_TYPE_WIDGET_MANIFEST = 'application/widget-manifest';
34
35
  export const MIME_TYPE_WIDGET_TYPE = 'application/widget-type-';
35
36
  export const MIME_TYPE_WIDGET_SIZE = 'application/widget-size-';
@@ -43,11 +44,12 @@ export class DashboardComponent extends SubscriptionnerDirective {
43
44
  set forceModeEdition(mode) {
44
45
  this.forceModeEdition$.next(mode);
45
46
  }
46
- constructor(store, overlay, viewContainerRef, el) {
47
+ constructor(store, overlay, viewContainerRef, manifestService, el) {
47
48
  super();
48
49
  this.store = store;
49
50
  this.overlay = overlay;
50
51
  this.viewContainerRef = viewContainerRef;
52
+ this.manifestService = manifestService;
51
53
  this.el = el;
52
54
  this.manifest = null;
53
55
  this.modeEdition = false;
@@ -57,6 +59,11 @@ export class DashboardComponent extends SubscriptionnerDirective {
57
59
  this.params = {};
58
60
  this.forceModeEdition$ = new BehaviorSubject(undefined);
59
61
  this._dashboardSize$ = new BehaviorSubject({ width: 300, height: 300 });
62
+ this.widgetZoomIn = {
63
+ index: 0,
64
+ zoom: false,
65
+ layout: {}
66
+ };
60
67
  this.CloseOnDragOut = true;
61
68
  this.noBackground = false;
62
69
  this.canCalculateView = false;
@@ -85,6 +92,9 @@ export class DashboardComponent extends SubscriptionnerDirective {
85
92
  };
86
93
  this.DashboardGridLayout = DashboardGridLayout;
87
94
  this.layout = DashboardGridLayout.MANUAL;
95
+ this.manifestService.widgetZoomIn.subscribe((result) => {
96
+ this.widgetZoomIn = result;
97
+ });
88
98
  this.loading$ = this.store.select(DashboardSelectors.loading);
89
99
  this.dataFetching$ = this.store.select(SearchSelectors.searchLoading).pipe(delay(10));
90
100
  this.modeEdition$ = combineLatest([
@@ -582,13 +592,13 @@ export class DashboardComponent extends SubscriptionnerDirective {
582
592
  }
583
593
  }));
584
594
  }
585
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
586
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: DashboardComponent, selector: "pry-dashboard", inputs: { staticDashboard: "staticDashboard", forceModeEdition: "forceModeEdition", CloseOnDragOut: "CloseOnDragOut", displayOptions: "displayOptions", noBackground: "noBackground", breakpoint: "breakpoint" }, outputs: { rowHeight: "rowHeight", rows: "rows" }, viewQueries: [{ propertyName: "templateModal", first: true, predicate: ["templateModal"], descendants: true, read: TemplateRef }, { propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }, { propertyName: "instanciators", predicate: WidgetInstanciatorComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-dashboard-edit\" [class.-edit]=\"modeEdition$ | async\">\n <div class=\"o-dashboard-add -rows\">\n <button (click)=\"changeSize('rows', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('rows', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <p>{{ '@pry.grid.rows' | i18n }}</p>\n </div>\n <div class=\"o-dashboard-add -cols\">\n <p>{{ '@pry.grid.columns' | i18n }}</p>\n <button (click)=\"changeSize('columns', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('columns', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n </div>\n <div\n class=\"o-dashboard-grid\"\n [style.gridTemplateColumns]=\"gridTemplateColumns$ | async\"\n [style.gridTemplateRows]=\"gridTemplateRows$ | async\"\n [style.gridGap]=\"dashboardParams.gridGap + 'px'\"\n #grid\n (mousemove)=\"movingMouse($event)\"\n (drop)=\"dropping($event)\"\n (dragover)=\"dragMove($event)\"\n (dragleave)=\"dragLeave($event)\"\n (dragenter)=\"dragEnter($event)\"\n >\n @for (\n widgetManifest of (windowManifest$ | async)?.widgets || [];\n track trackWidgets(widgetIndex, widgetManifest);\n let widgetIndex = $index\n ) {\n <div\n class=\"o-dashboard-widget\"\n [class.-edited]=\"modeEdition\"\n [style.gridColumn]=\"gridColumn(widgetManifest.layout)\"\n [style.gridRow]=\"gridRow(widgetManifest.layout)\"\n (drop)=\"droppingInWidget($event, widgetIndex)\"\n >\n @if (modeEdition) {\n <div class=\"resize nw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-nw')\">\n <pry-icon iconSvg=\"north_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize sw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-sw')\">\n <pry-icon iconSvg=\"south_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize ne-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-ne')\">\n <pry-icon iconSvg=\"north_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize se-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-se')\">\n <pry-icon iconSvg=\"south_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize delete\" (mousedown)=\"toggleRemoveConfirm($event, widgetIndex)\">\n <pry-icon iconSvg=\"close\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"move\" draggable=\"true\" (dragstart)=\"dragStart($event, widgetIndex)\">\n <div class=\"move-inside move-{{ widgetManifest.type }}\">\n <span>{{ widgetManifest.title ?? ('@pry.toolbox.' + widgetManifest.type | i18n) }}</span>\n </div>\n </div>\n }\n @if (!modeEdition) {\n <pry-widget-instanciator\n [staticManifest]=\"widgetManifest\"\n [widgetIndex]=\"widgetIndex\"\n ></pry-widget-instanciator>\n }\n </div>\n }\n\n @if (!noBackground) {\n @if (\n {\n noWidgets: (nonFillerWidgets$ | async) === 0,\n globalLoading: loading$ | async,\n fetchLoading: (dataFetching$ | async)?.length ?? 1 > 0\n };\n as data\n ) {\n @if (data.noWidgets) {\n @if (data.globalLoading) {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <pry-page-loader></pry-page-loader>\n <span class=\"no-widget__text\">{{ '@pry.widget.target.loading' | i18n }}...</span>\n </div>\n } @else {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <img\n class=\"no-widget__search\"\n src=\"../../../assets/svgs/pry_recherche.svg\"\n alt=\"{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}\"\n />\n <span class=\"no-widget__text\">{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}</span>\n </div>\n }\n }\n <div\n class=\"a-page-loader backdrop\"\n [style.display]=\"data.fetchLoading && !data.globalLoading ? 'flex' : 'none'\"\n [style.width.px]=\"(dashboardSize$ | async)?.width\"\n [style.height.px]=\"(dashboardSize$ | async)?.height\"\n >\n <pry-page-loader></pry-page-loader>\n <p>{{ '@pry.widget.target.loading' | i18n }}...</p>\n </div>\n }\n }\n </div>\n</div>\n<pry-context-menu></pry-context-menu>\n\n<ng-template #templateModal>\n <div class=\"o-modal\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i3.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PryPageLoaderComponent, selector: "pry-page-loader", inputs: ["image", "imageAltText"] }, { kind: "component", type: i5.WidgetInstanciatorComponent, selector: "pry-widget-instanciator", inputs: ["widgetIndex", "staticManifest", "standalone", "open$"], outputs: ["manifestModified"] }, { kind: "component", type: i6.ContextMenuComponent, selector: "pry-context-menu" }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.I18nPipe, name: "i18n" }] }); }
595
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.Store }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i3.ManifestService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
596
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: DashboardComponent, selector: "pry-dashboard", inputs: { staticDashboard: "staticDashboard", forceModeEdition: "forceModeEdition", CloseOnDragOut: "CloseOnDragOut", displayOptions: "displayOptions", noBackground: "noBackground", breakpoint: "breakpoint" }, outputs: { rowHeight: "rowHeight", rows: "rows" }, viewQueries: [{ propertyName: "templateModal", first: true, predicate: ["templateModal"], descendants: true, read: TemplateRef }, { propertyName: "gridRef", first: true, predicate: ["grid"], descendants: true }, { propertyName: "instanciators", predicate: WidgetInstanciatorComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"o-dashboard-edit\" [class.-edit]=\"modeEdition$ | async\">\n <div class=\"o-dashboard-add -rows\">\n <button (click)=\"changeSize('rows', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('rows', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <p>{{ '@pry.grid.rows' | i18n }}</p>\n </div>\n <div class=\"o-dashboard-add -cols\">\n <p>{{ '@pry.grid.columns' | i18n }}</p>\n <button (click)=\"changeSize('columns', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('columns', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n </div>\n <div\n class=\"o-dashboard-grid\"\n [style.gridTemplateColumns]=\"gridTemplateColumns$ | async\"\n [style.gridTemplateRows]=\"gridTemplateRows$ | async\"\n [style.gridGap]=\"dashboardParams.gridGap + 'px'\"\n #grid\n (mousemove)=\"movingMouse($event)\"\n (drop)=\"dropping($event)\"\n (dragover)=\"dragMove($event)\"\n (dragleave)=\"dragLeave($event)\"\n (dragenter)=\"dragEnter($event)\"\n >\n @for (\n widgetManifest of (windowManifest$ | async)?.widgets || [];\n track trackWidgets(widgetIndex, widgetManifest);\n let widgetIndex = $index\n ) {\n <div\n class=\"o-dashboard-widget\"\n [class.-edited]=\"modeEdition\"\n [class.widget-zoom-in]=\"widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom\"\n [style.gridColumn]=\"\n gridColumn(\n widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom ? widgetZoomIn.layout : widgetManifest.layout\n )\n \"\n [style.gridRow]=\"\n gridRow(widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom ? widgetZoomIn.layout : widgetManifest.layout)\n \"\n (drop)=\"droppingInWidget($event, widgetIndex)\"\n >\n @if (modeEdition) {\n <div class=\"resize nw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-nw')\">\n <pry-icon iconSvg=\"north_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize sw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-sw')\">\n <pry-icon iconSvg=\"south_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize ne-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-ne')\">\n <pry-icon iconSvg=\"north_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize se-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-se')\">\n <pry-icon iconSvg=\"south_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize delete\" (mousedown)=\"toggleRemoveConfirm($event, widgetIndex)\">\n <pry-icon iconSvg=\"close\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"move\" draggable=\"true\" (dragstart)=\"dragStart($event, widgetIndex)\">\n <div class=\"move-inside move-{{ widgetManifest.type }}\">\n <span>{{ widgetManifest.title ?? ('@pry.toolbox.' + widgetManifest.type | i18n) }}</span>\n </div>\n </div>\n }\n @if (!modeEdition) {\n <pry-widget-instanciator\n [staticManifest]=\"widgetManifest\"\n [widgetIndex]=\"widgetIndex\"\n ></pry-widget-instanciator>\n }\n </div>\n }\n\n @if (!noBackground) {\n @if (\n {\n noWidgets: (nonFillerWidgets$ | async) === 0,\n globalLoading: loading$ | async,\n fetchLoading: (dataFetching$ | async)?.length ?? 1 > 0\n };\n as data\n ) {\n @if (data.noWidgets) {\n @if (data.globalLoading) {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <pry-page-loader></pry-page-loader>\n <span class=\"no-widget__text\">{{ '@pry.widget.target.loading' | i18n }}...</span>\n </div>\n } @else {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <img\n class=\"no-widget__search\"\n src=\"../../../assets/svgs/pry_recherche.svg\"\n alt=\"{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}\"\n />\n <span class=\"no-widget__text\">{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}</span>\n </div>\n }\n }\n <div\n class=\"a-page-loader backdrop\"\n [style.display]=\"data.fetchLoading && !data.globalLoading ? 'flex' : 'none'\"\n [style.width.px]=\"(dashboardSize$ | async)?.width\"\n [style.height.px]=\"(dashboardSize$ | async)?.height\"\n >\n <pry-page-loader></pry-page-loader>\n <p>{{ '@pry.widget.target.loading' | i18n }}...</p>\n </div>\n }\n }\n </div>\n</div>\n<pry-context-menu></pry-context-menu>\n\n<ng-template #templateModal>\n <div class=\"o-modal\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: i4.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i5.PryPageLoaderComponent, selector: "pry-page-loader", inputs: ["image", "imageAltText"] }, { kind: "component", type: i6.WidgetInstanciatorComponent, selector: "pry-widget-instanciator", inputs: ["widgetIndex", "staticManifest", "standalone", "open$"], outputs: ["manifestModified"] }, { kind: "component", type: i7.ContextMenuComponent, selector: "pry-context-menu" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.I18nPipe, name: "i18n" }] }); }
587
597
  }
588
598
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: DashboardComponent, decorators: [{
589
599
  type: Component,
590
- args: [{ selector: 'pry-dashboard', template: "<div class=\"o-dashboard-edit\" [class.-edit]=\"modeEdition$ | async\">\n <div class=\"o-dashboard-add -rows\">\n <button (click)=\"changeSize('rows', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('rows', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <p>{{ '@pry.grid.rows' | i18n }}</p>\n </div>\n <div class=\"o-dashboard-add -cols\">\n <p>{{ '@pry.grid.columns' | i18n }}</p>\n <button (click)=\"changeSize('columns', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('columns', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n </div>\n <div\n class=\"o-dashboard-grid\"\n [style.gridTemplateColumns]=\"gridTemplateColumns$ | async\"\n [style.gridTemplateRows]=\"gridTemplateRows$ | async\"\n [style.gridGap]=\"dashboardParams.gridGap + 'px'\"\n #grid\n (mousemove)=\"movingMouse($event)\"\n (drop)=\"dropping($event)\"\n (dragover)=\"dragMove($event)\"\n (dragleave)=\"dragLeave($event)\"\n (dragenter)=\"dragEnter($event)\"\n >\n @for (\n widgetManifest of (windowManifest$ | async)?.widgets || [];\n track trackWidgets(widgetIndex, widgetManifest);\n let widgetIndex = $index\n ) {\n <div\n class=\"o-dashboard-widget\"\n [class.-edited]=\"modeEdition\"\n [style.gridColumn]=\"gridColumn(widgetManifest.layout)\"\n [style.gridRow]=\"gridRow(widgetManifest.layout)\"\n (drop)=\"droppingInWidget($event, widgetIndex)\"\n >\n @if (modeEdition) {\n <div class=\"resize nw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-nw')\">\n <pry-icon iconSvg=\"north_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize sw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-sw')\">\n <pry-icon iconSvg=\"south_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize ne-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-ne')\">\n <pry-icon iconSvg=\"north_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize se-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-se')\">\n <pry-icon iconSvg=\"south_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize delete\" (mousedown)=\"toggleRemoveConfirm($event, widgetIndex)\">\n <pry-icon iconSvg=\"close\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"move\" draggable=\"true\" (dragstart)=\"dragStart($event, widgetIndex)\">\n <div class=\"move-inside move-{{ widgetManifest.type }}\">\n <span>{{ widgetManifest.title ?? ('@pry.toolbox.' + widgetManifest.type | i18n) }}</span>\n </div>\n </div>\n }\n @if (!modeEdition) {\n <pry-widget-instanciator\n [staticManifest]=\"widgetManifest\"\n [widgetIndex]=\"widgetIndex\"\n ></pry-widget-instanciator>\n }\n </div>\n }\n\n @if (!noBackground) {\n @if (\n {\n noWidgets: (nonFillerWidgets$ | async) === 0,\n globalLoading: loading$ | async,\n fetchLoading: (dataFetching$ | async)?.length ?? 1 > 0\n };\n as data\n ) {\n @if (data.noWidgets) {\n @if (data.globalLoading) {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <pry-page-loader></pry-page-loader>\n <span class=\"no-widget__text\">{{ '@pry.widget.target.loading' | i18n }}...</span>\n </div>\n } @else {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <img\n class=\"no-widget__search\"\n src=\"../../../assets/svgs/pry_recherche.svg\"\n alt=\"{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}\"\n />\n <span class=\"no-widget__text\">{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}</span>\n </div>\n }\n }\n <div\n class=\"a-page-loader backdrop\"\n [style.display]=\"data.fetchLoading && !data.globalLoading ? 'flex' : 'none'\"\n [style.width.px]=\"(dashboardSize$ | async)?.width\"\n [style.height.px]=\"(dashboardSize$ | async)?.height\"\n >\n <pry-page-loader></pry-page-loader>\n <p>{{ '@pry.widget.target.loading' | i18n }}...</p>\n </div>\n }\n }\n </div>\n</div>\n<pry-context-menu></pry-context-menu>\n\n<ng-template #templateModal>\n <div class=\"o-modal\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n" }]
591
- }], ctorParameters: () => [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ElementRef }], propDecorators: { templateModal: [{
600
+ args: [{ selector: 'pry-dashboard', template: "<div class=\"o-dashboard-edit\" [class.-edit]=\"modeEdition$ | async\">\n <div class=\"o-dashboard-add -rows\">\n <button (click)=\"changeSize('rows', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('rows', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <p>{{ '@pry.grid.rows' | i18n }}</p>\n </div>\n <div class=\"o-dashboard-add -cols\">\n <p>{{ '@pry.grid.columns' | i18n }}</p>\n <button (click)=\"changeSize('columns', -1)\">\n <pry-icon iconSvg=\"remove\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n <button (click)=\"changeSize('columns', +1)\">\n <pry-icon iconSvg=\"add\" [width]=\"12\" [height]=\"12\"></pry-icon>\n </button>\n </div>\n <div\n class=\"o-dashboard-grid\"\n [style.gridTemplateColumns]=\"gridTemplateColumns$ | async\"\n [style.gridTemplateRows]=\"gridTemplateRows$ | async\"\n [style.gridGap]=\"dashboardParams.gridGap + 'px'\"\n #grid\n (mousemove)=\"movingMouse($event)\"\n (drop)=\"dropping($event)\"\n (dragover)=\"dragMove($event)\"\n (dragleave)=\"dragLeave($event)\"\n (dragenter)=\"dragEnter($event)\"\n >\n @for (\n widgetManifest of (windowManifest$ | async)?.widgets || [];\n track trackWidgets(widgetIndex, widgetManifest);\n let widgetIndex = $index\n ) {\n <div\n class=\"o-dashboard-widget\"\n [class.-edited]=\"modeEdition\"\n [class.widget-zoom-in]=\"widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom\"\n [style.gridColumn]=\"\n gridColumn(\n widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom ? widgetZoomIn.layout : widgetManifest.layout\n )\n \"\n [style.gridRow]=\"\n gridRow(widgetZoomIn.index === widgetIndex && widgetZoomIn.zoom ? widgetZoomIn.layout : widgetManifest.layout)\n \"\n (drop)=\"droppingInWidget($event, widgetIndex)\"\n >\n @if (modeEdition) {\n <div class=\"resize nw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-nw')\">\n <pry-icon iconSvg=\"north_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize sw-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-sw')\">\n <pry-icon iconSvg=\"south_west\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize ne-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-ne')\">\n <pry-icon iconSvg=\"north_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize se-resize\" (mousedown)=\"startResize($event, widgetIndex, 'resize-se')\">\n <pry-icon iconSvg=\"south_east\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"resize delete\" (mousedown)=\"toggleRemoveConfirm($event, widgetIndex)\">\n <pry-icon iconSvg=\"close\" [animation]=\"false\"></pry-icon>\n </div>\n <div class=\"move\" draggable=\"true\" (dragstart)=\"dragStart($event, widgetIndex)\">\n <div class=\"move-inside move-{{ widgetManifest.type }}\">\n <span>{{ widgetManifest.title ?? ('@pry.toolbox.' + widgetManifest.type | i18n) }}</span>\n </div>\n </div>\n }\n @if (!modeEdition) {\n <pry-widget-instanciator\n [staticManifest]=\"widgetManifest\"\n [widgetIndex]=\"widgetIndex\"\n ></pry-widget-instanciator>\n }\n </div>\n }\n\n @if (!noBackground) {\n @if (\n {\n noWidgets: (nonFillerWidgets$ | async) === 0,\n globalLoading: loading$ | async,\n fetchLoading: (dataFetching$ | async)?.length ?? 1 > 0\n };\n as data\n ) {\n @if (data.noWidgets) {\n @if (data.globalLoading) {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <pry-page-loader></pry-page-loader>\n <span class=\"no-widget__text\">{{ '@pry.widget.target.loading' | i18n }}...</span>\n </div>\n } @else {\n <div class=\"no-widget\" [style.grid-area]=\"backgroundArea$ | async\">\n <img\n class=\"no-widget__search\"\n src=\"../../../assets/svgs/pry_recherche.svg\"\n alt=\"{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}\"\n />\n <span class=\"no-widget__text\">{{\n (layout === DashboardGridLayout.MANUAL\n ? '@pry.widget.target.none_manual'\n : '@pry.widget.target.none_auto'\n ) | i18n\n }}</span>\n </div>\n }\n }\n <div\n class=\"a-page-loader backdrop\"\n [style.display]=\"data.fetchLoading && !data.globalLoading ? 'flex' : 'none'\"\n [style.width.px]=\"(dashboardSize$ | async)?.width\"\n [style.height.px]=\"(dashboardSize$ | async)?.height\"\n >\n <pry-page-loader></pry-page-loader>\n <p>{{ '@pry.widget.target.loading' | i18n }}...</p>\n </div>\n }\n }\n </div>\n</div>\n<pry-context-menu></pry-context-menu>\n\n<ng-template #templateModal>\n <div class=\"o-modal\">\n <div class=\"o-modal__top\">\n <div class=\"o-modal__top__title\">\n <h2 class=\"a-h2\" id=\"dialog_title\">\n {{ '@pry.widget.modalTitle' | i18n }}\n </h2>\n </div>\n <div class=\"o-modal__top__close\">\n <button class=\"a-btn a-btn--icon-only\" (click)=\"cancelRemoveConfirm()\">\n <pry-icon iconSvg=\"close\" [height]=\"35\" [width]=\"35\"></pry-icon>\n <span class=\"u-visually-hidden\">{{ '@pry.toolbox.close' | i18n }}</span>\n </button>\n </div>\n </div>\n <div class=\"m-btn-group\">\n <button type=\"button\" (click)=\"cancelRemoveConfirm()\" class=\"a-btn a-btn--secondary\">\n {{ '@pry.toolbox.manifest.close' | i18n }}\n </button>\n <button type=\"submit\" (click)=\"confirmRemove()\" class=\"a-btn a-btn--primary\">\n {{ '@pry.toolbox.manifest.validate' | i18n }}\n </button>\n </div>\n </div>\n</ng-template>\n" }]
601
+ }], ctorParameters: () => [{ type: i1.Store }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i3.ManifestService }, { type: i0.ElementRef }], propDecorators: { templateModal: [{
592
602
  type: ViewChild,
593
603
  args: ['templateModal', { read: TemplateRef }]
594
604
  }], instanciators: [{
@@ -614,4 +624,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
614
624
  }], rows: [{
615
625
  type: Output
616
626
  }] } });
617
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2xpYi9kYXNoYm9hcmQvY29tcG9uZW50cy9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvbGliL2Rhc2hib2FyZC9jb21wb25lbnRzL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxtQkFBbUIsRUFJcEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztB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Q0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDLElBQUksRUFBRSxPQUFPLElBQUksc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xHO1NBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUNqQixnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQztZQUN2QyxRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxJQUFJLENBQUMsUUFBUztnQkFDakIsSUFBSSxFQUFFO29CQUNKLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzlCLEdBQUcsVUFBVTtpQkFDZDthQUNGO1NBQ0YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOzhHQTN2QlUsa0JBQWtCO2tHQUFsQixrQkFBa0IscVpBU08sV0FBVyxrSUFJakMsMkJBQTJCLHVFQ3RGM0MsbWpNQXNKQTs7MkZEN0VhLGtCQUFrQjtrQkFKOUIsU0FBUzsrQkFDRSxlQUFlO3dKQVkwQixhQUFhO3NCQUEvRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBSU4sYUFBYTtzQkFBdkQsWUFBWTt1QkFBQywyQkFBMkI7Z0JBVzVCLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSU8sZ0JBQWdCO3NCQUE1QixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVhLE9BQU87c0JBQXpCLFNBQVM7dUJBQUMsTUFBTTtnQkFlUixVQUFVO3NCQUFsQixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbC9lczYnO1xuaW1wb3J0IHtcbiAgYXVkaXRUaW1lLFxuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGlzcGxheU9wdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVsL2Rpc3BsYXktb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkR3JpZExheW91dCxcbiAgRGFzaGJvYXJkTWFuaWZlc3QsXG4gIFdpZGdldExheW91dCxcbiAgV2lkZ2V0TWFuaWZlc3Rcbn0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbC9tYW5pZmVzdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTUlNRV9UWVBFX1JFU1VMVFNFVCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWwvbWltZXR5cGUtcmVzdWx0c2V0LmNvbnN0YW50JztcbmltcG9ydCB7IENhdGVnb3J5QWN0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvY2F0ZWdvcnkvY2F0ZWdvcnkuYWN0aW9ucyc7XG5pbXBvcnQgeyBDbGFzc0FjdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL2NsYXNzL2NsYXNzLmFjdGlvbnMnO1xuaW1wb3J0IHsgQ29uZmlnQWN0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvY29uZmlnL2NvbmZpZy5hY3Rpb25zJztcbmltcG9ydCB7IENvbmZpZ1NlbGVjdG9ycyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvY29uZmlnL2NvbmZpZy5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZUFjdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL2RhdGEtc291cmNlL2RhdGEtc291cmNlLmFjdGlvbnMnO1xuaW1wb3J0IHsgRmllbGRBY3Rpb25zIH0gZnJvbSAnLi4vLi4vY29yZS9zdG9yZS9maWVsZC9maWVsZC5hY3Rpb25zJztcbmltcG9ydCB7IFJlbGF0aW9uVHlwZXNBY3Rpb25zIH0gZnJvbSAnLi4vLi4vY29yZS9zdG9yZS9yZWxhdGlvbi10eXBlcy9yZWxhdGlvbi10eXBlcy5hY3Rpb25zJztcbmltcG9ydCB7IFdpZGdldFBsYWNlbWVudFV0aWxzIH0gZnJvbSAnLi4vY29tcG9uZW50cy93aWRnZXRzL3dpZGdldC1wbGFjZW1lbnQvd2lkZ2V0LXBsYWNlbWVudC51dGlscyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRBY3Rpb25zLCBEYXNoYm9hcmRDZWxsUGFyYW1zLCBWaWV3TW9kZSB9IGZyb20gJy4uL3N0b3JlL2Rhc2hib2FyZC5hY3Rpb25zJztcbmltcG9ydCB7XG4gIERFRkFVTFRfQ09MVU1OU19OVU1CRVIsXG4gIERFRkFVTFRfR0FQX1BYLFxuICBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gIERFRkFVTFRfUk9XU19OVU1CRVJcbn0gZnJvbSAnLi4vc3RvcmUvZGFzaGJvYXJkLmNvbnRhbnRzJztcbmltcG9ydCB7IERhc2hib2FyZFNlbGVjdG9ycyB9IGZyb20gJy4uL3N0b3JlL2Rhc2hib2FyZC5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgc29sdmVDb2xsaXNpb25zIH0gZnJvbSAnLi9zb2x2ZS1jb2xsaXNpb25zLmZ1bmN0aW9uJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbm5lckRpcmVjdGl2ZSB9IGZyb20gJy4vc3Vic2NyaXB0aW9ubmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXaWRnZXRJbnN0YW5jaWF0b3JDb21wb25lbnQgfSBmcm9tICcuL3dpZGdldHMvd2lkZ2V0LWluc3RhbmNpYXRvci93aWRnZXQtaW5zdGFuY2lhdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hTZWxlY3RvcnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL3NlYXJjaC9zZWFyY2guc2VsZWN0b3JzJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZWxlY3RvcnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL2RhdGEtc291cmNlL2RhdGEtc291cmNlLnNlbGVjdG9ycyc7XG5cbmV4cG9ydCBjb25zdCBNSU1FX1RZUEVfV0lER0VUX01BTklGRVNUID0gJ2FwcGxpY2F0aW9uL3dpZGdldC1tYW5pZmVzdCc7XG5leHBvcnQgY29uc3QgTUlNRV9UWVBFX1dJREdFVF9UWVBFID0gJ2FwcGxpY2F0aW9uL3dpZGdldC10eXBlLSc7XG5leHBvcnQgY29uc3QgTUlNRV9UWVBFX1dJREdFVF9TSVpFID0gJ2FwcGxpY2F0aW9uL3dpZGdldC1zaXplLSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ByeS1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXNoYm9hcmRDb21wb25lbnQgZXh0ZW5kcyBTdWJzY3JpcHRpb25uZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuICBtYW5pZmVzdDogRGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsID0gbnVsbDtcbiAgd2luZG93TWFuaWZlc3QkOiBPYnNlcnZhYmxlPERhc2hib2FyZE1hbmlmZXN0PjtcbiAgbW9kZUVkaXRpb24gPSBmYWxzZTtcbiAgbW9kZUVkaXRpb24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBhY3Rpb25UeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHN0YXRpY0Rhc2hib2FyZCQ6IEJlaGF2aW9yU3ViamVjdDxEYXNoYm9hcmRNYW5pZmVzdCB8IG51bGw+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXNoYm9hcmRNYW5pZmVzdCB8IG51bGw+KG51bGwpO1xuICBzdGFja2VkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBpbmRleEZvclJlbW92YWw6IG51bWJlciA9IC0xO1xuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZU1vZGFsJywgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KSB0ZW1wbGF0ZU1vZGFsITogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2VwYXJhdG9ycyQ6IE9ic2VydmFibGU8V2lkZ2V0TGF5b3V0W10+O1xuICBub25GaWxsZXJXaWRnZXRzJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgQFZpZXdDaGlsZHJlbihXaWRnZXRJbnN0YW5jaWF0b3JDb21wb25lbnQpIGluc3RhbmNpYXRvcnM/OiBRdWVyeUxpc3Q8V2lkZ2V0SW5zdGFuY2lhdG9yQ29tcG9uZW50PjtcbiAgZGF0YUZldGNoaW5nJDogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIHBhcmFtczogRGFzaGJvYXJkQ2VsbFBhcmFtcyA9IHt9IGFzIERhc2hib2FyZENlbGxQYXJhbXM7XG4gIGZvcmNlTW9kZUVkaXRpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9kYXNoYm9hcmRTaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9Pih7IHdpZHRoOiAzMDAsIGhlaWdodDogMzAwIH0pO1xuICBkYXNoYm9hcmRTaXplJDogT2JzZXJ2YWJsZTx7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+O1xuXG4gIGdldCB3aWRnZXRzSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNpYXRvcnM/Lm1hcCgoaW5zdGFuY2lhdG9yKSA9PiBpbnN0YW5jaWF0b3IuaW5zdGFuY2lhdGVkQ29tcG9uZW50Lmluc3RhbmNlKSA/PyBbXTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzdGF0aWNEYXNoYm9hcmQod2luZG93OiBEYXNoYm9hcmRNYW5pZmVzdCkge1xuICAgIHRoaXMuc3RhdGljRGFzaGJvYXJkJC5uZXh0KHdpbmRvdyk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZm9yY2VNb2RlRWRpdGlvbihtb2RlOiBib29sZWFuKSB7XG4gICAgdGhpcy5mb3JjZU1vZGVFZGl0aW9uJC5uZXh0KG1vZGUpO1xuICB9XG5cbiAgQElucHV0KCkgQ2xvc2VPbkRyYWdPdXQgPSB0cnVlO1xuICBASW5wdXQoKSBkaXNwbGF5T3B0aW9ucz86IERpc3BsYXlPcHRpb25zO1xuICBASW5wdXQoKSBub0JhY2tncm91bmQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdncmlkJykgZ3JpZFJlZiE6IEVsZW1lbnRSZWY7XG4gIHByaXZhdGUgY2FuQ2FsY3VsYXRlVmlldyA9IGZhbHNlO1xuICB0YXJnZXRJbmRleGVzJDogT2JzZXJ2YWJsZTxudW1iZXJbXT47XG4gIGRhc2hib2FyZFBhcmFtczogRGFzaGJvYXJkQ2VsbFBhcmFtcyA9IHtcbiAgICBncmlkV2lkdGg6IDEsXG4gICAgZ3JpZEhlaWdodDogMSxcbiAgICBncmlkR2FwOiBERUZBVUxUX0dBUF9QWCxcbiAgICBjb2x1bW5zOiBERUZBVUxUX0NPTFVNTlNfTlVNQkVSLFxuICAgIGNlbGxXaWR0aDogMSxcbiAgICBjZWxsSGVpZ2h0OiBERUZBVUxUX1JPV19IRUlHSFRfUFgsXG4gICAgcm93czogREVGQVVMVF9ST1dTX05VTUJFUixcbiAgICBvZmZzZXRMZWZ0OiAwLFxuICAgIG9mZnNldFRvcDogMCxcbiAgICBtb2JpbGVNb2RlOiBmYWxzZVxuICB9O1xuICBASW5wdXQoKSBicmVha3BvaW50OiBudW1iZXIgPSAwO1xuICBAT3V0cHV0KCkgcm93SGVpZ2h0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSByb3dzID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIGN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3Q6IFdpZGdldE1hbmlmZXN0IHwgbnVsbCA9IG51bGw7XG4gIGluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3Q6IFdpZGdldE1hbmlmZXN0W10gPSBbXTtcbiAgbW92ZToge1xuICAgIGluaXRpYWxYOiBudW1iZXI7XG4gICAgaW5pdGlhbFk6IG51bWJlcjtcbiAgICBwcmV2aW91c1g6IG51bWJlcjtcbiAgICBwcmV2aW91c1k6IG51bWJlcjtcbiAgfSA9IHtcbiAgICBpbml0aWFsWDogLTEsXG4gICAgaW5pdGlhbFk6IC0xLFxuICAgIHByZXZpb3VzWDogLTEsXG4gICAgcHJldmlvdXNZOiAtMVxuICB9O1xuICBncmlkVGVtcGxhdGVSb3dzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBncmlkVGVtcGxhdGVDb2x1bW5zJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBEYXNoYm9hcmRHcmlkTGF5b3V0ID0gRGFzaGJvYXJkR3JpZExheW91dDtcbiAgbGF5b3V0OiBzdHJpbmcgPSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTDtcbiAgYmFja2dyb3VuZEFyZWEkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHByaXZhdGUgY29uZmlybVJlbW92ZVJlZj86IE92ZXJsYXlSZWY7XG4gIEFycmF5OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8YW55PixcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvYWRpbmckID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmxvYWRpbmcpO1xuICAgIHRoaXMuZGF0YUZldGNoaW5nJCA9IHRoaXMuc3RvcmUuc2VsZWN0KFNlYXJjaFNlbGVjdG9ycy5zZWFyY2hMb2FkaW5nKS5waXBlKGRlbGF5KDEwKSk7XG4gICAgdGhpcy5tb2RlRWRpdGlvbiQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5kYXNoYm9hcmRFZGl0aW9uTW9kZSksXG4gICAgICB0aGlzLmZvcmNlTW9kZUVkaXRpb24kXG4gICAgXSkucGlwZShtYXAoKFtzdG9yZU1vZGUsIGZvcmNlTW9kZV0pID0+IChmb3JjZU1vZGUgPT09IHVuZGVmaW5lZCA/IHN0b3JlTW9kZSA6IGZvcmNlTW9kZSkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5tb2RlRWRpdGlvbiQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMubW9kZUVkaXRpb24gPSBtb2RlO1xuICAgICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQWN0aW9ucygpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy50YXJnZXRJbmRleGVzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy50YXJnZXRUZW5hbnRzSW5kZXhlcyk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5kYXNoYm9hcmRDZWxsUGFyYW1zKS5zdWJzY3JpYmUoKHBhcmFtcykgPT4gKHRoaXMuZGFzaGJvYXJkUGFyYW1zID0gcGFyYW1zKSlcbiAgICApO1xuICAgIHRoaXMud2luZG93TWFuaWZlc3QkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLndpbmRvd01hbmlmZXN0KS5waXBlKFxuICAgICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy5zdGF0aWNEYXNoYm9hcmQkKSxcbiAgICAgIHN3aXRjaE1hcCgoW3dpbmRvd01hbmlmZXN0LCBzdGF0aWNEYXNoYm9hcmRdKSA9PiAoIXN0YXRpY0Rhc2hib2FyZCA/IG9mKHdpbmRvd01hbmlmZXN0KSA6IG9mKHN0YXRpY0Rhc2hib2FyZCkpKSxcbiAgICAgIG1hcCgoX3dNYW5pZmVzdCkgPT4ge1xuICAgICAgICBjb25zdCB3TWFuaWZlc3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoX3dNYW5pZmVzdCk7XG4gICAgICAgIGlmICh3TWFuaWZlc3QuZ3JpZD8ubGF5b3V0ICYmIHdNYW5pZmVzdC5ncmlkLmxheW91dCAhPT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUwpIHtcbiAgICAgICAgICAvLyBDb21wbGV0ZSB3aXRoIHBsYWNlaG9sZGVyc1xuICAgICAgICAgIGNvbnN0IHNpemUgPSBXaWRnZXRQbGFjZW1lbnRVdGlscy5nZXRMYXlvdXQod01hbmlmZXN0LmdyaWQubGF5b3V0KT8ucGxhY2VzLmxlbmd0aCA/PyAwO1xuICAgICAgICAgIGNvbnN0IHBsYWNlcyA9IFdpZGdldFBsYWNlbWVudFV0aWxzLnBsYWNlbWVudE9wdGlvbnMoXG4gICAgICAgICAgICB7IHR5cGU6ICdmaWxsZXInLCBsYXlvdXQ6IHsgeDogMSwgeTogMSwgd2lkdGg6IDEsIGhlaWdodDogMSB9IH0sXG4gICAgICAgICAgICB3TWFuaWZlc3QuZ3JpZC5sYXlvdXRcbiAgICAgICAgICApO1xuICAgICAgICAgIGxldCBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgd2hpbGUgKHdNYW5pZmVzdC53aWRnZXRzLmxlbmd0aCA8IHNpemUgJiYgYWRkZWQpIHtcbiAgICAgICAgICAgIGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCBwb3RlbnRpYWwgPSB7IC4uLnBsYWNlc1tpXSwgb3B0aW9uczogeyBpbmRleDogaSB9IH07XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB3TWFuaWZlc3Qud2lkZ2V0c1xuICAgICAgICAgICAgICAgICAgLm1hcCgod2lkZ2V0OiBXaWRnZXRNYW5pZmVzdCkgPT4gV2lkZ2V0UGxhY2VtZW50VXRpbHMuYXJlRGlzam9pbnQod2lkZ2V0LCBwb3RlbnRpYWwpKVxuICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYTogYm9vbGVhbiwgYjogYm9vbGVhbikgPT4gYSAmJiBiLCB0cnVlKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3TWFuaWZlc3Qud2lkZ2V0cy5wdXNoKHBvdGVudGlhbCk7XG4gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3TWFuaWZlc3Q7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBlcXVhbChwLCBjKSlcbiAgICApO1xuICAgIHRoaXMubm9uRmlsbGVyV2lkZ2V0cyQgPSB0aGlzLndpbmRvd01hbmlmZXN0JC5waXBlKFxuICAgICAgbWFwKCh3TWFuaWZlc3QpID0+ICh3TWFuaWZlc3Qud2lkZ2V0cyA/PyBbXSkuZmlsdGVyKCh3KSA9PiB3LnR5cGUgIT09ICdmaWxsZXInKS5sZW5ndGgpXG4gICAgKTtcblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRmllbGRBY3Rpb25zLmxvYWQoe30pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENsYXNzQWN0aW9ucy5sb2FkKHt9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDYXRlZ29yeUFjdGlvbnMubG9hZCh7fSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5nZXRNYXBTdHlsZXMoKSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXRhU291cmNlQWN0aW9ucy5sb2FkKHt9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChSZWxhdGlvblR5cGVzQWN0aW9ucy5sb2FkKHt9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmxvYWRDdXN0b21pemF0aW9uKHt9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgIC5waXBlKGF1ZGl0VGltZSgxMDApKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVZpZXcoKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMud2luZG93TWFuaWZlc3QkLCB0aGlzLm1vZGVFZGl0aW9uJF0pXG4gICAgICAgIC5waXBlKGF1ZGl0VGltZSgxMDApKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVZpZXcoKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCgkZXZlbnQ6IEV2ZW50KSA9PiAkZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCksXG4gICAgICAgICAgZmlsdGVyKCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+ICRldmVudC5rZXkgPT09ICdMJyAmJiAkZXZlbnQuY3RybEtleSAmJiAkZXZlbnQuc2hpZnRLZXkpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudG9nZ2xlRWRpdGlvbk1vZGUoe30pKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGZyb21FdmVudCh3aW5kb3csICdtb3VzZXVwJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckFjdGlvbnMoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChDb25maWdTZWxlY3RvcnMuYnJlYWtwb2ludCkuc3Vic2NyaWJlKChicCkgPT4ge1xuICAgICAgICB0aGlzLmJyZWFrcG9pbnQgPSBicDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndpbmRvd01hbmlmZXN0JC5zdWJzY3JpYmUoKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZ3JpZExheW91dCkuc3Vic2NyaWJlKChsYXlvdXQpID0+IHtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmdyaWRUZW1wbGF0ZVJvd3MkID0gY29tYmluZUxhdGVzdChbdGhpcy53aW5kb3dNYW5pZmVzdCQsIHRoaXMuc3RhY2tlZCRdKS5waXBlKFxuICAgICAgbWFwKChbbWFuaWZlc3QsIHN0YWNrZWRdKSA9PlxuICAgICAgICB0aGlzLmdlbmVyYXRlUm93cyhcbiAgICAgICAgICBzdGFja2VkICYmIHRoaXMubWFuaWZlc3RcbiAgICAgICAgICAgID8gdGhpcy5tYW5pZmVzdD8ud2lkZ2V0cy5tYXAoKHdtKSA9PiB3bS5sYXlvdXQuaGVpZ2h0KS5yZWR1Y2UoKHdtMSwgd20yKSA9PiB3bTEgKyB3bTIsIDApXG4gICAgICAgICAgICA6IG1hbmlmZXN0LmdyaWQ/LnJvd3MgPz8gREVGQVVMVF9ST1dTX05VTUJFUlxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZFRlbXBsYXRlQ29sdW1ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpbmRvd01hbmlmZXN0JCwgdGhpcy5zdGFja2VkJF0pLnBpcGUoXG4gICAgICBtYXAoKFttYW5pZmVzdCwgc3RhY2tlZF0pID0+IHRoaXMuZ2VuZXJhdGVDb2x1bW5zKHN0YWNrZWQgPyAxIDogbWFuaWZlc3QuZ3JpZD8uY29sdW1ucyB8fCBERUZBVUxUX0NPTFVNTlNfTlVNQkVSKSlcbiAgICApO1xuXG4gICAgdGhpcy5iYWNrZ3JvdW5kQXJlYSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpbmRvd01hbmlmZXN0JCwgdGhpcy5zdGFja2VkJF0pLnBpcGUoXG4gICAgICBtYXAoKFttYW5pZmVzdCwgc3RhY2tlZF0pID0+XG4gICAgICAgICFzdGFja2VkXG4gICAgICAgICAgPyBgMS8xLyR7KG1hbmlmZXN0LmdyaWQ/LnJvd3MgPz8gREVGQVVMVF9ST1dTX05VTUJFUikgKyAxfS8ke1xuICAgICAgICAgICAgICAobWFuaWZlc3QuZ3JpZD8uY29sdW1ucyA/PyBERUZBVUxUX0NPTFVNTlNfTlVNQkVSKSArIDFcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgOiBgMS8xLyR7KG1hbmlmZXN0LmdyaWQ/LmNvbHVtbnMgPz8gREVGQVVMVF9DT0xVTU5TX05VTUJFUikgKyAxfS8xYFxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnNlcGFyYXRvcnMkID0gdGhpcy5zdG9yZVxuICAgICAgLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuZ3JpZExheW91dClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGxheW91dCkgPT5cbiAgICAgICAgICBsYXlvdXQgPT09IERhc2hib2FyZEdyaWRMYXlvdXQuTUFOVUFMID8gW10gOiBXaWRnZXRQbGFjZW1lbnRVdGlscy5nZXRMYXlvdXQobGF5b3V0KT8ucGxhY2VzID8/IFtdXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICB0aGlzLmRhc2hib2FyZFNpemUkID0gdGhpcy5fZGFzaGJvYXJkU2l6ZSQucGlwZShcbiAgICAgIHN0YXJ0V2l0aCh7XG4gICAgICAgIHdpZHRoOiAzMDAsXG4gICAgICAgIGhlaWdodDogMzAwXG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBwLndpZHRoID09PSBjLndpZHRoICYmIHAuaGVpZ2h0ID09PSBjLmhlaWdodCksXG4gICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwLCBjKSA9PiBwLndpZHRoID09PSBjLndpZHRoICYmIHAuaGVpZ2h0ID09PSBjLmhlaWdodClcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU2VsZlNpemUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy53aW5kb3dNYW5pZmVzdCQsXG4gICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhdGFTb3VyY2VTZWxlY3RvcnMuZ2V0RGF0YVNvdXJjZXMpLFxuICAgICAgICB0aGlzLnN0YXRpY0Rhc2hib2FyZCRcbiAgICAgIF0pLnN1YnNjcmliZSgoW21hbmlmZXN0LCBkYXRhc2V0cywgc3RhdGljTWFuaWZlc3RdKSA9PiB7XG4gICAgICAgIGlmIChkYXRhc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmFzc2VydFJlc3VsdFNldHMoeyBzdGF0aWNNYW5pZmVzdCB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BsYXlPcHRpb25zKVxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEaXNwbGF5T3B0aW9ucyh7IG1vZGU6IFZpZXdNb2RlLkNVU1RPTSwgY3VzdG9tRGlzcGxheTogdGhpcy5kaXNwbGF5T3B0aW9ucyB9KVxuICAgICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNhbkNhbGN1bGF0ZVZpZXcgPSB0cnVlO1xuICB9XG5cbiAgdXBkYXRlU2VsZlNpemUoKSB7XG4gICAgY29uc3QgYm91bmRpbmdSZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuX2Rhc2hib2FyZFNpemUkLm5leHQoeyB3aWR0aDogYm91bmRpbmdSZWN0LndpZHRoLCBoZWlnaHQ6IGJvdW5kaW5nUmVjdC5oZWlnaHQgfSk7XG4gIH1cblxuICAvKioqXG4gICAqIE1hbmFnZSBkaXNwbGF5XG4gICAqL1xuICBjYWxjdWxhdGVWaWV3KCkge1xuICAgIGlmICh0aGlzLmNhbkNhbGN1bGF0ZVZpZXcpIHtcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5ncmlkUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB3aGlsZSAoZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgPT09IDAgJiYgISFlbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3JpZFdpZHRoID0gKDxIVE1MRWxlbWVudD5lbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIGNvbnN0IG1vYmlsZU1vZGUgPSBncmlkV2lkdGggPCB0aGlzLmJyZWFrcG9pbnQ7XG4gICAgICB0aGlzLnN0YWNrZWQkLm5leHQodGhpcy5kYXNoYm9hcmRQYXJhbXMubW9iaWxlTW9kZSAmJiAhdGhpcy5tb2RlRWRpdGlvbik7XG4gICAgICBjb25zdCByb3dzID0gIXRoaXMuZGlzcGxheUlzU3RhY2tlZFxuICAgICAgICA/ICghIXRoaXMubWFuaWZlc3QgJiYgISF0aGlzLm1hbmlmZXN0LmdyaWQgJiYgdGhpcy5tYW5pZmVzdC5ncmlkLnJvd3MpIHx8IERFRkFVTFRfUk9XU19OVU1CRVJcbiAgICAgICAgOiB0aGlzLm1hbmlmZXN0Py53aWRnZXRzLnJlZHVjZSgocDogbnVtYmVyLCBjOiBXaWRnZXRNYW5pZmVzdCkgPT4gcCArIGMubGF5b3V0LmhlaWdodCwgMCkgPz8gMTtcblxuICAgICAgdGhpcy5wYXJhbXMgPSB7XG4gICAgICAgIGdyaWRXaWR0aCxcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGhlaWdodCB0byBwYXJlbnQgdGhlIHBhcmVudCdzXG4gICAgICAgIGdyaWRIZWlnaHQ6IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LFxuICAgICAgICBncmlkR2FwOiAxLFxuICAgICAgICBjb2x1bW5zOiAoISF0aGlzLm1hbmlmZXN0ICYmICEhdGhpcy5tYW5pZmVzdC5ncmlkICYmIHRoaXMubWFuaWZlc3QuZ3JpZC5jb2x1bW5zKSB8fCBERUZBVUxUX0NPTFVNTlNfTlVNQkVSLFxuICAgICAgICBjZWxsSGVpZ2h0OiAxLFxuICAgICAgICByb3dzLFxuICAgICAgICBjZWxsV2lkdGg6IDAsXG4gICAgICAgIG9mZnNldExlZnQ6IHRoaXMuZ3JpZFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdGhpcy5ncmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wLFxuICAgICAgICBtb2JpbGVNb2RlXG4gICAgICB9O1xuICAgICAgdGhpcy5wYXJhbXMuZ3JpZEdhcCA9XG4gICAgICAgIHRoaXMucGFyYW1zLnJvd3MgKiB0aGlzLnBhcmFtcy5jZWxsSGVpZ2h0IDwgdGhpcy5wYXJhbXMuZ3JpZEhlaWdodFxuICAgICAgICAgID8gISF0aGlzLm1hbmlmZXN0ICYmICEhdGhpcy5tYW5pZmVzdC5ncmlkXG4gICAgICAgICAgICA/IHRoaXMubWFuaWZlc3QuZ3JpZC5nYXAgfHwgREVGQVVMVF9HQVBfUFhcbiAgICAgICAgICAgIDogREVGQVVMVF9HQVBfUFhcbiAgICAgICAgICA6IDA7XG4gICAgICB0aGlzLnBhcmFtcy5jZWxsSGVpZ2h0ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgICh0aGlzLnBhcmFtcy5ncmlkSGVpZ2h0IC0gKHRoaXMucGFyYW1zLnJvd3MgLSAxKSAqIHRoaXMucGFyYW1zLmdyaWRHYXApIC8gdGhpcy5wYXJhbXMucm93c1xuICAgICAgKTtcbiAgICAgIHRoaXMucGFyYW1zLmNlbGxXaWR0aCA9XG4gICAgICAgICh0aGlzLnBhcmFtcy5ncmlkV2lkdGggLSAodGhpcy5wYXJhbXMuY29sdW1ucyAtIDEpICogdGhpcy5wYXJhbXMuZ3JpZEdhcCkgLyB0aGlzLnBhcmFtcy5jb2x1bW5zO1xuXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkUGFyYW1zKHsgcGFyYW1zOiB0aGlzLnBhcmFtcyB9KSk7XG5cbiAgICAgIHRoaXMucm93cy5uZXh0KHRoaXMucGFyYW1zLnJvd3MpO1xuICAgICAgdGhpcy5yb3dIZWlnaHQubmV4dCh0aGlzLnBhcmFtcy5jZWxsSGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzcGxheUlzU3RhY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFja2VkJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgZ3JpZENvbHVtbihsYXlvdXQ6IFdpZGdldExheW91dCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGlzcGxheUlzU3RhY2tlZCB8fCAhbGF5b3V0KSB7XG4gICAgICByZXR1cm4gJzEgLyAxJztcbiAgICB9XG4gICAgaWYgKGxheW91dC53aWR0aCA+IDEpIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLm1pbihsYXlvdXQueCwgdGhpcy5wYXJhbXMuY29sdW1ucyAtIGxheW91dC53aWR0aCArIDEpfSAvICR7TWF0aC5taW4oXG4gICAgICAgIGxheW91dC54ICsgbGF5b3V0LndpZHRoLFxuICAgICAgICB0aGlzLnBhcmFtcy5jb2x1bW5zICsgMVxuICAgICAgKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7bGF5b3V0Lnh9YDtcbiAgICB9XG4gIH1cblxuICBncmlkUm93KGxheW91dDogV2lkZ2V0TGF5b3V0KTogc3RyaW5nIHtcbiAgICBpZiAoIWxheW91dCkge1xuICAgICAgcmV0dXJuICcxJztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcGxheUlzU3RhY2tlZCkge1xuICAgICAgY29uc3QgcHJldmlvdXNIZWlnaHQgPSB0aGlzLm1hbmlmZXN0Py53aWRnZXRzXG4gICAgICAgIC5maWx0ZXIoKHdtOiBXaWRnZXRNYW5pZmVzdCkgPT4gKHdtLmxheW91dC55ID09PSBsYXlvdXQueSAmJiB3bS5sYXlvdXQueCA8IGxheW91dC54KSB8fCB3bS5sYXlvdXQueSA8IGxheW91dC55KVxuICAgICAgICAucmVkdWNlKChwOiBudW1iZXIsIGM6IFdpZGdldE1hbmlmZXN0KSA9PiBwICsgYy5sYXlvdXQuaGVpZ2h0LCAxKTtcbiAgICAgIHJldHVybiBgJHtwcmV2aW91c0hlaWdodCA/PyAxfSAvICR7KHByZXZpb3VzSGVpZ2h0ID8/IDEpICsgbGF5b3V0LmhlaWdodH1gO1xuICAgIH1cbiAgICBpZiAobGF5b3V0LmhlaWdodCA+IDEpIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLm1heCgxLCBNYXRoLm1pbihsYXlvdXQueSwgdGhpcy5wYXJhbXMucm93cyAtIGxheW91dC5oZWlnaHQgKyAxKSl9IC8gJHtNYXRoLm1pbihcbiAgICAgICAgbGF5b3V0LnkgKyBsYXlvdXQuaGVpZ2h0LFxuICAgICAgICB0aGlzLnBhcmFtcy5yb3dzICsgMVxuICAgICAgKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7bGF5b3V0Lnl9YDtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVJvd3Mocm93czogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQXJyYXkocm93cykuZmlsbCgnMWZyJykuam9pbignICcpO1xuICB9XG5cbiAgZ2VuZXJhdGVDb2x1bW5zKGNvbHVtbnM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIEFycmF5KGNvbHVtbnMpLmZpbGwoJzFmcicpLmpvaW4oJyAnKTtcbiAgfVxuXG4gIC8qKipcbiAgICogRGlyZWN0IGFjdGlvbnMgb24gd2lkZ2V0c1xuICAgKi9cblxuICByZW1vdmUoaTogbnVtYmVyKSB7XG4gICAgY29uc3QgbGlzdFdpZGdldE1hbmlmZXN0cyA9IFsuLi4odGhpcy5tYW5pZmVzdCB8fCB7IHdpZGdldHM6IFtdIH0pLndpZGdldHNdO1xuICAgIGxpc3RXaWRnZXRNYW5pZmVzdHMuc3BsaWNlKGksIDEpLmZpbHRlcigod2lkZ2V0KSA9PiB3aWRnZXQudHlwZSAhPT0gJ2ZpbGxlcicpO1xuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgICAgd2lkZ2V0czogbGlzdFdpZGdldE1hbmlmZXN0c1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBtb3ZlSW5OZXdXaW5kb3cod2lkZ2V0SW5kZXg6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5tb3ZlV2lkZ2V0KHsgd2lkZ2V0SW5kZXgsIHRhcmdldEluZGV4IH0pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudG9nZ2xlRWRpdGlvbk1vZGUoeyBmb3JjZTogZmFsc2UgfSkpO1xuICB9XG5cbiAgbWF4aW1pemUod2lkZ2V0SW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5tYXhpbWl6ZVdpZGdldCh7IHdpZGdldEluZGV4IH0pKTtcbiAgfVxuXG4gIC8qKipcbiAgICogTWFuYWdlIGRyYWcgbiBkcm9wLCBtb3ZlLCByZXNpemVcbiAgICovXG5cbiAgcHJlcGFyZU1vZGlmaWNhdGlvbigkZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4TWFuaWZlc3Q6IG51bWJlcikge1xuICAgIHRoaXMubW92ZS5pbml0aWFsWCA9ICRldmVudC5jbGllbnRYO1xuICAgIHRoaXMubW92ZS5pbml0aWFsWSA9ICRldmVudC5jbGllbnRZO1xuICAgIHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdCA9IHN0cnVjdHVyZWRDbG9uZSgodGhpcy5tYW5pZmVzdCB8fCB7IHdpZGdldHM6IFtdIH0pLndpZGdldHMpO1xuICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCA9IHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdC5zcGxpY2UoaW5kZXhNYW5pZmVzdCwgMSlbMF07XG4gICAgLy8gY29uc29sZS5sb2coJ3ByZXBhcmUnLCB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QsIHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdCk7XG4gIH1cblxuICBzdGFydFJlc2l6ZSgkZXZlbnQ6IE1vdXNlRXZlbnQsIGluZGV4TWFuaWZlc3Q6IG51bWJlciwgZGlyZWN0aW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGlvblR5cGUgPSBkaXJlY3Rpb247XG4gICAgdGhpcy5wcmVwYXJlTW9kaWZpY2F0aW9uKCRldmVudCwgaW5kZXhNYW5pZmVzdCk7XG4gICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0IHJlc2l6ZScsIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCwgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0KTtcbiAgfVxuXG4gIGRyYWdTdGFydCgkZXZlbnQ6IERyYWdFdmVudCwgaW5kZXhNYW5pZmVzdDogbnVtYmVyKSB7XG4gICAgdGhpcy5hY3Rpb25UeXBlID0gJ21vdmUnO1xuICAgIHRoaXMucHJlcGFyZU1vZGlmaWNhdGlvbigkZXZlbnQsIGluZGV4TWFuaWZlc3QpO1xuICAgIERhc2hib2FyZENvbXBvbmVudC5hZGRUcmFuc2Zlck1hbmlmZXN0TWV0YWRhdGEoJGV2ZW50LCB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QgPz8gKHt9IGFzIFdpZGdldE1hbmlmZXN0KSk7XG4gICAgLy8gY29uc29sZS5sb2coJ3N0YXJ0IG1vdmUnLCB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QsIHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBhZGRUcmFuc2Zlck1hbmlmZXN0TWV0YWRhdGEoJGV2ZW50OiBEcmFnRXZlbnQsIG1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCkge1xuICAgIGlmICghISRldmVudCAmJiAhISRldmVudC5kYXRhVHJhbnNmZXIgJiYgISRldmVudC5kYXRhVHJhbnNmZXIudHlwZXMuaW5jbHVkZXMoTUlNRV9UWVBFX1dJREdFVF9NQU5JRkVTVCkpIHtcbiAgICAgICRldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShNSU1FX1RZUEVfV0lER0VUX01BTklGRVNULCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCkpO1xuICAgICAgJGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKE1JTUVfVFlQRV9XSURHRVRfVFlQRSArIG1hbmlmZXN0LnR5cGUsICd1bnVzZWQnKTtcbiAgICAgIC8vIFBhc3Npbmcgd2lkZ2V0IHNpemUgYXMgYSBtaW1lIHR5cGUsIHNvIHRoYXQgd2UgY2FuIGJ5cGFzcyBzZWN1cml0eSBmb3IgcGxhY2Vob2xkZXIgc2l6ZSBhdCB0aGUgYXJyaXZhbCBvZiB0aGUgZHJhZ1xuICAgICAgJGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKFxuICAgICAgICBNSU1FX1RZUEVfV0lER0VUX1NJWkUgKyBgJHttYW5pZmVzdC5sYXlvdXQud2lkdGh9LSR7bWFuaWZlc3QubGF5b3V0LmhlaWdodH1gLFxuICAgICAgICAndXNlbGVzcycgLy8gZGF0YSBpcyBpbiB0aGUgbWltZSB0eXBlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdFbnRlcigkZXZlbnQ6IERyYWdFdmVudCwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IHR5cGVzID0gKCRldmVudC5kYXRhVHJhbnNmZXIgfHwgeyB0eXBlczogWycnXSB9KS50eXBlcztcblxuICAgIGlmICh0eXBlcy5pbmNsdWRlcyhNSU1FX1RZUEVfV0lER0VUX01BTklGRVNUKSkge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnRvZ2dsZUVkaXRpb25Nb2RlKHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgdGhpcy5hY3Rpb25UeXBlID0gJ21vdmUnO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRm9yRHJhZ0VudGVyKCRldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0KSB7XG4gICAgICAvLyBjcmVhdGUgcGxhY2Vob2xkZXIgYXMgYSBkcmFnIGVudGVyZWQgdGhlIGNvbXBvbmVudCwgZ28gaW50byBlZGl0aW9uIG1vZGUgYW5kIG1vdmUgYWN0aW9uIGlmIGl0J3MgYSB3aWRnZXQgYmVpbmcgZHJhZ2dlZFxuICAgICAgY29uc3QgdHlwZXMgPSAoKCRldmVudCBhcyBEcmFnRXZlbnQpLmRhdGFUcmFuc2ZlciB8fCB7IHR5cGVzOiBbJyddIH0pLnR5cGVzO1xuICAgICAgaWYgKHR5cGVzLmluY2x1ZGVzKE1JTUVfVFlQRV9XSURHRVRfTUFOSUZFU1QpKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uVHlwZSA9ICdtb3ZlJztcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLnRvZ2dsZUVkaXRpb25Nb2RlKHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgICAgIC8vIE9uIGRyYWcgZW50ZXIsIHdlIG9ubHkgY2FuIHB1dCBhIHBsYWNlaG9sZGVyLCBzaW5jZSBmb3Igc2VjdXJpdHkgcmVhc29ucywgdGhlIGNvbnRlbnQgb2YgdGhlIGRhdGEtdHJhbnNmZXIgaXMgbm90IGF2YWlsYWJsZVxuICAgICAgICB0aGlzLm1vdmUuaW5pdGlhbFggPSB0aGlzLmRhc2hib2FyZFBhcmFtcy5vZmZzZXRMZWZ0O1xuICAgICAgICB0aGlzLm1vdmUuaW5pdGlhbFkgPSB0aGlzLmRhc2hib2FyZFBhcmFtcy5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0KCRldmVudCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QgPSB7XG4gICAgICAgICAgdHlwZTogJ3BsYWNlaG9sZGVyJyxcbiAgICAgICAgICBsYXlvdXQ6IHsgeDogdGFyZ2V0Py54ID8/IDAsIHk6IHRhcmdldD8ueSA/PyAwLCB3aWR0aDogMSwgaGVpZ2h0OiAxIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0ID0gc3RydWN0dXJlZENsb25lKCh0aGlzLm1hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0cyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjcmVhdGUgcGxhY2Vob2xkZXInLCB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QsIHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdCk7XG5cbiAgICAgICAgLy8gV2UgcGFzc2VkIHdpZGdldCBzaXplIGFzIGEgbWltZXR5cGUgc28gdGhhdCB3ZSBjYW4gc3RpbGwgcmVhZCBpdCB3aXRob3V0IHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICBjb25zdCB3aWRnZXRTaXplTWltZVR5cGUgPSB0eXBlcy5maW5kKCh0eXBlKSA9PiB0eXBlLmluY2x1ZGVzKE1JTUVfVFlQRV9XSURHRVRfU0laRSkpO1xuICAgICAgICBpZiAoISF3aWRnZXRTaXplTWltZVR5cGUpIHtcbiAgICAgICAgICBjb25zdCBbXywgXzIsIHcsIGhdID0gd2lkZ2V0U2l6ZU1pbWVUeXBlLnNwbGl0KCctJyk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0LmxheW91dC53aWR0aCA9IHBhcnNlSW50KHcsIDEwKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QubGF5b3V0LmhlaWdodCA9IHBhcnNlSW50KGgsIDEwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVc2UgZ3JpZCBzaXplXG4gICAgICAgICAgY29uc3QgbGF5b3V0ID0gKFdpZGdldFBsYWNlbWVudFV0aWxzLmdldExheW91dCh0aGlzLmxheW91dCk/LnBsYWNlcyA/PyBbXSlbXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3QubGVuZ3RoXG4gICAgICAgICAgXSA/PyB7XG4gICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgIGhlaWdodDogMVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0LmxheW91dC53aWR0aCA9IGxheW91dC53aWR0aDtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QubGF5b3V0LmhlaWdodCA9IGxheW91dC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBwYXNzZWQgdGhlIHR5cGUgYXMgYSBoZWFkZXIgbmFtZSBzbyB0aGF0IHdlIGNhbiBzdGlsbCBhY2Nlc3MgaXQgd2l0aG91dCBzZWN1cml0eSBpc3N1ZXNcbiAgICAgICAgY29uc3Qgd2lkZ2V0VHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHR5cGUuaW5jbHVkZXMoTUlNRV9UWVBFX1dJREdFVF9UWVBFKSk7XG4gICAgICAgIGlmICghIXdpZGdldFR5cGUpIHtcbiAgICAgICAgICBjb25zdCBbXywgXzIsIHR5cGVdID0gd2lkZ2V0VHlwZS5zcGxpdCgnLScpO1xuICAgICAgICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdC50eXBlID0gdHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWwgcG9zaXRpb24gZm9yIHRoZSBvbmUgd2UganVzdCBjYWxjdWxhdGVkLCBzbyB3ZSBjYW4gY29udGludWUgcHJvcGVybHkgbW92ZSB0aGUgd2lkZ2V0XG4gICAgICAgIHRoaXMubW92ZS5pbml0aWFsWCA9ICRldmVudC5wYWdlWDtcbiAgICAgICAgdGhpcy5tb3ZlLmluaXRpYWxZID0gJGV2ZW50LnBhZ2VZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFRhcmdldCgkZXZlbnQ6IE1vdXNlRXZlbnQsIG9wdGltaXplID0gdHJ1ZSkge1xuICAgIGNvbnN0IGRYID0gJGV2ZW50LnBhZ2VYIC0gdGhpcy5tb3ZlLmluaXRpYWxYO1xuICAgIGNvbnN0IGRZID0gJGV2ZW50LnBhZ2VZIC0gdGhpcy5tb3ZlLmluaXRpYWxZO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0ge1xuICAgICAgeDpcbiAgICAgICAgZFggPT09IDBcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICgoZFggLyBNYXRoLmFicyhkWCkpICogKE1hdGguYWJzKGRYKSAtIDAuNSAqIHRoaXMuZGFzaGJvYXJkUGFyYW1zLmNlbGxXaWR0aCkpIC9cbiAgICAgICAgICAgICAgICAodGhpcy5kYXNoYm9hcmRQYXJhbXMuY2VsbFdpZHRoICsgdGhpcy5kYXNoYm9hcmRQYXJhbXMuZ3JpZEdhcClcbiAgICAgICAgICAgICksXG4gICAgICB5OlxuICAgICAgICBkWSA9PT0gMFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgKChkWSAvIE1hdGguYWJzKGRZKSkgKiAoTWF0aC5hYnMoZFkpIC0gMC41ICogdGhpcy5kYXNoYm9hcmRQYXJhbXMuY2VsbEhlaWdodCkpIC9cbiAgICAgICAgICAgICAgICAodGhpcy5kYXNoYm9hcmRQYXJhbXMuY2VsbEhlaWdodCArIHRoaXMuZGFzaGJvYXJkUGFyYW1zLmdyaWRHYXApXG4gICAgICAgICAgICApXG4gICAgfTtcblxuICAgIGlmICghb3B0aW1pemUgfHwgdGFyZ2V0LnggIT09IHRoaXMubW92ZS5wcmV2aW91c1ggfHwgdGFyZ2V0LnkgIT09IHRoaXMubW92ZS5wcmV2aW91c1kpIHtcbiAgICAgIHRoaXMubW92ZS5wcmV2aW91c1ggPSB0YXJnZXQueDtcbiAgICAgIHRoaXMubW92ZS5wcmV2aW91c1kgPSB0YXJnZXQueTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBtb3ZpbmdNb3VzZSgkZXZlbnQ6IE1vdXNlRXZlbnQsIG9wdGltaXplID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLm1vZGVFZGl0aW9uICYmICEhdGhpcy5hY3Rpb25UeXBlKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldFRhcmdldCgkZXZlbnQsIG9wdGltaXplKTtcbiAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5jaGVja0ZvckRyYWdFbnRlcigkZXZlbnQpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVXaWRnZXQgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0KSE7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGlvblR5cGUpIHtcbiAgICAgICAgICBjYXNlICdyZXNpemUtbncnOlxuICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQueCArIHRhcmdldC54ID4gMCAmJiBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCAtIHRhcmdldC55ID4gMCkge1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnggKz0gdGFyZ2V0Lng7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQueSArPSB0YXJnZXQueTtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC53aWR0aCAtPSB0YXJnZXQueDtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC5oZWlnaHQgLT0gdGFyZ2V0Lnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdyZXNpemUtc3cnOlxuICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQud2lkdGggLSB0YXJnZXQueCA+IDApIHtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC54ICs9IHRhcmdldC54O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LndpZHRoIC09IHRhcmdldC54O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCArPSB0YXJnZXQueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Jlc2l6ZS1uZSc6XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlV2lkZ2V0LmxheW91dC5oZWlnaHQgLSB0YXJnZXQueSA+IDApIHtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC55ICs9IHRhcmdldC55O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LndpZHRoICs9IHRhcmdldC54O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCAtPSB0YXJnZXQueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Jlc2l6ZS1zZSc6XG4gICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LndpZHRoICs9IHRhcmdldC54O1xuICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC5oZWlnaHQgKz0gdGFyZ2V0Lnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNYXhYID1cbiAgICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdD8uZ3JpZD8uY29sdW1ucyA/PyBERUZBVUxUX0NPTFVNTlNfTlVNQkVSLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLm1hbmlmZXN0Py53aWRnZXRzID8/IFtdKS5tYXAoKHcpID0+IHcubGF5b3V0LndpZHRoICsgdy5sYXlvdXQueClcbiAgICAgICAgICAgICAgKSAtXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQud2lkdGggK1xuICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2FuZGlkYXRlV2lkZ2V0LmxheW91dC54ICsgdGFyZ2V0LngsIGN1cnJlbnRNYXhYKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNYXhZID1cbiAgICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdD8uZ3JpZD8ucm93cyA/PyBERUZBVUxUX1JPV1NfTlVNQkVSLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLm1hbmlmZXN0Py53aWRnZXRzID8/IFtdKS5tYXAoKHcpID0+IHcubGF5b3V0LmhlaWdodCArIHcubGF5b3V0LnkpXG4gICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCArXG4gICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnkgKyB0YXJnZXQueSwgY3VycmVudE1heFkpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZURhc2hib2FyZE1hbmlmZXN0KHtcbiAgICAgICAgICAgIG1hbmlmZXN0OiBzb2x2ZUNvbGxpc2lvbnMoXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldCxcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0LFxuICAgICAgICAgICAgICB0aGlzLm1hbmlmZXN0ID8/ICh7fSBhcyBEYXNoYm9hcmRNYW5pZmVzdClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyYWdNb3ZlKCRldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5tb3ZpbmdNb3VzZSgkZXZlbnQpO1xuICB9XG5cbiAgZHJhZ0xlYXZlKCRldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICgkZXZlbnQuY3VycmVudFRhcmdldC5jb250YWlucygkZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlcyA9ICgkZXZlbnQuZGF0YVRyYW5zZmVyIHx8IHsgdHlwZXM6IFsnJ10gfSkudHlwZXM7XG4gICAgaWYgKHR5cGVzLmluY2x1ZGVzKE1JTUVfVFlQRV9XSURHRVRfTUFOSUZFU1QpKSB7XG4gICAgICAvLyBBcyB0aGUgZHJhZyBpcyBsZWF2aW5nIHRoZSB3aW5kb3csIGRlbGV0ZSB0aGUgd2lkZ2V0IGZyb20gaXQsIGFuZCBzdG9wIGVkaXRpb24gbW9kZVxuICAgICAgaWYgKCEhJGV2ZW50ICYmICEhJGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgICAgICAgd2lkZ2V0czogdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jbGVhckFjdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkcm9wcGluZygkZXZlbnQ6IERyYWdFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoISEkZXZlbnQgJiYgISEkZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBpZiAoJGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5pbmNsdWRlcyhNSU1FX1RZUEVfV0lER0VUX01BTklGRVNUKSkge1xuICAgICAgICAvLyBSZWFycmFuZ2UgZHJvcCB0byBjb3JyZWN0IHNpemUsIHR5cGUsIC4uLiwgYXMgYSBwbGFjZWhvbGRlciBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gbWFuaWZlc3QgYnkgZHJhZ2VudGVyIGV2ZW50XG4gICAgICAgIGNvbnN0IGRhdGFUcmFuc2Zlck1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAkZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoTUlNRV9UWVBFX1dJREdFVF9NQU5JRkVTVClcbiAgICAgICAgKSBhcyBXaWRnZXRNYW5pZmVzdDtcblxuICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QgPSB7XG4gICAgICAgICAgLi4uZGF0YVRyYW5zZmVyTWFuaWZlc3QsXG4gICAgICAgICAgbGF5b3V0OiB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3Q/LmxheW91dCA/PyAoe30gYXMgV2lkZ2V0TGF5b3V0KVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubW92aW5nTW91c2UoJGV2ZW50LCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmFzc2VydFJlc3VsdFNldHMoe30pKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jbGVhckFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckFjdGlvbnMoKSB7XG4gICAgdGhpcy5hY3Rpb25UeXBlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW92ZS5pbml0aWFsWCA9IDA7XG4gICAgdGhpcy5tb3ZlLmluaXRpYWxZID0gMDtcbiAgICB0aGlzLm1vdmUucHJldmlvdXNYID0gLTE7XG4gICAgdGhpcy5tb3ZlLnByZXZpb3VzWSA9IC0xO1xuICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCA9IG51bGw7XG4gICAgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0ID0gW107XG4gIH1cblxuICAvKioqXG4gICAqIE1hbmFnZSBvdGhlciBraW5kcyBvZiBkcm9wcyAoaW5zaWRlIHdpZGdldHMpXG4gICAqL1xuICBkcm9wcGluZ0luV2lkZ2V0KCRldmVudDogRHJhZ0V2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCEhJGV2ZW50ICYmICEhJGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuICAgICAgaWYgKCRldmVudC5kYXRhVHJhbnNmZXIudHlwZXMuaW5jbHVkZXMoTUlNRV9UWVBFX1JFU1VMVFNFVCkpIHtcbiAgICAgICAgY29uc3QgbGlzdFdpZGdldE1hbmlmZXN0cyA9IFsuLi4odGhpcy5tYW5pZmVzdCB8fCB7IHdpZGdldHM6IFtdIH0pLndpZGdldHNdO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdFNldE5hbWUgPSAkZXZlbnQuZGF0YVRyYW5zZmVyLmdldERhdGEoTUlNRV9UWVBFX1JFU1VMVFNFVCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXN1bHRTZXQgPSAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShsaXN0V2lkZ2V0TWFuaWZlc3RzW2luZGV4XS5kYXRhc291cmNlKVxuICAgICAgICAgICAgPyBsaXN0V2lkZ2V0TWFuaWZlc3RzW2luZGV4XS5kYXRhc291cmNlXG4gICAgICAgICAgICA6IFtsaXN0V2lkZ2V0TWFuaWZlc3RzW2luZGV4XS5kYXRhc291cmNlXVxuICAgICAgICApIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBjdW11bGF0aXZlID0gJGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICBjb25zdCBuZXdSZXN1bHRTZXQgPSBjdW11bGF0aXZlID8gWy4uLmN1cnJlbnRSZXN1bHRTZXQsIHJlc3VsdFNldE5hbWVdIDogcmVzdWx0U2V0TmFtZTtcblxuICAgICAgICBsaXN0V2lkZ2V0TWFuaWZlc3RzW2luZGV4XSA9IHtcbiAgICAgICAgICAuLi5saXN0V2lkZ2V0TWFuaWZlc3RzW2luZGV4XSxcbiAgICAgICAgICBkYXRhc291cmNlOiBuZXdSZXN1bHRTZXRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgICAgICAgd2lkZ2V0czogbGlzdFdpZGdldE1hbmlmZXN0c1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5hc3NlcnRSZXN1bHRTZXRzKHt9KSk7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlUmVtb3ZlQ29uZmlybSgkZXZlbnQ/OiBNb3VzZUV2ZW50LCBpbmRleD86IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jb25maXJtUmVtb3ZlUmVmKSB7XG4gICAgICB0aGlzLmluZGV4Rm9yUmVtb3ZhbCA9IGluZGV4ID8/IC0xO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcbiAgICAgICAgbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnby1tb2RhbC13cmFwcGVyJ10sXG4gICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2JhY2tkcm9wJ1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5hZGRpbmdPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbW9kYWwnIH0pKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnRvZ2dsZVJlbW92ZUNvbmZpcm0oKSk7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLnRlbXBsYXRlTW9kYWwsIHRoaXMudmlld0NvbnRhaW5lclJlZikpO1xuICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5vLW1vZGFsLXdyYXBwZXInKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgaWYgKCEhcGFuZWwpIHtcbiAgICAgICAgICBwYW5lbC5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVyV2lkdGggLSBwYW5lbC5jbGllbnRXaWR0aCwgJGV2ZW50LmNsaWVudFggLSAzMCkpICsgJ3B4JztcbiAgICAgICAgICBwYW5lbC5zdHlsZS50b3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQgLSBwYW5lbC5jbGllbnRIZWlnaHQsICRldmVudC5jbGllbnRZIC0gMTApKSArICdweCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1SZW1vdmUoKSB7XG4gICAgdGhpcy5yZW1vdmUodGhpcy5pbmRleEZvclJlbW92YWwpO1xuICAgIHRoaXMuY2FuY2VsUmVtb3ZlQ29uZmlybSgpO1xuICB9XG5cbiAgY2FuY2VsUmVtb3ZlQ29uZmlybSgpIHtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMuY2xvc2VPdmVybGF5KHsgaWQ6IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctbW9kYWwnIH0pKTtcbiAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWY/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB0cmFja1dpZGdldHMoaW5kZXg6IG51bWJlciwgd2lkZ2V0TWFuaWZlc3Q6IFdpZGdldE1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIGluZGV4ICsgJy0nICsgd2lkZ2V0TWFuaWZlc3QudHlwZSArICctJyArIEpTT04uc3RyaW5naWZ5KHdpZGdldE1hbmlmZXN0LmxheW91dCk7XG4gIH1cblxuICBjaGFuZ2VTaXplKGRpcmVjdGlvbjogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcikge1xuICAgIGNvbnN0IG1pblJvd3MgPVxuICAgICAgKHRoaXMubWFuaWZlc3Q/LndpZGdldHMubWFwKCh3KSA9PiB3LmxheW91dC5oZWlnaHQgKyB3LmxheW91dC55KS5yZWR1Y2UoKGEsIGIpID0+IChhID4gYiA/IGEgOiBiKSwgMikgPz8gMikgLSAxO1xuICAgIGNvbnN0IG1pbkNvbHVtbnMgPVxuICAgICAgKHRoaXMubWFuaWZlc3Q/LndpZGdldHMubWFwKCh3KSA9PiB3LmxheW91dC53aWR0aCArIHcubGF5b3V0LngpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpLCAyKSA/PyAyKSAtIDE7XG5cbiAgICBjb25zdCBmdXR1cmVTaXplID0ge1xuICAgICAgcm93czogTWF0aC5tYXgobWluUm93cywgKHRoaXMubWFuaWZlc3QhLmdyaWQ/LnJvd3MgPz8gREVGQVVMVF9ST1dTX05VTUJFUikgKyAoZGlyZWN0aW9uID09PSAncm93cycgPyBvZmZzZXQgOiAwKSksXG4gICAgICBjb2x1bW5zOiBNYXRoLm1heChcbiAgICAgICAgbWluQ29sdW1ucyxcbiAgICAgICAgKHRoaXMubWFuaWZlc3QhLmdyaWQ/LmNvbHVtbnMgPz8gREVGQVVMVF9DT0xVTU5TX05VTUJFUikgKyAoZGlyZWN0aW9uID09PSAnY29sdW1ucycgPyBvZmZzZXQgOiAwKVxuICAgICAgKVxuICAgIH07XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgLi4udGhpcy5tYW5pZmVzdCEsXG4gICAgICAgICAgZ3JpZDoge1xuICAgICAgICAgICAgLi4uKHRoaXMubWFuaWZlc3Q/LmdyaWQgPz8ge30pLFxuICAgICAgICAgICAgLi4uZnV0dXJlU2l6ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiby1kYXNoYm9hcmQtZWRpdFwiIFtjbGFzcy4tZWRpdF09XCJtb2RlRWRpdGlvbiQgfCBhc3luY1wiPlxuICA8ZGl2IGNsYXNzPVwiby1kYXNoYm9hcmQtYWRkIC1yb3dzXCI+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2hhbmdlU2l6ZSgncm93cycsIC0xKVwiPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJyZW1vdmVcIiBbd2lkdGhdPVwiMTJcIiBbaGVpZ2h0XT1cIjEyXCI+PC9wcnktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjaGFuZ2VTaXplKCdyb3dzJywgKzEpXCI+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiIFt3aWR0aF09XCIxMlwiIFtoZWlnaHRdPVwiMTJcIj48L3ByeS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxwPnt7ICdAcHJ5LmdyaWQucm93cycgfCBpMThuIH19PC9wPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm8tZGFzaGJvYXJkLWFkZCAtY29sc1wiPlxuICAgIDxwPnt7ICdAcHJ5LmdyaWQuY29sdW1ucycgfCBpMThuIH19PC9wPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNoYW5nZVNpemUoJ2NvbHVtbnMnLCAtMSlcIj5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwicmVtb3ZlXCIgW3dpZHRoXT1cIjEyXCIgW2hlaWdodF09XCIxMlwiPjwvcHJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2hhbmdlU2l6ZSgnY29sdW1ucycsICsxKVwiPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJhZGRcIiBbd2lkdGhdPVwiMTJcIiBbaGVpZ2h0XT1cIjEyXCI+PC9wcnktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm8tZGFzaGJvYXJkLWdyaWRcIlxuICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zXT1cImdyaWRUZW1wbGF0ZUNvbHVtbnMkIHwgYXN5bmNcIlxuICAgIFtzdHlsZS5ncmlkVGVtcGxhdGVSb3dzXT1cImdyaWRUZW1wbGF0ZVJvd3MkIHwgYXN5bmNcIlxuICAgIFtzdHlsZS5ncmlkR2FwXT1cImRhc2hib2FyZFBhcmFtcy5ncmlkR2FwICsgJ3B4J1wiXG4gICAgI2dyaWRcbiAgICAobW91c2Vtb3ZlKT1cIm1vdmluZ01vdXNlKCRldmVudClcIlxuICAgIChkcm9wKT1cImRyb3BwaW5nKCRldmVudClcIlxuICAgIChkcmFnb3Zlcik9XCJkcmFnTW92ZSgkZXZlbnQpXCJcbiAgICAoZHJhZ2xlYXZlKT1cImRyYWdMZWF2ZSgkZXZlbnQpXCJcbiAgICAoZHJhZ2VudGVyKT1cImRyYWdFbnRlcigkZXZlbnQpXCJcbiAgPlxuICAgIEBmb3IgKFxuICAgICAgd2lkZ2V0TWFuaWZlc3Qgb2YgKHdpbmRvd01hbmlmZXN0JCB8IGFzeW5jKT8ud2lkZ2V0cyB8fCBbXTtcbiAgICAgIHRyYWNrIHRyYWNrV2lkZ2V0cyh3aWRnZXRJbmRleCwgd2lkZ2V0TWFuaWZlc3QpO1xuICAgICAgbGV0IHdpZGdldEluZGV4ID0gJGluZGV4XG4gICAgKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiby1kYXNoYm9hcmQtd2lkZ2V0XCJcbiAgICAgICAgW2NsYXNzLi1lZGl0ZWRdPVwibW9kZUVkaXRpb25cIlxuICAgICAgICBbc3R5bGUuZ3JpZENvbHVtbl09XCJncmlkQ29sdW1uKHdpZGdldE1hbmlmZXN0LmxheW91dClcIlxuICAgICAgICBbc3R5bGUuZ3JpZFJvd109XCJncmlkUm93KHdpZGdldE1hbmlmZXN0LmxheW91dClcIlxuICAgICAgICAoZHJvcCk9XCJkcm9wcGluZ0luV2lkZ2V0KCRldmVudCwgd2lkZ2V0SW5kZXgpXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChtb2RlRWRpdGlvbikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgbnctcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLW53JylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibm9ydGhfd2VzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgc3ctcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLXN3JylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic291dGhfd2VzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgbmUtcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLW5lJylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibm9ydGhfZWFzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgc2UtcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLXNlJylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic291dGhfZWFzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgZGVsZXRlXCIgKG1vdXNlZG93bik9XCJ0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudCwgd2lkZ2V0SW5kZXgpXCI+XG4gICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2FuaW1hdGlvbl09XCJmYWxzZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vdmVcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoJGV2ZW50LCB3aWRnZXRJbmRleClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3ZlLWluc2lkZSBtb3ZlLXt7IHdpZGdldE1hbmlmZXN0LnR5cGUgfX1cIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgd2lkZ2V0TWFuaWZlc3QudGl0bGUgPz8gKCdAcHJ5LnRvb2xib3guJyArIHdpZGdldE1hbmlmZXN0LnR5cGUgfCBpMThuKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIW1vZGVFZGl0aW9uKSB7XG4gICAgICAgICAgPHByeS13aWRnZXQtaW5zdGFuY2lhdG9yXG4gICAgICAgICAgICBbc3RhdGljTWFuaWZlc3RdPVwid2lkZ2V0TWFuaWZlc3RcIlxuICAgICAgICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgICAgICA+PC9wcnktd2lkZ2V0LWluc3RhbmNpYXRvcj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmICghbm9CYWNrZ3JvdW5kKSB7XG4gICAgICBAaWYgKFxuICAgICAgICB7XG4gICAgICAgICAgbm9XaWRnZXRzOiAobm9uRmlsbGVyV2lkZ2V0cyQgfCBhc3luYykgPT09IDAsXG4gICAgICAgICAgZ2xvYmFsTG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgICAgICAgICBmZXRjaExvYWRpbmc6IChkYXRhRmV0Y2hpbmckIHwgYXN5bmMpPy5sZW5ndGggPz8gMSA+IDBcbiAgICAgICAgfTtcbiAgICAgICAgYXMgZGF0YVxuICAgICAgKSB7XG4gICAgICAgIEBpZiAoZGF0YS5ub1dpZGdldHMpIHtcbiAgICAgICAgICBAaWYgKGRhdGEuZ2xvYmFsTG9hZGluZykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXdpZGdldFwiIFtzdHlsZS5ncmlkLWFyZWFdPVwiYmFja2dyb3VuZEFyZWEkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgICAgPHByeS1wYWdlLWxvYWRlcj48L3ByeS1wYWdlLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby13aWRnZXRfX3RleHRcIj57eyAnQHByeS53aWRnZXQudGFyZ2V0LmxvYWRpbmcnIHwgaTE4biB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXdpZGdldFwiIFtzdHlsZS5ncmlkLWFyZWFdPVwiYmFja2dyb3VuZEFyZWEkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIGNsYXNzPVwibm8td2lkZ2V0X19zZWFyY2hcIlxuICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uLy4uL2Fzc2V0cy9zdmdzL3ByeV9yZWNoZXJjaGUuc3ZnXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ7e1xuICAgICAgICAgICAgICAgICAgKGxheW91dCA9PT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUxcbiAgICAgICAgICAgICAgICAgICAgPyAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfbWFudWFsJ1xuICAgICAgICAgICAgICAgICAgICA6ICdAcHJ5LndpZGdldC50YXJnZXQubm9uZV9hdXRvJ1xuICAgICAgICAgICAgICAgICAgKSB8IGkxOG5cbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8td2lkZ2V0X190ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICAobGF5b3V0ID09PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTFxuICAgICAgICAgICAgICAgICAgPyAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfbWFudWFsJ1xuICAgICAgICAgICAgICAgICAgOiAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfYXV0bydcbiAgICAgICAgICAgICAgICApIHwgaTE4blxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhLXBhZ2UtbG9hZGVyIGJhY2tkcm9wXCJcbiAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJkYXRhLmZldGNoTG9hZGluZyAmJiAhZGF0YS5nbG9iYWxMb2FkaW5nID8gJ2ZsZXgnIDogJ25vbmUnXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiKGRhc2hib2FyZFNpemUkIHwgYXN5bmMpPy53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZGFzaGJvYXJkU2l6ZSQgfCBhc3luYyk/LmhlaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LXBhZ2UtbG9hZGVyPjwvcHJ5LXBhZ2UtbG9hZGVyPlxuICAgICAgICAgIDxwPnt7ICdAcHJ5LndpZGdldC50YXJnZXQubG9hZGluZycgfCBpMThuIH19Li4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG48cHJ5LWNvbnRleHQtbWVudT48L3ByeS1jb250ZXh0LW1lbnU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVNb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm8tbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX190aXRsZVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJhLWgyXCIgaWQ9XCJkaWFsb2dfdGl0bGVcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubW9kYWxUaXRsZScgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImNvbmZpcm1SZW1vdmUoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIj5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC52YWxpZGF0ZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
627
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Byb3ZvbHkvZGFzaGJvYXJkL2xpYi9kYXNoYm9hcmQvY29tcG9uZW50cy9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvbGliL2Rhc2hib2FyZC9jb21wb25lbnRzL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVcsYUFBYSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxtQkFBbUIsRUFJcEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztB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QkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRWEsT0FBTztzQkFBekIsU0FBUzt1QkFBQyxNQUFNO2dCQWVSLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsL2VzNic7XG5pbXBvcnQge1xuICBhdWRpdFRpbWUsXG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgY29tYmluZUxhdGVzdFdpdGgsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZyb21FdmVudCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXBcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEaXNwbGF5T3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWwvZGlzcGxheS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBEYXNoYm9hcmRHcmlkTGF5b3V0LFxuICBEYXNoYm9hcmRNYW5pZmVzdCxcbiAgV2lkZ2V0TGF5b3V0LFxuICBXaWRnZXRNYW5pZmVzdFxufSBmcm9tICcuLi8uLi9jb3JlL21vZGVsL21hbmlmZXN0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBNSU1FX1RZUEVfUkVTVUxUU0VUIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbC9taW1ldHlwZS1yZXN1bHRzZXQuY29uc3RhbnQnO1xuaW1wb3J0IHsgQ2F0ZWdvcnlBY3Rpb25zIH0gZnJvbSAnLi4vLi4vY29yZS9zdG9yZS9jYXRlZ29yeS9jYXRlZ29yeS5hY3Rpb25zJztcbmltcG9ydCB7IENsYXNzQWN0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvY2xhc3MvY2xhc3MuYWN0aW9ucyc7XG5pbXBvcnQgeyBDb25maWdBY3Rpb25zIH0gZnJvbSAnLi4vLi4vY29yZS9zdG9yZS9jb25maWcvY29uZmlnLmFjdGlvbnMnO1xuaW1wb3J0IHsgQ29uZmlnU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vY29yZS9zdG9yZS9jb25maWcvY29uZmlnLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBEYXRhU291cmNlQWN0aW9ucyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2UuYWN0aW9ucyc7XG5pbXBvcnQgeyBGaWVsZEFjdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL2ZpZWxkL2ZpZWxkLmFjdGlvbnMnO1xuaW1wb3J0IHsgUmVsYXRpb25UeXBlc0FjdGlvbnMgfSBmcm9tICcuLi8uLi9jb3JlL3N0b3JlL3JlbGF0aW9uLXR5cGVzL3JlbGF0aW9uLXR5cGVzLmFjdGlvbnMnO1xuaW1wb3J0IHsgV2lkZ2V0UGxhY2VtZW50VXRpbHMgfSBmcm9tICcuLi9jb21wb25lbnRzL3dpZGdldHMvd2lkZ2V0LXBsYWNlbWVudC93aWRnZXQtcGxhY2VtZW50LnV0aWxzJztcbmltcG9ydCB7IERhc2hib2FyZEFjdGlvbnMsIERhc2hib2FyZENlbGxQYXJhbXMsIFZpZXdNb2RlIH0gZnJvbSAnLi4vc3RvcmUvZGFzaGJvYXJkLmFjdGlvbnMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9DT0xVTU5TX05VTUJFUixcbiAgREVGQVVMVF9HQVBfUFgsXG4gIERFRkFVTFRfUk9XX0hFSUdIVF9QWCxcbiAgREVGQVVMVF9ST1dTX05VTUJFUlxufSBmcm9tICcuLi9zdG9yZS9kYXNoYm9hcmQuY29udGFudHMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkU2VsZWN0b3JzIH0gZnJvbSAnLi4vc3RvcmUvZGFzaGJvYXJkLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBzb2x2ZUNvbGxpc2lvbnMgfSBmcm9tICcuL3NvbHZlLWNvbGxpc2lvbnMuZnVuY3Rpb24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIH0gZnJvbSAnLi9zdWJzY3JpcHRpb25uZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IFdpZGdldEluc3RhbmNpYXRvckNvbXBvbmVudCB9IGZyb20gJy4vd2lkZ2V0cy93aWRnZXQtaW5zdGFuY2lhdG9yL3dpZGdldC1pbnN0YW5jaWF0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaFNlbGVjdG9ycyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvc2VhcmNoL3NlYXJjaC5zZWxlY3RvcnMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uL2NvcmUvc3RvcmUvZGF0YS1zb3VyY2UvZGF0YS1zb3VyY2Uuc2VsZWN0b3JzJztcbmltcG9ydCB7IE1hbmlmZXN0U2VydmljZSB9IGZyb20gJy4uL3N0b3JlL21hbmlmZXN0LnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgTUlNRV9UWVBFX1dJREdFVF9NQU5JRkVTVCA9ICdhcHBsaWNhdGlvbi93aWRnZXQtbWFuaWZlc3QnO1xuZXhwb3J0IGNvbnN0IE1JTUVfVFlQRV9XSURHRVRfVFlQRSA9ICdhcHBsaWNhdGlvbi93aWRnZXQtdHlwZS0nO1xuZXhwb3J0IGNvbnN0IE1JTUVfVFlQRV9XSURHRVRfU0laRSA9ICdhcHBsaWNhdGlvbi93aWRnZXQtc2l6ZS0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGV4dGVuZHMgU3Vic2NyaXB0aW9ubmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgbWFuaWZlc3Q6IERhc2hib2FyZE1hbmlmZXN0IHwgbnVsbCA9IG51bGw7XG4gIHdpbmRvd01hbmlmZXN0JDogT2JzZXJ2YWJsZTxEYXNoYm9hcmRNYW5pZmVzdD47XG4gIG1vZGVFZGl0aW9uID0gZmFsc2U7XG4gIG1vZGVFZGl0aW9uJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgYWN0aW9uVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdGF0aWNEYXNoYm9hcmQkOiBCZWhhdmlvclN1YmplY3Q8RGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGFzaGJvYXJkTWFuaWZlc3QgfCBudWxsPihudWxsKTtcbiAgc3RhY2tlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaW5kZXhGb3JSZW1vdmFsOiBudW1iZXIgPSAtMTtcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVNb2RhbCcsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSkgdGVtcGxhdGVNb2RhbCE6IFRlbXBsYXRlUmVmPGFueT47XG4gIHNlcGFyYXRvcnMkOiBPYnNlcnZhYmxlPFdpZGdldExheW91dFtdPjtcbiAgbm9uRmlsbGVyV2lkZ2V0cyQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgbG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIEBWaWV3Q2hpbGRyZW4oV2lkZ2V0SW5zdGFuY2lhdG9yQ29tcG9uZW50KSBpbnN0YW5jaWF0b3JzPzogUXVlcnlMaXN0PFdpZGdldEluc3RhbmNpYXRvckNvbXBvbmVudD47XG4gIGRhdGFGZXRjaGluZyQ6IE9ic2VydmFibGU8c3RyaW5nW10+O1xuICBwYXJhbXM6IERhc2hib2FyZENlbGxQYXJhbXMgPSB7fSBhcyBEYXNoYm9hcmRDZWxsUGFyYW1zO1xuICBmb3JjZU1vZGVFZGl0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBfZGFzaGJvYXJkU2l6ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oeyB3aWR0aDogMzAwLCBoZWlnaHQ6IDMwMCB9KTtcbiAgZGFzaGJvYXJkU2l6ZSQ6IE9ic2VydmFibGU8eyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PjtcbiAgd2lkZ2V0Wm9vbUluOiB7IGluZGV4OiBudW1iZXI7IHpvb206IGJvb2xlYW47IGxheW91dDogV2lkZ2V0TGF5b3V0IH0gPSB7XG4gICAgaW5kZXg6IDAsXG4gICAgem9vbTogZmFsc2UsXG4gICAgbGF5b3V0OiB7fSBhcyBXaWRnZXRMYXlvdXRcbiAgfTtcblxuICBnZXQgd2lkZ2V0c0luc3RhbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jaWF0b3JzPy5tYXAoKGluc3RhbmNpYXRvcikgPT4gaW5zdGFuY2lhdG9yLmluc3RhbmNpYXRlZENvbXBvbmVudC5pbnN0YW5jZSkgPz8gW107XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3RhdGljRGFzaGJvYXJkKHdpbmRvdzogRGFzaGJvYXJkTWFuaWZlc3QpIHtcbiAgICB0aGlzLnN0YXRpY0Rhc2hib2FyZCQubmV4dCh3aW5kb3cpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZvcmNlTW9kZUVkaXRpb24obW9kZTogYm9vbGVhbikge1xuICAgIHRoaXMuZm9yY2VNb2RlRWRpdGlvbiQubmV4dChtb2RlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIENsb3NlT25EcmFnT3V0ID0gdHJ1ZTtcbiAgQElucHV0KCkgZGlzcGxheU9wdGlvbnM/OiBEaXNwbGF5T3B0aW9ucztcbiAgQElucHV0KCkgbm9CYWNrZ3JvdW5kID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZ3JpZCcpIGdyaWRSZWYhOiBFbGVtZW50UmVmO1xuICBwcml2YXRlIGNhbkNhbGN1bGF0ZVZpZXcgPSBmYWxzZTtcbiAgdGFyZ2V0SW5kZXhlcyQ6IE9ic2VydmFibGU8bnVtYmVyW10+O1xuICBkYXNoYm9hcmRQYXJhbXM6IERhc2hib2FyZENlbGxQYXJhbXMgPSB7XG4gICAgZ3JpZFdpZHRoOiAxLFxuICAgIGdyaWRIZWlnaHQ6IDEsXG4gICAgZ3JpZEdhcDogREVGQVVMVF9HQVBfUFgsXG4gICAgY29sdW1uczogREVGQVVMVF9DT0xVTU5TX05VTUJFUixcbiAgICBjZWxsV2lkdGg6IDEsXG4gICAgY2VsbEhlaWdodDogREVGQVVMVF9ST1dfSEVJR0hUX1BYLFxuICAgIHJvd3M6IERFRkFVTFRfUk9XU19OVU1CRVIsXG4gICAgb2Zmc2V0TGVmdDogMCxcbiAgICBvZmZzZXRUb3A6IDAsXG4gICAgbW9iaWxlTW9kZTogZmFsc2VcbiAgfTtcbiAgQElucHV0KCkgYnJlYWtwb2ludDogbnVtYmVyID0gMDtcbiAgQE91dHB1dCgpIHJvd0hlaWdodCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcm93cyA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBjdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0OiBXaWRnZXRNYW5pZmVzdCB8IG51bGwgPSBudWxsO1xuICBpbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0OiBXaWRnZXRNYW5pZmVzdFtdID0gW107XG4gIG1vdmU6IHtcbiAgICBpbml0aWFsWDogbnVtYmVyO1xuICAgIGluaXRpYWxZOiBudW1iZXI7XG4gICAgcHJldmlvdXNYOiBudW1iZXI7XG4gICAgcHJldmlvdXNZOiBudW1iZXI7XG4gIH0gPSB7XG4gICAgaW5pdGlhbFg6IC0xLFxuICAgIGluaXRpYWxZOiAtMSxcbiAgICBwcmV2aW91c1g6IC0xLFxuICAgIHByZXZpb3VzWTogLTFcbiAgfTtcbiAgZ3JpZFRlbXBsYXRlUm93cyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZ3JpZFRlbXBsYXRlQ29sdW1ucyQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgRGFzaGJvYXJkR3JpZExheW91dCA9IERhc2hib2FyZEdyaWRMYXlvdXQ7XG4gIGxheW91dDogc3RyaW5nID0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUw7XG4gIGJhY2tncm91bmRBcmVhJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBwcml2YXRlIGNvbmZpcm1SZW1vdmVSZWY/OiBPdmVybGF5UmVmO1xuICBBcnJheTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIG1hbmlmZXN0U2VydmljZTogTWFuaWZlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1hbmlmZXN0U2VydmljZS53aWRnZXRab29tSW4uc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIHRoaXMud2lkZ2V0Wm9vbUluID0gcmVzdWx0O1xuICAgIH0pO1xuICAgIHRoaXMubG9hZGluZyQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMubG9hZGluZyk7XG4gICAgdGhpcy5kYXRhRmV0Y2hpbmckID0gdGhpcy5zdG9yZS5zZWxlY3QoU2VhcmNoU2VsZWN0b3JzLnNlYXJjaExvYWRpbmcpLnBpcGUoZGVsYXkoMTApKTtcbiAgICB0aGlzLm1vZGVFZGl0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRhc2hib2FyZEVkaXRpb25Nb2RlKSxcbiAgICAgIHRoaXMuZm9yY2VNb2RlRWRpdGlvbiRcbiAgICBdKS5waXBlKG1hcCgoW3N0b3JlTW9kZSwgZm9yY2VNb2RlXSkgPT4gKGZvcmNlTW9kZSA9PT0gdW5kZWZpbmVkID8gc3RvcmVNb2RlIDogZm9yY2VNb2RlKSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm1vZGVFZGl0aW9uJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgdGhpcy5tb2RlRWRpdGlvbiA9IG1vZGU7XG4gICAgICAgIGlmICghbW9kZSkge1xuICAgICAgICAgIHRoaXMuY2xlYXJBY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnRhcmdldEluZGV4ZXMkID0gdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLnRhcmdldFRlbmFudHNJbmRleGVzKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLmRhc2hib2FyZENlbGxQYXJhbXMpLnN1YnNjcmliZSgocGFyYW1zKSA9PiAodGhpcy5kYXNoYm9hcmRQYXJhbXMgPSBwYXJhbXMpKVxuICAgICk7XG4gICAgdGhpcy53aW5kb3dNYW5pZmVzdCQgPSB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMud2luZG93TWFuaWZlc3QpLnBpcGUoXG4gICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLnN0YXRpY0Rhc2hib2FyZCQpLFxuICAgICAgc3dpdGNoTWFwKChbd2luZG93TWFuaWZlc3QsIHN0YXRpY0Rhc2hib2FyZF0pID0+ICghc3RhdGljRGFzaGJvYXJkID8gb2Yod2luZG93TWFuaWZlc3QpIDogb2Yoc3RhdGljRGFzaGJvYXJkKSkpLFxuICAgICAgbWFwKChfd01hbmlmZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHdNYW5pZmVzdCA9IHN0cnVjdHVyZWRDbG9uZShfd01hbmlmZXN0KTtcbiAgICAgICAgaWYgKHdNYW5pZmVzdC5ncmlkPy5sYXlvdXQgJiYgd01hbmlmZXN0LmdyaWQubGF5b3V0ICE9PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTCkge1xuICAgICAgICAgIC8vIENvbXBsZXRlIHdpdGggcGxhY2Vob2xkZXJzXG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IFdpZGdldFBsYWNlbWVudFV0aWxzLmdldExheW91dCh3TWFuaWZlc3QuZ3JpZC5sYXlvdXQpPy5wbGFjZXMubGVuZ3RoID8/IDA7XG4gICAgICAgICAgY29uc3QgcGxhY2VzID0gV2lkZ2V0UGxhY2VtZW50VXRpbHMucGxhY2VtZW50T3B0aW9ucyhcbiAgICAgICAgICAgIHsgdHlwZTogJ2ZpbGxlcicsIGxheW91dDogeyB4OiAxLCB5OiAxLCB3aWR0aDogMSwgaGVpZ2h0OiAxIH0gfSxcbiAgICAgICAgICAgIHdNYW5pZmVzdC5ncmlkLmxheW91dFxuICAgICAgICAgICk7XG4gICAgICAgICAgbGV0IGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICB3aGlsZSAod01hbmlmZXN0LndpZGdldHMubGVuZ3RoIDwgc2l6ZSAmJiBhZGRlZCkge1xuICAgICAgICAgICAgYWRkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9IHsgLi4ucGxhY2VzW2ldLCBvcHRpb25zOiB7IGluZGV4OiBpIH0gfTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHdNYW5pZmVzdC53aWRnZXRzXG4gICAgICAgICAgICAgICAgICAubWFwKCh3aWRnZXQ6IFdpZGdldE1hbmlmZXN0KSA9PiBXaWRnZXRQbGFjZW1lbnRVdGlscy5hcmVEaXNqb2ludCh3aWRnZXQsIHBvdGVudGlhbCkpXG4gICAgICAgICAgICAgICAgICAucmVkdWNlKChhOiBib29sZWFuLCBiOiBib29sZWFuKSA9PiBhICYmIGIsIHRydWUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHdNYW5pZmVzdC53aWRnZXRzLnB1c2gocG90ZW50aWFsKTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdNYW5pZmVzdDtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IGVxdWFsKHAsIGMpKVxuICAgICk7XG4gICAgdGhpcy5ub25GaWxsZXJXaWRnZXRzJCA9IHRoaXMud2luZG93TWFuaWZlc3QkLnBpcGUoXG4gICAgICBtYXAoKHdNYW5pZmVzdCkgPT4gKHdNYW5pZmVzdC53aWRnZXRzID8/IFtdKS5maWx0ZXIoKHcpID0+IHcudHlwZSAhPT0gJ2ZpbGxlcicpLmxlbmd0aClcbiAgICApO1xuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChGaWVsZEFjdGlvbnMubG9hZCh7fSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ2xhc3NBY3Rpb25zLmxvYWQoe30pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENhdGVnb3J5QWN0aW9ucy5sb2FkKHt9KSk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmdldE1hcFN0eWxlcygpKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhdGFTb3VyY2VBY3Rpb25zLmxvYWQoe30pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFJlbGF0aW9uVHlwZXNBY3Rpb25zLmxvYWQoe30pKTtcbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKENvbmZpZ0FjdGlvbnMubG9hZEN1c3RvbWl6YXRpb24oe30pKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUoYXVkaXRUaW1lKDEwMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlldygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbdGhpcy53aW5kb3dNYW5pZmVzdCQsIHRoaXMubW9kZUVkaXRpb24kXSlcbiAgICAgICAgLnBpcGUoYXVkaXRUaW1lKDEwMCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlVmlldygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKCRldmVudDogRXZlbnQpID0+ICRldmVudCBhcyBLZXlib2FyZEV2ZW50KSxcbiAgICAgICAgICBmaWx0ZXIoKCRldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gJGV2ZW50LmtleSA9PT0gJ0wnICYmICRldmVudC5jdHJsS2V5ICYmICRldmVudC5zaGlmdEtleSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy50b2dnbGVFZGl0aW9uTW9kZSh7fSkpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ21vdXNldXAnKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyQWN0aW9ucygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENvbmZpZ1NlbGVjdG9ycy5icmVha3BvaW50KS5zdWJzY3JpYmUoKGJwKSA9PiB7XG4gICAgICAgIHRoaXMuYnJlYWtwb2ludCA9IGJwO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMud2luZG93TWFuaWZlc3QkLnN1YnNjcmliZSgobWFuaWZlc3QpID0+IHtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5ncmlkTGF5b3V0KS5zdWJzY3JpYmUoKGxheW91dCkgPT4ge1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuZ3JpZFRlbXBsYXRlUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndpbmRvd01hbmlmZXN0JCwgdGhpcy5zdGFja2VkJF0pLnBpcGUoXG4gICAgICBtYXAoKFttYW5pZmVzdCwgc3RhY2tlZF0pID0+XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVSb3dzKFxuICAgICAgICAgIHN0YWNrZWQgJiYgdGhpcy5tYW5pZmVzdFxuICAgICAgICAgICAgPyB0aGlzLm1hbmlmZXN0Py53aWRnZXRzLm1hcCgod20pID0+IHdtLmxheW91dC5oZWlnaHQpLnJlZHVjZSgod20xLCB3bTIpID0+IHdtMSArIHdtMiwgMClcbiAgICAgICAgICAgIDogbWFuaWZlc3QuZ3JpZD8ucm93cyA/PyBERUZBVUxUX1JPV1NfTlVNQkVSXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5ncmlkVGVtcGxhdGVDb2x1bW5zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2luZG93TWFuaWZlc3QkLCB0aGlzLnN0YWNrZWQkXSkucGlwZShcbiAgICAgIG1hcCgoW21hbmlmZXN0LCBzdGFja2VkXSkgPT4gdGhpcy5nZW5lcmF0ZUNvbHVtbnMoc3RhY2tlZCA/IDEgOiBtYW5pZmVzdC5ncmlkPy5jb2x1bW5zIHx8IERFRkFVTFRfQ09MVU1OU19OVU1CRVIpKVxuICAgICk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRBcmVhJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMud2luZG93TWFuaWZlc3QkLCB0aGlzLnN0YWNrZWQkXSkucGlwZShcbiAgICAgIG1hcCgoW21hbmlmZXN0LCBzdGFja2VkXSkgPT5cbiAgICAgICAgIXN0YWNrZWRcbiAgICAgICAgICA/IGAxLzEvJHsobWFuaWZlc3QuZ3JpZD8ucm93cyA/PyBERUZBVUxUX1JPV1NfTlVNQkVSKSArIDF9LyR7XG4gICAgICAgICAgICAgIChtYW5pZmVzdC5ncmlkPy5jb2x1bW5zID8/IERFRkFVTFRfQ09MVU1OU19OVU1CRVIpICsgMVxuICAgICAgICAgICAgfWBcbiAgICAgICAgICA6IGAxLzEvJHsobWFuaWZlc3QuZ3JpZD8uY29sdW1ucyA/PyBERUZBVUxUX0NPTFVNTlNfTlVNQkVSKSArIDF9LzFgXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuc2VwYXJhdG9ycyQgPSB0aGlzLnN0b3JlXG4gICAgICAuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5ncmlkTGF5b3V0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgobGF5b3V0KSA9PlxuICAgICAgICAgIGxheW91dCA9PT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUwgPyBbXSA6IFdpZGdldFBsYWNlbWVudFV0aWxzLmdldExheW91dChsYXlvdXQpPy5wbGFjZXMgPz8gW11cbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIHRoaXMuZGFzaGJvYXJkU2l6ZSQgPSB0aGlzLl9kYXNoYm9hcmRTaXplJC5waXBlKFxuICAgICAgc3RhcnRXaXRoKHtcbiAgICAgICAgd2lkdGg6IDMwMCxcbiAgICAgICAgaGVpZ2h0OiAzMDBcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IHAud2lkdGggPT09IGMud2lkdGggJiYgcC5oZWlnaHQgPT09IGMuaGVpZ2h0KSxcbiAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHAsIGMpID0+IHAud2lkdGggPT09IGMud2lkdGggJiYgcC5oZWlnaHQgPT09IGMuaGVpZ2h0KVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVTZWxmU2l6ZSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLndpbmRvd01hbmlmZXN0JCxcbiAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGF0YVNvdXJjZVNlbGVjdG9ycy5nZXREYXRhU291cmNlcyksXG4gICAgICAgIHRoaXMuc3RhdGljRGFzaGJvYXJkJFxuICAgICAgXSkuc3Vic2NyaWJlKChbbWFuaWZlc3QsIGRhdGFzZXRzLCBzdGF0aWNNYW5pZmVzdF0pID0+IHtcbiAgICAgICAgaWYgKGRhdGFzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuYXNzZXJ0UmVzdWx0U2V0cyh7IHN0YXRpY01hbmlmZXN0IH0pKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGxheU9wdGlvbnMpXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZURpc3BsYXlPcHRpb25zKHsgbW9kZTogVmlld01vZGUuQ1VTVE9NLCBjdXN0b21EaXNwbGF5OiB0aGlzLmRpc3BsYXlPcHRpb25zIH0pXG4gICAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2FuQ2FsY3VsYXRlVmlldyA9IHRydWU7XG4gIH1cblxuICB1cGRhdGVTZWxmU2l6ZSgpIHtcbiAgICBjb25zdCBib3VuZGluZ1JlY3QgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5fZGFzaGJvYXJkU2l6ZSQubmV4dCh7IHdpZHRoOiBib3VuZGluZ1JlY3Qud2lkdGgsIGhlaWdodDogYm91bmRpbmdSZWN0LmhlaWdodCB9KTtcbiAgfVxuXG4gIC8qKipcbiAgICogTWFuYWdlIGRpc3BsYXlcbiAgICovXG4gIGNhbGN1bGF0ZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuY2FuQ2FsY3VsYXRlVmlldykge1xuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmdyaWRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHdoaWxlIChlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCA9PT0gMCAmJiAhIWVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBncmlkV2lkdGggPSAoPEhUTUxFbGVtZW50PmVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgY29uc3QgbW9iaWxlTW9kZSA9IGdyaWRXaWR0aCA8IHRoaXMuYnJlYWtwb2ludDtcbiAgICAgIHRoaXMuc3RhY2tlZCQubmV4dCh0aGlzLmRhc2hib2FyZFBhcmFtcy5tb2JpbGVNb2RlICYmICF0aGlzLm1vZGVFZGl0aW9uKTtcbiAgICAgIGNvbnN0IHJvd3MgPSAhdGhpcy5kaXNwbGF5SXNTdGFja2VkXG4gICAgICAgID8gKCEhdGhpcy5tYW5pZmVzdCAmJiAhIXRoaXMubWFuaWZlc3QuZ3JpZCAmJiB0aGlzLm1hbmlmZXN0LmdyaWQucm93cykgfHwgREVGQVVMVF9ST1dTX05VTUJFUlxuICAgICAgICA6IHRoaXMubWFuaWZlc3Q/LndpZGdldHMucmVkdWNlKChwOiBudW1iZXIsIGM6IFdpZGdldE1hbmlmZXN0KSA9PiBwICsgYy5sYXlvdXQuaGVpZ2h0LCAwKSA/PyAxO1xuXG4gICAgICB0aGlzLnBhcmFtcyA9IHtcbiAgICAgICAgZ3JpZFdpZHRoLFxuICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IHRvIHBhcmVudCB0aGUgcGFyZW50J3NcbiAgICAgICAgZ3JpZEhlaWdodDogZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsXG4gICAgICAgIGdyaWRHYXA6IDEsXG4gICAgICAgIGNvbHVtbnM6ICghIXRoaXMubWFuaWZlc3QgJiYgISF0aGlzLm1hbmlmZXN0LmdyaWQgJiYgdGhpcy5tYW5pZmVzdC5ncmlkLmNvbHVtbnMpIHx8IERFRkFVTFRfQ09MVU1OU19OVU1CRVIsXG4gICAgICAgIGNlbGxIZWlnaHQ6IDEsXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGNlbGxXaWR0aDogMCxcbiAgICAgICAgb2Zmc2V0TGVmdDogdGhpcy5ncmlkUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICAgICAgb2Zmc2V0VG9wOiB0aGlzLmdyaWRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3AsXG4gICAgICAgIG1vYmlsZU1vZGVcbiAgICAgIH07XG4gICAgICB0aGlzLnBhcmFtcy5ncmlkR2FwID1cbiAgICAgICAgdGhpcy5wYXJhbXMucm93cyAqIHRoaXMucGFyYW1zLmNlbGxIZWlnaHQgPCB0aGlzLnBhcmFtcy5ncmlkSGVpZ2h0XG4gICAgICAgICAgPyAhIXRoaXMubWFuaWZlc3QgJiYgISF0aGlzLm1hbmlmZXN0LmdyaWRcbiAgICAgICAgICAgID8gdGhpcy5tYW5pZmVzdC5ncmlkLmdhcCB8fCBERUZBVUxUX0dBUF9QWFxuICAgICAgICAgICAgOiBERUZBVUxUX0dBUF9QWFxuICAgICAgICAgIDogMDtcbiAgICAgIHRoaXMucGFyYW1zLmNlbGxIZWlnaHQgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgKHRoaXMucGFyYW1zLmdyaWRIZWlnaHQgLSAodGhpcy5wYXJhbXMucm93cyAtIDEpICogdGhpcy5wYXJhbXMuZ3JpZEdhcCkgLyB0aGlzLnBhcmFtcy5yb3dzXG4gICAgICApO1xuICAgICAgdGhpcy5wYXJhbXMuY2VsbFdpZHRoID1cbiAgICAgICAgKHRoaXMucGFyYW1zLmdyaWRXaWR0aCAtICh0aGlzLnBhcmFtcy5jb2x1bW5zIC0gMSkgKiB0aGlzLnBhcmFtcy5ncmlkR2FwKSAvIHRoaXMucGFyYW1zLmNvbHVtbnM7XG5cbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRQYXJhbXMoeyBwYXJhbXM6IHRoaXMucGFyYW1zIH0pKTtcblxuICAgICAgdGhpcy5yb3dzLm5leHQodGhpcy5wYXJhbXMucm93cyk7XG4gICAgICB0aGlzLnJvd0hlaWdodC5uZXh0KHRoaXMucGFyYW1zLmNlbGxIZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNwbGF5SXNTdGFja2VkKCkge1xuICAgIHJldHVybiB0aGlzLnN0YWNrZWQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBncmlkQ29sdW1uKGxheW91dDogV2lkZ2V0TGF5b3V0KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5SXNTdGFja2VkIHx8ICFsYXlvdXQpIHtcbiAgICAgIHJldHVybiAnMSAvIDEnO1xuICAgIH1cbiAgICBpZiAobGF5b3V0LndpZHRoID4gMSkge1xuICAgICAgcmV0dXJuIGAke01hdGgubWluKGxheW91dC54LCB0aGlzLnBhcmFtcy5jb2x1bW5zIC0gbGF5b3V0LndpZHRoICsgMSl9IC8gJHtNYXRoLm1pbihcbiAgICAgICAgbGF5b3V0LnggKyBsYXlvdXQud2lkdGgsXG4gICAgICAgIHRoaXMucGFyYW1zLmNvbHVtbnMgKyAxXG4gICAgICApfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtsYXlvdXQueH1gO1xuICAgIH1cbiAgfVxuXG4gIGdyaWRSb3cobGF5b3V0OiBXaWRnZXRMYXlvdXQpOiBzdHJpbmcge1xuICAgIGlmICghbGF5b3V0KSB7XG4gICAgICByZXR1cm4gJzEnO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXNwbGF5SXNTdGFja2VkKSB7XG4gICAgICBjb25zdCBwcmV2aW91c0hlaWdodCA9IHRoaXMubWFuaWZlc3Q/LndpZGdldHNcbiAgICAgICAgLmZpbHRlcigod206IFdpZGdldE1hbmlmZXN0KSA9PiAod20ubGF5b3V0LnkgPT09IGxheW91dC55ICYmIHdtLmxheW91dC54IDwgbGF5b3V0LngpIHx8IHdtLmxheW91dC55IDwgbGF5b3V0LnkpXG4gICAgICAgIC5yZWR1Y2UoKHA6IG51bWJlciwgYzogV2lkZ2V0TWFuaWZlc3QpID0+IHAgKyBjLmxheW91dC5oZWlnaHQsIDEpO1xuICAgICAgcmV0dXJuIGAke3ByZXZpb3VzSGVpZ2h0ID8/IDF9IC8gJHsocHJldmlvdXNIZWlnaHQgPz8gMSkgKyBsYXlvdXQuaGVpZ2h0fWA7XG4gICAgfVxuICAgIGlmIChsYXlvdXQuaGVpZ2h0ID4gMSkge1xuICAgICAgcmV0dXJuIGAke01hdGgubWF4KDEsIE1hdGgubWluKGxheW91dC55LCB0aGlzLnBhcmFtcy5yb3dzIC0gbGF5b3V0LmhlaWdodCArIDEpKX0gLyAke01hdGgubWluKFxuICAgICAgICBsYXlvdXQueSArIGxheW91dC5oZWlnaHQsXG4gICAgICAgIHRoaXMucGFyYW1zLnJvd3MgKyAxXG4gICAgICApfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtsYXlvdXQueX1gO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUm93cyhyb3dzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBBcnJheShyb3dzKS5maWxsKCcxZnInKS5qb2luKCcgJyk7XG4gIH1cblxuICBnZW5lcmF0ZUNvbHVtbnMoY29sdW1uczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQXJyYXkoY29sdW1ucykuZmlsbCgnMWZyJykuam9pbignICcpO1xuICB9XG5cbiAgLyoqKlxuICAgKiBEaXJlY3QgYWN0aW9ucyBvbiB3aWRnZXRzXG4gICAqL1xuXG4gIHJlbW92ZShpOiBudW1iZXIpIHtcbiAgICBjb25zdCBsaXN0V2lkZ2V0TWFuaWZlc3RzID0gWy4uLih0aGlzLm1hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0c107XG4gICAgbGlzdFdpZGdldE1hbmlmZXN0cy5zcGxpY2UoaSwgMSkuZmlsdGVyKCh3aWRnZXQpID0+IHdpZGdldC50eXBlICE9PSAnZmlsbGVyJyk7XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7XG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgICB3aWRnZXRzOiBsaXN0V2lkZ2V0TWFuaWZlc3RzXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG1vdmVJbk5ld1dpbmRvdyh3aWRnZXRJbmRleDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLm1vdmVXaWRnZXQoeyB3aWRnZXRJbmRleCwgdGFyZ2V0SW5kZXggfSkpO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy50b2dnbGVFZGl0aW9uTW9kZSh7IGZvcmNlOiBmYWxzZSB9KSk7XG4gIH1cblxuICBtYXhpbWl6ZSh3aWRnZXRJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLm1heGltaXplV2lkZ2V0KHsgd2lkZ2V0SW5kZXggfSkpO1xuICB9XG5cbiAgLyoqKlxuICAgKiBNYW5hZ2UgZHJhZyBuIGRyb3AsIG1vdmUsIHJlc2l6ZVxuICAgKi9cblxuICBwcmVwYXJlTW9kaWZpY2F0aW9uKCRldmVudDogTW91c2VFdmVudCwgaW5kZXhNYW5pZmVzdDogbnVtYmVyKSB7XG4gICAgdGhpcy5tb3ZlLmluaXRpYWxYID0gJGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5tb3ZlLmluaXRpYWxZID0gJGV2ZW50LmNsaWVudFk7XG4gICAgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0ID0gc3RydWN0dXJlZENsb25lKCh0aGlzLm1hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0cyk7XG4gICAgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0ID0gdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0LnNwbGljZShpbmRleE1hbmlmZXN0LCAxKVswXTtcbiAgICAvLyBjb25zb2xlLmxvZygncHJlcGFyZScsIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCwgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0KTtcbiAgfVxuXG4gIHN0YXJ0UmVzaXplKCRldmVudDogTW91c2VFdmVudCwgaW5kZXhNYW5pZmVzdDogbnVtYmVyLCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgIHRoaXMuYWN0aW9uVHlwZSA9IGRpcmVjdGlvbjtcbiAgICB0aGlzLnByZXBhcmVNb2RpZmljYXRpb24oJGV2ZW50LCBpbmRleE1hbmlmZXN0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnc3RhcnQgcmVzaXplJywgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0LCB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3QpO1xuICB9XG5cbiAgZHJhZ1N0YXJ0KCRldmVudDogRHJhZ0V2ZW50LCBpbmRleE1hbmlmZXN0OiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGlvblR5cGUgPSAnbW92ZSc7XG4gICAgdGhpcy5wcmVwYXJlTW9kaWZpY2F0aW9uKCRldmVudCwgaW5kZXhNYW5pZmVzdCk7XG4gICAgRGFzaGJvYXJkQ29tcG9uZW50LmFkZFRyYW5zZmVyTWFuaWZlc3RNZXRhZGF0YSgkZXZlbnQsIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCA/PyAoe30gYXMgV2lkZ2V0TWFuaWZlc3QpKTtcbiAgICAvLyBjb25zb2xlLmxvZygnc3RhcnQgbW92ZScsIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCwgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFkZFRyYW5zZmVyTWFuaWZlc3RNZXRhZGF0YSgkZXZlbnQ6IERyYWdFdmVudCwgbWFuaWZlc3Q6IFdpZGdldE1hbmlmZXN0KSB7XG4gICAgaWYgKCEhJGV2ZW50ICYmICEhJGV2ZW50LmRhdGFUcmFuc2ZlciAmJiAhJGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5pbmNsdWRlcyhNSU1FX1RZUEVfV0lER0VUX01BTklGRVNUKSkge1xuICAgICAgJGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKE1JTUVfVFlQRV9XSURHRVRfTUFOSUZFU1QsIEpTT04uc3RyaW5naWZ5KG1hbmlmZXN0KSk7XG4gICAgICAkZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoTUlNRV9UWVBFX1dJREdFVF9UWVBFICsgbWFuaWZlc3QudHlwZSwgJ3VudXNlZCcpO1xuICAgICAgLy8gUGFzc2luZyB3aWRnZXQgc2l6ZSBhcyBhIG1pbWUgdHlwZSwgc28gdGhhdCB3ZSBjYW4gYnlwYXNzIHNlY3VyaXR5IGZvciBwbGFjZWhvbGRlciBzaXplIGF0IHRoZSBhcnJpdmFsIG9mIHRoZSBkcmFnXG4gICAgICAkZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXG4gICAgICAgIE1JTUVfVFlQRV9XSURHRVRfU0laRSArIGAke21hbmlmZXN0LmxheW91dC53aWR0aH0tJHttYW5pZmVzdC5sYXlvdXQuaGVpZ2h0fWAsXG4gICAgICAgICd1c2VsZXNzJyAvLyBkYXRhIGlzIGluIHRoZSBtaW1lIHR5cGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZHJhZ0VudGVyKCRldmVudDogRHJhZ0V2ZW50LCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgdHlwZXMgPSAoJGV2ZW50LmRhdGFUcmFuc2ZlciB8fCB7IHR5cGVzOiBbJyddIH0pLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzLmluY2x1ZGVzKE1JTUVfVFlQRV9XSURHRVRfTUFOSUZFU1QpKSB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudG9nZ2xlRWRpdGlvbk1vZGUoeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICB0aGlzLmFjdGlvblR5cGUgPSAnbW92ZSc7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGb3JEcmFnRW50ZXIoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QpIHtcbiAgICAgIC8vIGNyZWF0ZSBwbGFjZWhvbGRlciBhcyBhIGRyYWcgZW50ZXJlZCB0aGUgY29tcG9uZW50LCBnbyBpbnRvIGVkaXRpb24gbW9kZSBhbmQgbW92ZSBhY3Rpb24gaWYgaXQncyBhIHdpZGdldCBiZWluZyBkcmFnZ2VkXG4gICAgICBjb25zdCB0eXBlcyA9ICgoJGV2ZW50IGFzIERyYWdFdmVudCkuZGF0YVRyYW5zZmVyIHx8IHsgdHlwZXM6IFsnJ10gfSkudHlwZXM7XG4gICAgICBpZiAodHlwZXMuaW5jbHVkZXMoTUlNRV9UWVBFX1dJREdFVF9NQU5JRkVTVCkpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25UeXBlID0gJ21vdmUnO1xuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMudG9nZ2xlRWRpdGlvbk1vZGUoeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICAgICAgLy8gT24gZHJhZyBlbnRlciwgd2Ugb25seSBjYW4gcHV0IGEgcGxhY2Vob2xkZXIsIHNpbmNlIGZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgY29udGVudCBvZiB0aGUgZGF0YS10cmFuc2ZlciBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMubW92ZS5pbml0aWFsWCA9IHRoaXMuZGFzaGJvYXJkUGFyYW1zLm9mZnNldExlZnQ7XG4gICAgICAgIHRoaXMubW92ZS5pbml0aWFsWSA9IHRoaXMuZGFzaGJvYXJkUGFyYW1zLm9mZnNldFRvcDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRUYXJnZXQoJGV2ZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCA9IHtcbiAgICAgICAgICB0eXBlOiAncGxhY2Vob2xkZXInLFxuICAgICAgICAgIGxheW91dDogeyB4OiB0YXJnZXQ/LnggPz8gMCwgeTogdGFyZ2V0Py55ID8/IDAsIHdpZHRoOiAxLCBoZWlnaHQ6IDEgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoKHRoaXMubWFuaWZlc3QgfHwgeyB3aWRnZXRzOiBbXSB9KS53aWRnZXRzKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NyZWF0ZSBwbGFjZWhvbGRlcicsIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCwgdGhpcy5pbml0aWFsV2lkZ2V0TWFuaWZlc3RMaXN0KTtcblxuICAgICAgICAvLyBXZSBwYXNzZWQgd2lkZ2V0IHNpemUgYXMgYSBtaW1ldHlwZSBzbyB0aGF0IHdlIGNhbiBzdGlsbCByZWFkIGl0IHdpdGhvdXQgc2VjdXJpdHkgaXNzdWVzXG4gICAgICAgIGNvbnN0IHdpZGdldFNpemVNaW1lVHlwZSA9IHR5cGVzLmZpbmQoKHR5cGUpID0+IHR5cGUuaW5jbHVkZXMoTUlNRV9UWVBFX1dJREdFVF9TSVpFKSk7XG4gICAgICAgIGlmICghIXdpZGdldFNpemVNaW1lVHlwZSkge1xuICAgICAgICAgIGNvbnN0IFtfLCBfMiwgdywgaF0gPSB3aWRnZXRTaXplTWltZVR5cGUuc3BsaXQoJy0nKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QubGF5b3V0LndpZHRoID0gcGFyc2VJbnQodywgMTApO1xuICAgICAgICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdC5sYXlvdXQuaGVpZ2h0ID0gcGFyc2VJbnQoaCwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVzZSBncmlkIHNpemVcbiAgICAgICAgICBjb25zdCBsYXlvdXQgPSAoV2lkZ2V0UGxhY2VtZW50VXRpbHMuZ2V0TGF5b3V0KHRoaXMubGF5b3V0KT8ucGxhY2VzID8/IFtdKVtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFdpZGdldE1hbmlmZXN0TGlzdC5sZW5ndGhcbiAgICAgICAgICBdID8/IHtcbiAgICAgICAgICAgIHdpZHRoOiAxLFxuICAgICAgICAgICAgaGVpZ2h0OiAxXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QubGF5b3V0LndpZHRoID0gbGF5b3V0LndpZHRoO1xuICAgICAgICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdC5sYXlvdXQuaGVpZ2h0ID0gbGF5b3V0LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHBhc3NlZCB0aGUgdHlwZSBhcyBhIGhlYWRlciBuYW1lIHNvIHRoYXQgd2UgY2FuIHN0aWxsIGFjY2VzcyBpdCB3aXRob3V0IHNlY3VyaXR5IGlzc3Vlc1xuICAgICAgICBjb25zdCB3aWRnZXRUeXBlID0gdHlwZXMuZmluZCgodHlwZSkgPT4gdHlwZS5pbmNsdWRlcyhNSU1FX1RZUEVfV0lER0VUX1RZUEUpKTtcbiAgICAgICAgaWYgKCEhd2lkZ2V0VHlwZSkge1xuICAgICAgICAgIGNvbnN0IFtfLCBfMiwgdHlwZV0gPSB3aWRnZXRUeXBlLnNwbGl0KCctJyk7XG4gICAgICAgICAgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0LnR5cGUgPSB0eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlIG9uZSB3ZSBqdXN0IGNhbGN1bGF0ZWQsIHNvIHdlIGNhbiBjb250aW51ZSBwcm9wZXJseSBtb3ZlIHRoZSB3aWRnZXRcbiAgICAgICAgdGhpcy5tb3ZlLmluaXRpYWxYID0gJGV2ZW50LnBhZ2VYO1xuICAgICAgICB0aGlzLm1vdmUuaW5pdGlhbFkgPSAkZXZlbnQucGFnZVk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0VGFyZ2V0KCRldmVudDogTW91c2VFdmVudCwgb3B0aW1pemUgPSB0cnVlKSB7XG4gICAgY29uc3QgZFggPSAkZXZlbnQucGFnZVggLSB0aGlzLm1vdmUuaW5pdGlhbFg7XG4gICAgY29uc3QgZFkgPSAkZXZlbnQucGFnZVkgLSB0aGlzLm1vdmUuaW5pdGlhbFk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSB7XG4gICAgICB4OlxuICAgICAgICBkWCA9PT0gMFxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgKChkWCAvIE1hdGguYWJzKGRYKSkgKiAoTWF0aC5hYnMoZFgpIC0gMC41ICogdGhpcy5kYXNoYm9hcmRQYXJhbXMuY2VsbFdpZHRoKSkgL1xuICAgICAgICAgICAgICAgICh0aGlzLmRhc2hib2FyZFBhcmFtcy5jZWxsV2lkdGggKyB0aGlzLmRhc2hib2FyZFBhcmFtcy5ncmlkR2FwKVxuICAgICAgICAgICAgKSxcbiAgICAgIHk6XG4gICAgICAgIGRZID09PSAwXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAoKGRZIC8gTWF0aC5hYnMoZFkpKSAqIChNYXRoLmFicyhkWSkgLSAwLjUgKiB0aGlzLmRhc2hib2FyZFBhcmFtcy5jZWxsSGVpZ2h0KSkgL1xuICAgICAgICAgICAgICAgICh0aGlzLmRhc2hib2FyZFBhcmFtcy5jZWxsSGVpZ2h0ICsgdGhpcy5kYXNoYm9hcmRQYXJhbXMuZ3JpZEdhcClcbiAgICAgICAgICAgIClcbiAgICB9O1xuXG4gICAgaWYgKCFvcHRpbWl6ZSB8fCB0YXJnZXQueCAhPT0gdGhpcy5tb3ZlLnByZXZpb3VzWCB8fCB0YXJnZXQueSAhPT0gdGhpcy5tb3ZlLnByZXZpb3VzWSkge1xuICAgICAgdGhpcy5tb3ZlLnByZXZpb3VzWCA9IHRhcmdldC54O1xuICAgICAgdGhpcy5tb3ZlLnByZXZpb3VzWSA9IHRhcmdldC55O1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG1vdmluZ01vdXNlKCRldmVudDogTW91c2VFdmVudCwgb3B0aW1pemUgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMubW9kZUVkaXRpb24gJiYgISF0aGlzLmFjdGlvblR5cGUpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0KCRldmVudCwgb3B0aW1pemUpO1xuICAgICAgaWYgKHRhcmdldCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNoZWNrRm9yRHJhZ0VudGVyKCRldmVudCk7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVdpZGdldCA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLmN1cnJlbnRseU1vZGlmaWVkTWFuaWZlc3QpITtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMuYWN0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3Jlc2l6ZS1udyc6XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlV2lkZ2V0LmxheW91dC54ICsgdGFyZ2V0LnggPiAwICYmIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQuaGVpZ2h0IC0gdGFyZ2V0LnkgPiAwKSB7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQueCArPSB0YXJnZXQueDtcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC55ICs9IHRhcmdldC55O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LndpZHRoIC09IHRhcmdldC54O1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCAtPSB0YXJnZXQueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Jlc2l6ZS1zdyc6XG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlV2lkZ2V0LmxheW91dC53aWR0aCAtIHRhcmdldC54ID4gMCkge1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnggKz0gdGFyZ2V0Lng7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQud2lkdGggLT0gdGFyZ2V0Lng7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQuaGVpZ2h0ICs9IHRhcmdldC55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncmVzaXplLW5lJzpcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCAtIHRhcmdldC55ID4gMCkge1xuICAgICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnkgKz0gdGFyZ2V0Lnk7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQud2lkdGggKz0gdGFyZ2V0Lng7XG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQuaGVpZ2h0IC09IHRhcmdldC55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncmVzaXplLXNlJzpcbiAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQud2lkdGggKz0gdGFyZ2V0Lng7XG4gICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LmhlaWdodCArPSB0YXJnZXQueTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ21vdmUnOlxuICAgICAgICAgICAgY29uc3QgY3VycmVudE1heFggPVxuICAgICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmlmZXN0Py5ncmlkPy5jb2x1bW5zID8/IERFRkFVTFRfQ09MVU1OU19OVU1CRVIsXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMubWFuaWZlc3Q/LndpZGdldHMgPz8gW10pLm1hcCgodykgPT4gdy5sYXlvdXQud2lkdGggKyB3LmxheW91dC54KVxuICAgICAgICAgICAgICApIC1cbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LmxheW91dC53aWR0aCArXG4gICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICBjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjYW5kaWRhdGVXaWRnZXQubGF5b3V0LnggKyB0YXJnZXQueCwgY3VycmVudE1heFgpKTtcblxuICAgICAgICAgICAgY29uc3QgY3VycmVudE1heFkgPVxuICAgICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICB0aGlzLm1hbmlmZXN0Py5ncmlkPy5yb3dzID8/IERFRkFVTFRfUk9XU19OVU1CRVIsXG4gICAgICAgICAgICAgICAgLi4uKHRoaXMubWFuaWZlc3Q/LndpZGdldHMgPz8gW10pLm1hcCgodykgPT4gdy5sYXlvdXQuaGVpZ2h0ICsgdy5sYXlvdXQueSlcbiAgICAgICAgICAgICAgKSAtXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQuaGVpZ2h0ICtcbiAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgIGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQueSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGNhbmRpZGF0ZVdpZGdldC5sYXlvdXQueSArIHRhcmdldC55LCBjdXJyZW50TWF4WSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlRGFzaGJvYXJkTWFuaWZlc3Qoe1xuICAgICAgICAgICAgbWFuaWZlc3Q6IHNvbHZlQ29sbGlzaW9ucyhcbiAgICAgICAgICAgICAgY2FuZGlkYXRlV2lkZ2V0LFxuICAgICAgICAgICAgICB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3QsXG4gICAgICAgICAgICAgIHRoaXMubWFuaWZlc3QgPz8gKHt9IGFzIERhc2hib2FyZE1hbmlmZXN0KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZHJhZ01vdmUoJGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLm1vdmluZ01vdXNlKCRldmVudCk7XG4gIH1cblxuICBkcmFnTGVhdmUoJGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKCRldmVudC5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKCRldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGVzID0gKCRldmVudC5kYXRhVHJhbnNmZXIgfHwgeyB0eXBlczogWycnXSB9KS50eXBlcztcbiAgICBpZiAodHlwZXMuaW5jbHVkZXMoTUlNRV9UWVBFX1dJREdFVF9NQU5JRkVTVCkpIHtcbiAgICAgIC8vIEFzIHRoZSBkcmFnIGlzIGxlYXZpbmcgdGhlIHdpbmRvdywgZGVsZXRlIHRoZSB3aWRnZXQgZnJvbSBpdCwgYW5kIHN0b3AgZWRpdGlvbiBtb2RlXG4gICAgICBpZiAoISEkZXZlbnQgJiYgISEkZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7XG4gICAgICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgICAgICAgICB3aWRnZXRzOiB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNsZWFyQWN0aW9ucygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyb3BwaW5nKCRldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICghISRldmVudCAmJiAhISRldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGlmICgkZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzLmluY2x1ZGVzKE1JTUVfVFlQRV9XSURHRVRfTUFOSUZFU1QpKSB7XG4gICAgICAgIC8vIFJlYXJyYW5nZSBkcm9wIHRvIGNvcnJlY3Qgc2l6ZSwgdHlwZSwgLi4uLCBhcyBhIHBsYWNlaG9sZGVyIGFscmVhZHkgYmVlbiBhZGRlZCB0byBtYW5pZmVzdCBieSBkcmFnZW50ZXIgZXZlbnRcbiAgICAgICAgY29uc3QgZGF0YVRyYW5zZmVyTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICRldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShNSU1FX1RZUEVfV0lER0VUX01BTklGRVNUKVxuICAgICAgICApIGFzIFdpZGdldE1hbmlmZXN0O1xuXG4gICAgICAgIHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdCA9IHtcbiAgICAgICAgICAuLi5kYXRhVHJhbnNmZXJNYW5pZmVzdCxcbiAgICAgICAgICBsYXlvdXQ6IHRoaXMuY3VycmVudGx5TW9kaWZpZWRNYW5pZmVzdD8ubGF5b3V0ID8/ICh7fSBhcyBXaWRnZXRMYXlvdXQpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tb3ZpbmdNb3VzZSgkZXZlbnQsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKERhc2hib2FyZEFjdGlvbnMuYXNzZXJ0UmVzdWx0U2V0cyh7fSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsZWFyQWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyQWN0aW9ucygpIHtcbiAgICB0aGlzLmFjdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tb3ZlLmluaXRpYWxYID0gMDtcbiAgICB0aGlzLm1vdmUuaW5pdGlhbFkgPSAwO1xuICAgIHRoaXMubW92ZS5wcmV2aW91c1ggPSAtMTtcbiAgICB0aGlzLm1vdmUucHJldmlvdXNZID0gLTE7XG4gICAgdGhpcy5jdXJyZW50bHlNb2RpZmllZE1hbmlmZXN0ID0gbnVsbDtcbiAgICB0aGlzLmluaXRpYWxXaWRnZXRNYW5pZmVzdExpc3QgPSBbXTtcbiAgfVxuXG4gIC8qKipcbiAgICogTWFuYWdlIG90aGVyIGtpbmRzIG9mIGRyb3BzIChpbnNpZGUgd2lkZ2V0cylcbiAgICovXG4gIGRyb3BwaW5nSW5XaWRnZXQoJGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoISEkZXZlbnQgJiYgISEkZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBpZiAoJGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcy5pbmNsdWRlcyhNSU1FX1RZUEVfUkVTVUxUU0VUKSkge1xuICAgICAgICBjb25zdCBsaXN0V2lkZ2V0TWFuaWZlc3RzID0gWy4uLih0aGlzLm1hbmlmZXN0IHx8IHsgd2lkZ2V0czogW10gfSkud2lkZ2V0c107XG5cbiAgICAgICAgY29uc3QgcmVzdWx0U2V0TmFtZSA9ICRldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShNSU1FX1RZUEVfUkVTVUxUU0VUKTtcbiAgICAgICAgY29uc3QgY3VycmVudFJlc3VsdFNldCA9IChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGxpc3RXaWRnZXRNYW5pZmVzdHNbaW5kZXhdLmRhdGFzb3VyY2UpXG4gICAgICAgICAgICA/IGxpc3RXaWRnZXRNYW5pZmVzdHNbaW5kZXhdLmRhdGFzb3VyY2VcbiAgICAgICAgICAgIDogW2xpc3RXaWRnZXRNYW5pZmVzdHNbaW5kZXhdLmRhdGFzb3VyY2VdXG4gICAgICAgICkgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGN1bXVsYXRpdmUgPSAkZXZlbnQuc2hpZnRLZXk7XG4gICAgICAgIGNvbnN0IG5ld1Jlc3VsdFNldCA9IGN1bXVsYXRpdmUgPyBbLi4uY3VycmVudFJlc3VsdFNldCwgcmVzdWx0U2V0TmFtZV0gOiByZXN1bHRTZXROYW1lO1xuXG4gICAgICAgIGxpc3RXaWRnZXRNYW5pZmVzdHNbaW5kZXhdID0ge1xuICAgICAgICAgIC4uLmxpc3RXaWRnZXRNYW5pZmVzdHNbaW5kZXhdLFxuICAgICAgICAgIGRhdGFzb3VyY2U6IG5ld1Jlc3VsdFNldFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVEYXNoYm9hcmRNYW5pZmVzdCh7XG4gICAgICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgICAgICAgICB3aWRnZXRzOiBsaXN0V2lkZ2V0TWFuaWZlc3RzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmFzc2VydFJlc3VsdFNldHMoe30pKTtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudD86IE1vdXNlRXZlbnQsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpcm1SZW1vdmVSZWYpIHtcbiAgICAgIHRoaXMuaW5kZXhGb3JSZW1vdmFsID0gaW5kZXggPz8gLTE7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKFxuICAgICAgICBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydvLW1vZGFsLXdyYXBwZXInXSxcbiAgICAgICAgICBiYWNrZHJvcENsYXNzOiAnYmFja2Ryb3AnXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmFkZGluZ092ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKF8pID0+IHRoaXMudG9nZ2xlUmVtb3ZlQ29uZmlybSgpKTtcbiAgICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZi5hdHRhY2gobmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMudGVtcGxhdGVNb2RhbCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGl2Lm8tbW9kYWwtd3JhcHBlcicpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBpZiAoISFwYW5lbCkge1xuICAgICAgICAgIHBhbmVsLnN0eWxlLmxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCAtIHBhbmVsLmNsaWVudFdpZHRoLCAkZXZlbnQuY2xpZW50WCAtIDMwKSkgKyAncHgnO1xuICAgICAgICAgIHBhbmVsLnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCAtIHBhbmVsLmNsaWVudEhlaWdodCwgJGV2ZW50LmNsaWVudFkgLSAxMCkpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpcm1SZW1vdmVSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5jb25maXJtUmVtb3ZlUmVmID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChDb25maWdBY3Rpb25zLmNsb3NlT3ZlcmxheSh7IGlkOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnLW1vZGFsJyB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uZmlybVJlbW92ZSgpIHtcbiAgICB0aGlzLnJlbW92ZSh0aGlzLmluZGV4Rm9yUmVtb3ZhbCk7XG4gICAgdGhpcy5jYW5jZWxSZW1vdmVDb25maXJtKCk7XG4gIH1cblxuICBjYW5jZWxSZW1vdmVDb25maXJtKCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goQ29uZmlnQWN0aW9ucy5jbG9zZU92ZXJsYXkoeyBpZDogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJy1tb2RhbCcgfSkpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuY29uZmlybVJlbW92ZVJlZiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyYWNrV2lkZ2V0cyhpbmRleDogbnVtYmVyLCB3aWRnZXRNYW5pZmVzdDogV2lkZ2V0TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gaW5kZXggKyAnLScgKyB3aWRnZXRNYW5pZmVzdC50eXBlICsgJy0nICsgSlNPTi5zdHJpbmdpZnkod2lkZ2V0TWFuaWZlc3QubGF5b3V0KTtcbiAgfVxuXG4gIGNoYW5nZVNpemUoZGlyZWN0aW9uOiBzdHJpbmcsIG9mZnNldDogbnVtYmVyKSB7XG4gICAgY29uc3QgbWluUm93cyA9XG4gICAgICAodGhpcy5tYW5pZmVzdD8ud2lkZ2V0cy5tYXAoKHcpID0+IHcubGF5b3V0LmhlaWdodCArIHcubGF5b3V0LnkpLnJlZHVjZSgoYSwgYikgPT4gKGEgPiBiID8gYSA6IGIpLCAyKSA/PyAyKSAtIDE7XG4gICAgY29uc3QgbWluQ29sdW1ucyA9XG4gICAgICAodGhpcy5tYW5pZmVzdD8ud2lkZ2V0cy5tYXAoKHcpID0+IHcubGF5b3V0LndpZHRoICsgdy5sYXlvdXQueCkucmVkdWNlKChhLCBiKSA9PiAoYSA+IGIgPyBhIDogYiksIDIpID8/IDIpIC0gMTtcblxuICAgIGNvbnN0IGZ1dHVyZVNpemUgPSB7XG4gICAgICByb3dzOiBNYXRoLm1heChtaW5Sb3dzLCAodGhpcy5tYW5pZmVzdCEuZ3JpZD8ucm93cyA/PyBERUZBVUxUX1JPV1NfTlVNQkVSKSArIChkaXJlY3Rpb24gPT09ICdyb3dzJyA/IG9mZnNldCA6IDApKSxcbiAgICAgIGNvbHVtbnM6IE1hdGgubWF4KFxuICAgICAgICBtaW5Db2x1bW5zLFxuICAgICAgICAodGhpcy5tYW5pZmVzdCEuZ3JpZD8uY29sdW1ucyA/PyBERUZBVUxUX0NPTFVNTlNfTlVNQkVSKSArIChkaXJlY3Rpb24gPT09ICdjb2x1bW5zJyA/IG9mZnNldCA6IDApXG4gICAgICApXG4gICAgfTtcblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZURhc2hib2FyZE1hbmlmZXN0KHtcbiAgICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgICAuLi50aGlzLm1hbmlmZXN0ISxcbiAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICAuLi4odGhpcy5tYW5pZmVzdD8uZ3JpZCA/PyB7fSksXG4gICAgICAgICAgICAuLi5mdXR1cmVTaXplXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvLWRhc2hib2FyZC1lZGl0XCIgW2NsYXNzLi1lZGl0XT1cIm1vZGVFZGl0aW9uJCB8IGFzeW5jXCI+XG4gIDxkaXYgY2xhc3M9XCJvLWRhc2hib2FyZC1hZGQgLXJvd3NcIj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjaGFuZ2VTaXplKCdyb3dzJywgLTEpXCI+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cInJlbW92ZVwiIFt3aWR0aF09XCIxMlwiIFtoZWlnaHRdPVwiMTJcIj48L3ByeS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNoYW5nZVNpemUoJ3Jvd3MnLCArMSlcIj5cbiAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiYWRkXCIgW3dpZHRoXT1cIjEyXCIgW2hlaWdodF09XCIxMlwiPjwvcHJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPHA+e3sgJ0BwcnkuZ3JpZC5yb3dzJyB8IGkxOG4gfX08L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiby1kYXNoYm9hcmQtYWRkIC1jb2xzXCI+XG4gICAgPHA+e3sgJ0BwcnkuZ3JpZC5jb2x1bW5zJyB8IGkxOG4gfX08L3A+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2hhbmdlU2l6ZSgnY29sdW1ucycsIC0xKVwiPlxuICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJyZW1vdmVcIiBbd2lkdGhdPVwiMTJcIiBbaGVpZ2h0XT1cIjEyXCI+PC9wcnktaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjaGFuZ2VTaXplKCdjb2x1bW5zJywgKzEpXCI+XG4gICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImFkZFwiIFt3aWR0aF09XCIxMlwiIFtoZWlnaHRdPVwiMTJcIj48L3ByeS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiby1kYXNoYm9hcmQtZ3JpZFwiXG4gICAgW3N0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnNdPVwiZ3JpZFRlbXBsYXRlQ29sdW1ucyQgfCBhc3luY1wiXG4gICAgW3N0eWxlLmdyaWRUZW1wbGF0ZVJvd3NdPVwiZ3JpZFRlbXBsYXRlUm93cyQgfCBhc3luY1wiXG4gICAgW3N0eWxlLmdyaWRHYXBdPVwiZGFzaGJvYXJkUGFyYW1zLmdyaWRHYXAgKyAncHgnXCJcbiAgICAjZ3JpZFxuICAgIChtb3VzZW1vdmUpPVwibW92aW5nTW91c2UoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwiZHJvcHBpbmcoJGV2ZW50KVwiXG4gICAgKGRyYWdvdmVyKT1cImRyYWdNb3ZlKCRldmVudClcIlxuICAgIChkcmFnbGVhdmUpPVwiZHJhZ0xlYXZlKCRldmVudClcIlxuICAgIChkcmFnZW50ZXIpPVwiZHJhZ0VudGVyKCRldmVudClcIlxuICA+XG4gICAgQGZvciAoXG4gICAgICB3aWRnZXRNYW5pZmVzdCBvZiAod2luZG93TWFuaWZlc3QkIHwgYXN5bmMpPy53aWRnZXRzIHx8IFtdO1xuICAgICAgdHJhY2sgdHJhY2tXaWRnZXRzKHdpZGdldEluZGV4LCB3aWRnZXRNYW5pZmVzdCk7XG4gICAgICBsZXQgd2lkZ2V0SW5kZXggPSAkaW5kZXhcbiAgICApIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvLWRhc2hib2FyZC13aWRnZXRcIlxuICAgICAgICBbY2xhc3MuLWVkaXRlZF09XCJtb2RlRWRpdGlvblwiXG4gICAgICAgIFtjbGFzcy53aWRnZXQtem9vbS1pbl09XCJ3aWRnZXRab29tSW4uaW5kZXggPT09IHdpZGdldEluZGV4ICYmIHdpZGdldFpvb21Jbi56b29tXCJcbiAgICAgICAgW3N0eWxlLmdyaWRDb2x1bW5dPVwiXG4gICAgICAgICAgZ3JpZENvbHVtbihcbiAgICAgICAgICAgIHdpZGdldFpvb21Jbi5pbmRleCA9PT0gd2lkZ2V0SW5kZXggJiYgd2lkZ2V0Wm9vbUluLnpvb20gPyB3aWRnZXRab29tSW4ubGF5b3V0IDogd2lkZ2V0TWFuaWZlc3QubGF5b3V0XG4gICAgICAgICAgKVxuICAgICAgICBcIlxuICAgICAgICBbc3R5bGUuZ3JpZFJvd109XCJcbiAgICAgICAgICBncmlkUm93KHdpZGdldFpvb21Jbi5pbmRleCA9PT0gd2lkZ2V0SW5kZXggJiYgd2lkZ2V0Wm9vbUluLnpvb20gPyB3aWRnZXRab29tSW4ubGF5b3V0IDogd2lkZ2V0TWFuaWZlc3QubGF5b3V0KVxuICAgICAgICBcIlxuICAgICAgICAoZHJvcCk9XCJkcm9wcGluZ0luV2lkZ2V0KCRldmVudCwgd2lkZ2V0SW5kZXgpXCJcbiAgICAgID5cbiAgICAgICAgQGlmIChtb2RlRWRpdGlvbikge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgbnctcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLW53JylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibm9ydGhfd2VzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgc3ctcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLXN3JylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic291dGhfd2VzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgbmUtcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLW5lJylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwibm9ydGhfZWFzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgc2UtcmVzaXplXCIgKG1vdXNlZG93bik9XCJzdGFydFJlc2l6ZSgkZXZlbnQsIHdpZGdldEluZGV4LCAncmVzaXplLXNlJylcIj5cbiAgICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwic291dGhfZWFzdFwiIFthbmltYXRpb25dPVwiZmFsc2VcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUgZGVsZXRlXCIgKG1vdXNlZG93bik9XCJ0b2dnbGVSZW1vdmVDb25maXJtKCRldmVudCwgd2lkZ2V0SW5kZXgpXCI+XG4gICAgICAgICAgICA8cHJ5LWljb24gaWNvblN2Zz1cImNsb3NlXCIgW2FuaW1hdGlvbl09XCJmYWxzZVwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vdmVcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoJGV2ZW50LCB3aWRnZXRJbmRleClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3ZlLWluc2lkZSBtb3ZlLXt7IHdpZGdldE1hbmlmZXN0LnR5cGUgfX1cIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgd2lkZ2V0TWFuaWZlc3QudGl0bGUgPz8gKCdAcHJ5LnRvb2xib3guJyArIHdpZGdldE1hbmlmZXN0LnR5cGUgfCBpMThuKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIW1vZGVFZGl0aW9uKSB7XG4gICAgICAgICAgPHByeS13aWRnZXQtaW5zdGFuY2lhdG9yXG4gICAgICAgICAgICBbc3RhdGljTWFuaWZlc3RdPVwid2lkZ2V0TWFuaWZlc3RcIlxuICAgICAgICAgICAgW3dpZGdldEluZGV4XT1cIndpZGdldEluZGV4XCJcbiAgICAgICAgICA+PC9wcnktd2lkZ2V0LWluc3RhbmNpYXRvcj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmICghbm9CYWNrZ3JvdW5kKSB7XG4gICAgICBAaWYgKFxuICAgICAgICB7XG4gICAgICAgICAgbm9XaWRnZXRzOiAobm9uRmlsbGVyV2lkZ2V0cyQgfCBhc3luYykgPT09IDAsXG4gICAgICAgICAgZ2xvYmFsTG9hZGluZzogbG9hZGluZyQgfCBhc3luYyxcbiAgICAgICAgICBmZXRjaExvYWRpbmc6IChkYXRhRmV0Y2hpbmckIHwgYXN5bmMpPy5sZW5ndGggPz8gMSA+IDBcbiAgICAgICAgfTtcbiAgICAgICAgYXMgZGF0YVxuICAgICAgKSB7XG4gICAgICAgIEBpZiAoZGF0YS5ub1dpZGdldHMpIHtcbiAgICAgICAgICBAaWYgKGRhdGEuZ2xvYmFsTG9hZGluZykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXdpZGdldFwiIFtzdHlsZS5ncmlkLWFyZWFdPVwiYmFja2dyb3VuZEFyZWEkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgICAgPHByeS1wYWdlLWxvYWRlcj48L3ByeS1wYWdlLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby13aWRnZXRfX3RleHRcIj57eyAnQHByeS53aWRnZXQudGFyZ2V0LmxvYWRpbmcnIHwgaTE4biB9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXdpZGdldFwiIFtzdHlsZS5ncmlkLWFyZWFdPVwiYmFja2dyb3VuZEFyZWEkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIGNsYXNzPVwibm8td2lkZ2V0X19zZWFyY2hcIlxuICAgICAgICAgICAgICAgIHNyYz1cIi4uLy4uLy4uL2Fzc2V0cy9zdmdzL3ByeV9yZWNoZXJjaGUuc3ZnXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJ7e1xuICAgICAgICAgICAgICAgICAgKGxheW91dCA9PT0gRGFzaGJvYXJkR3JpZExheW91dC5NQU5VQUxcbiAgICAgICAgICAgICAgICAgICAgPyAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfbWFudWFsJ1xuICAgICAgICAgICAgICAgICAgICA6ICdAcHJ5LndpZGdldC50YXJnZXQubm9uZV9hdXRvJ1xuICAgICAgICAgICAgICAgICAgKSB8IGkxOG5cbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm8td2lkZ2V0X190ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICAobGF5b3V0ID09PSBEYXNoYm9hcmRHcmlkTGF5b3V0Lk1BTlVBTFxuICAgICAgICAgICAgICAgICAgPyAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfbWFudWFsJ1xuICAgICAgICAgICAgICAgICAgOiAnQHByeS53aWRnZXQudGFyZ2V0Lm5vbmVfYXV0bydcbiAgICAgICAgICAgICAgICApIHwgaTE4blxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhLXBhZ2UtbG9hZGVyIGJhY2tkcm9wXCJcbiAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJkYXRhLmZldGNoTG9hZGluZyAmJiAhZGF0YS5nbG9iYWxMb2FkaW5nID8gJ2ZsZXgnIDogJ25vbmUnXCJcbiAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiKGRhc2hib2FyZFNpemUkIHwgYXN5bmMpPy53aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZGFzaGJvYXJkU2l6ZSQgfCBhc3luYyk/LmhlaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cHJ5LXBhZ2UtbG9hZGVyPjwvcHJ5LXBhZ2UtbG9hZGVyPlxuICAgICAgICAgIDxwPnt7ICdAcHJ5LndpZGdldC50YXJnZXQubG9hZGluZycgfCBpMThuIH19Li4uPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG48cHJ5LWNvbnRleHQtbWVudT48L3ByeS1jb250ZXh0LW1lbnU+XG5cbjxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVNb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm8tbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiby1tb2RhbF9fdG9wX190aXRsZVwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJhLWgyXCIgaWQ9XCJkaWFsb2dfdGl0bGVcIj5cbiAgICAgICAgICB7eyAnQHByeS53aWRnZXQubW9kYWxUaXRsZScgfCBpMThuIH19XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLW1vZGFsX190b3BfX2Nsb3NlXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiPlxuICAgICAgICAgIDxwcnktaWNvbiBpY29uU3ZnPVwiY2xvc2VcIiBbaGVpZ2h0XT1cIjM1XCIgW3dpZHRoXT1cIjM1XCI+PC9wcnktaWNvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInUtdmlzdWFsbHktaGlkZGVuXCI+e3sgJ0BwcnkudG9vbGJveC5jbG9zZScgfCBpMThuIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWJ0bi1ncm91cFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbFJlbW92ZUNvbmZpcm0oKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXNlY29uZGFyeVwiPlxuICAgICAgICB7eyAnQHByeS50b29sYm94Lm1hbmlmZXN0LmNsb3NlJyB8IGkxOG4gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cImNvbmZpcm1SZW1vdmUoKVwiIGNsYXNzPVwiYS1idG4gYS1idG4tLXByaW1hcnlcIj5cbiAgICAgICAge3sgJ0BwcnkudG9vbGJveC5tYW5pZmVzdC52YWxpZGF0ZScgfCBpMThuIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19