@seniorsistemas/angular-components 19.8.0 → 19.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +2 -1
- package/code-editor/lib/code-editor/core/facades/core-facade.d.ts +3 -1
- package/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.d.ts +12 -2
- package/drawer/README.md +119 -0
- package/drawer/index.d.ts +5 -0
- package/{sidebar/lib/sidebar/sidebar.component.d.ts → drawer/lib/drawer/drawer.component.d.ts} +18 -15
- package/drawer/lib/drawer/drawer.module.d.ts +8 -0
- package/drawer/public-api.d.ts +2 -0
- package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +6 -3
- package/esm2022/code-editor/lib/code-editor/core/facades/core-facade.mjs +7 -1
- package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.mjs +47 -22
- package/esm2022/drawer/lib/drawer/drawer.component.mjs +192 -0
- package/esm2022/drawer/lib/drawer/drawer.module.mjs +17 -0
- package/esm2022/drawer/public-api.mjs +3 -0
- package/esm2022/drawer/seniorsistemas-angular-components-drawer.mjs +5 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +4 -5
- package/esm2022/lib/locale/fallback.mjs +3 -2
- package/esm2022/select/lib/select/select.component.mjs +11 -14
- package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-config.mjs +2 -0
- package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-size.mjs +2 -0
- package/esm2022/side-sheet/lib/side-sheet/services/side-sheet.service.mjs +82 -0
- package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +171 -0
- package/esm2022/side-sheet/public-api.mjs +3 -0
- package/esm2022/side-sheet/seniorsistemas-angular-components-side-sheet.mjs +5 -0
- package/esm2022/sidebar/public-api.mjs +12 -3
- package/esm2022/switch/lib/switch/switch.component.mjs +5 -3
- package/esm2022/switch/lib/switch/switch.module.mjs +2 -2
- package/esm2022/tabs/lib/tab-item/tab-item.component.mjs +4 -3
- package/esm2022/tabs/lib/tabs/tabs.component.mjs +14 -10
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +82 -75
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +35 -18
- package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.mjs +2 -1
- package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.directive.mjs +89 -77
- package/esm2022/toast/lib/toast/toast.service.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +5 -2
- package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +52 -21
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +211 -0
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +3 -4
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +10 -13
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +257 -0
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +10 -180
- package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-switch.mjs +5 -3
- package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs +16 -11
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +201 -164
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-toast.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +2 -1
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/package.json +19 -7
- package/select/lib/select/select.component.d.ts +2 -1
- package/side-sheet/README.md +184 -0
- package/side-sheet/index.d.ts +5 -0
- package/side-sheet/lib/side-sheet/models/side-sheet-config.d.ts +20 -0
- package/side-sheet/lib/side-sheet/models/side-sheet-size.d.ts +1 -0
- package/side-sheet/lib/side-sheet/services/side-sheet.service.d.ts +49 -0
- package/side-sheet/lib/side-sheet/side-sheet.component.d.ts +61 -0
- package/side-sheet/public-api.d.ts +4 -0
- package/sidebar/README.md +20 -93
- package/sidebar/public-api.d.ts +11 -2
- package/tabs/lib/tab-item/tab-item.component.d.ts +1 -0
- package/tabs/lib/tabs/tabs.component.d.ts +2 -1
- package/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +19 -7
- package/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +4 -3
- package/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.d.ts +1 -0
- package/tiered-menu/lib/tiered-menu/tiered-menu.directive.d.ts +6 -5
- package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +0 -169
- package/esm2022/sidebar/lib/sidebar/sidebar.module.mjs +0 -17
- package/sidebar/lib/sidebar/sidebar.module.d.ts +0 -8
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { Component, computed, contentChildren, input, model } from '@angular/core';
|
|
2
|
+
import { Component, computed, contentChildren, effect, input, model } from '@angular/core';
|
|
3
3
|
import { toObservable } from '@angular/core/rxjs-interop';
|
|
4
|
-
import {
|
|
4
|
+
import { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';
|
|
5
5
|
import { Subject, takeUntil } from 'rxjs';
|
|
6
6
|
import { TabItemComponent } from '../tab-item/tab-item.component';
|
|
7
|
-
import { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';
|
|
8
7
|
import * as i0 from "@angular/core";
|
|
9
8
|
/**
|
|
10
9
|
* @description Componente de abas (tabs) que organiza o conteúdo em painéis acessíveis por rótulos clicáveis.
|
|
@@ -25,12 +24,10 @@ export class TabsComponent {
|
|
|
25
24
|
onDestroy$ = new Subject();
|
|
26
25
|
tabItems = contentChildren(TabItemComponent);
|
|
27
26
|
activeTabComponent = computed(() => {
|
|
28
|
-
return this.tabItems()
|
|
29
|
-
.find((tab) => tab.value() === this.activeTab() && tab.destroyOnHide())
|
|
30
|
-
?.template();
|
|
27
|
+
return this.tabItems().find((tab) => tab.value() === this.activeTab() && tab.templateContent());
|
|
31
28
|
});
|
|
32
29
|
keepAliveTabsContent = computed(() => {
|
|
33
|
-
return this.tabItems().filter((tab) => !tab.destroyOnHide());
|
|
30
|
+
return this.tabItems().filter((tab) => !tab.templateContent() || (tab.templateContent() && !tab.destroyOnHide()));
|
|
34
31
|
});
|
|
35
32
|
/**
|
|
36
33
|
* @description Valor da aba atualmente ativa. Suporta two-way binding via `[(activeTab)]`.
|
|
@@ -47,6 +44,13 @@ export class TabsComponent {
|
|
|
47
44
|
* @default 'horizontal'
|
|
48
45
|
*/
|
|
49
46
|
layoutType = input('horizontal');
|
|
47
|
+
activeTabEffect = effect(() => {
|
|
48
|
+
const activeTab = this.activeTab();
|
|
49
|
+
const activeTabComponent = this.tabItems().find((tab) => tab.value() === activeTab);
|
|
50
|
+
if (activeTabComponent && !activeTabComponent.alreadyOpened) {
|
|
51
|
+
activeTabComponent.alreadyOpened = true;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
50
54
|
constructor() {
|
|
51
55
|
toObservable(this.tabItems)
|
|
52
56
|
.pipe(takeUntil(this.onDestroy$))
|
|
@@ -74,10 +78,10 @@ export class TabsComponent {
|
|
|
74
78
|
this.activeTab.set(tab.value());
|
|
75
79
|
}
|
|
76
80
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
77
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TabsComponent, isStandalone: true, selector: "s-tabs", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null }, layoutType: { classPropertyName: "layoutType", publicName: "layoutType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeTab: "activeTabChange" }, queries: [{ propertyName: "tabItems", predicate: TabItemComponent, isSignal: true }], ngImport: i0, template: "@let layout = layoutType();\n@let isHorizontal = layout === 'horizontal';\n@let isVertical = layout === 'vertical';\n<ng-template #buttonsRender>\n @for (tab of tabItems(); track $index) {\n @let isActiveTab = tab.value() === activeTab();\n @let disabledTab = tab.disabled();\n <button\n #tabButton\n (sInteractiveContent)=\"onActiveTab(tab)\"\n class=\"flex min-h-11 min-w-24 justify-start
|
|
81
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TabsComponent, isStandalone: true, selector: "s-tabs", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: false, transformFunction: null }, layoutType: { classPropertyName: "layoutType", publicName: "layoutType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeTab: "activeTabChange" }, queries: [{ propertyName: "tabItems", predicate: TabItemComponent, isSignal: true }], ngImport: i0, template: "@let layout = layoutType();\n@let isHorizontal = layout === 'horizontal';\n@let isVertical = layout === 'vertical';\n<ng-template #buttonsRender>\n @for (tab of tabItems(); track $index) {\n @let isActiveTab = tab.value() === activeTab();\n @let disabledTab = tab.disabled();\n <button\n #tabButton\n (sInteractiveContent)=\"onActiveTab(tab)\"\n [disabled]=\"disabledTab\"\n class=\"flex min-h-11 min-w-24 justify-start p-2 hover:transition-all\"\n [class.active-tab]=\"isActiveTab\"\n [ngClass]=\"{\n 'font-bold': isActiveTab,\n 'text-primary': !isActiveTab && !disabledTab,\n 'text-grayscale-30': disabledTab,\n 'border-b-4': isHorizontal,\n 'border-r-4': isVertical,\n 'border-primary': isActiveTab && !disabledTab,\n 'border-transparent': !isActiveTab || disabledTab,\n 'hover:border-primary': !disabledTab && !isActiveTab,\n 'flex items-center gap-2': tab.icon(),\n 'cursor-default': disabledTab,\n }\"\n >\n @let headerElement = tab.headerElement();\n @if (headerElement) {\n <ng-container *ngTemplateOutlet=\"headerElement\"></ng-container>\n } @else {\n @if (tab.icon()) {\n <i\n class=\"text-grayscale-100\"\n [class]=\"tab.icon()\"\n ></i>\n }\n <span\n class=\"block text-left\"\n [ngClass]=\"{\n 'cursor-default': disabledTab,\n }\"\n >\n {{ tab.header() }}\n </span>\n }\n </button>\n }\n</ng-template>\n\n<ng-template #renderComponent>\n @let _activeTab = activeTabComponent();\n @let template = _activeTab?.templateContent()!;\n @if (_activeTab && template && !_activeTab.disabled() && _activeTab.destroyOnHide()) {\n <section class=\"h-full min-h-10 bg-grayscale-0 p-2\">\n <ng-container *ngTemplateOutlet=\"template\" />\n </section>\n }\n @for (keepAliveTab of keepAliveTabsContent(); track $index) {\n @let isActiveTab = keepAliveTab.value() === activeTab();\n\n <section\n class=\"h-full min-h-10 bg-grayscale-0 p-2\"\n [class.hidden]=\"!isActiveTab\"\n [class.block]=\"isActiveTab\"\n >\n @if (keepAliveTab.template() && keepAliveTab.alreadyOpened) {\n <ng-container *ngTemplateOutlet=\"keepAliveTab.template()!\"></ng-container>\n }\n </section>\n }\n</ng-template>\n\n@if (isHorizontal) {\n <section class=\"p-2\">\n <div class=\"flex grid-flow-col overflow-auto border-b-[1px] border-b-grayscale-20\">\n <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n </section>\n} @else if (isVertical) {\n <section class=\"vertical-tab flex w-full flex-wrap gap-2\">\n <aside class=\"flex max-h-96 flex-col overflow-auto\">\n <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n </aside>\n <aside class=\"vertical-tab-content flex-1\">\n <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n </aside>\n </section>\n}\n\n", styles: [".vertical-tab{container:vertical-tab/inline-size}.vertical-tab-content{min-width:20rem}@container vertical-tab (max-width: 552px){.vertical-tab-buttons{width:100%;flex-direction:row}.vertical-tab-buttons .active-tab,.vertical-tab-buttons button:hover{border-right:none;border-bottom-width:4px}}\n"], dependencies: [{ kind: "directive", type: InteractiveContentDirective, selector: "[sInteractiveContent]", inputs: ["focusable", "disabled", "stopPropagation"], outputs: ["sInteractiveContent"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
78
82
|
}
|
|
79
83
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TabsComponent, decorators: [{
|
|
80
84
|
type: Component,
|
|
81
|
-
args: [{ selector: 's-tabs', standalone: true, imports: [InteractiveContentDirective, NgTemplateOutlet, NgClass
|
|
85
|
+
args: [{ selector: 's-tabs', standalone: true, imports: [InteractiveContentDirective, NgTemplateOutlet, NgClass], template: "@let layout = layoutType();\n@let isHorizontal = layout === 'horizontal';\n@let isVertical = layout === 'vertical';\n<ng-template #buttonsRender>\n @for (tab of tabItems(); track $index) {\n @let isActiveTab = tab.value() === activeTab();\n @let disabledTab = tab.disabled();\n <button\n #tabButton\n (sInteractiveContent)=\"onActiveTab(tab)\"\n [disabled]=\"disabledTab\"\n class=\"flex min-h-11 min-w-24 justify-start p-2 hover:transition-all\"\n [class.active-tab]=\"isActiveTab\"\n [ngClass]=\"{\n 'font-bold': isActiveTab,\n 'text-primary': !isActiveTab && !disabledTab,\n 'text-grayscale-30': disabledTab,\n 'border-b-4': isHorizontal,\n 'border-r-4': isVertical,\n 'border-primary': isActiveTab && !disabledTab,\n 'border-transparent': !isActiveTab || disabledTab,\n 'hover:border-primary': !disabledTab && !isActiveTab,\n 'flex items-center gap-2': tab.icon(),\n 'cursor-default': disabledTab,\n }\"\n >\n @let headerElement = tab.headerElement();\n @if (headerElement) {\n <ng-container *ngTemplateOutlet=\"headerElement\"></ng-container>\n } @else {\n @if (tab.icon()) {\n <i\n class=\"text-grayscale-100\"\n [class]=\"tab.icon()\"\n ></i>\n }\n <span\n class=\"block text-left\"\n [ngClass]=\"{\n 'cursor-default': disabledTab,\n }\"\n >\n {{ tab.header() }}\n </span>\n }\n </button>\n }\n</ng-template>\n\n<ng-template #renderComponent>\n @let _activeTab = activeTabComponent();\n @let template = _activeTab?.templateContent()!;\n @if (_activeTab && template && !_activeTab.disabled() && _activeTab.destroyOnHide()) {\n <section class=\"h-full min-h-10 bg-grayscale-0 p-2\">\n <ng-container *ngTemplateOutlet=\"template\" />\n </section>\n }\n @for (keepAliveTab of keepAliveTabsContent(); track $index) {\n @let isActiveTab = keepAliveTab.value() === activeTab();\n\n <section\n class=\"h-full min-h-10 bg-grayscale-0 p-2\"\n [class.hidden]=\"!isActiveTab\"\n [class.block]=\"isActiveTab\"\n >\n @if (keepAliveTab.template() && keepAliveTab.alreadyOpened) {\n <ng-container *ngTemplateOutlet=\"keepAliveTab.template()!\"></ng-container>\n }\n </section>\n }\n</ng-template>\n\n@if (isHorizontal) {\n <section class=\"p-2\">\n <div class=\"flex grid-flow-col overflow-auto border-b-[1px] border-b-grayscale-20\">\n <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n </section>\n} @else if (isVertical) {\n <section class=\"vertical-tab flex w-full flex-wrap gap-2\">\n <aside class=\"flex max-h-96 flex-col overflow-auto\">\n <ng-container *ngTemplateOutlet=\"buttonsRender\"></ng-container>\n </aside>\n <aside class=\"vertical-tab-content flex-1\">\n <ng-container *ngTemplateOutlet=\"renderComponent\"></ng-container>\n </aside>\n </section>\n}\n\n", styles: [".vertical-tab{container:vertical-tab/inline-size}.vertical-tab-content{min-width:20rem}@container vertical-tab (max-width: 552px){.vertical-tab-buttons{width:100%;flex-direction:row}.vertical-tab-buttons .active-tab,.vertical-tab-buttons button:hover{border-right:none;border-bottom-width:4px}}\n"] }]
|
|
82
86
|
}], ctorParameters: () => [] });
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGFicy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGFicy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDOztBQUVyRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQVFILE1BQU0sT0FBTyxhQUFhO0lBQ0wsVUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFDL0IsUUFBUSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTdDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkUsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVnQixvQkFBb0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0gsU0FBUyxHQUFHLEtBQUssQ0FBa0IsQ0FBQyxDQUFDLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0gsVUFBVSxHQUFHLEtBQUssQ0FBNEIsWUFBWSxDQUFDLENBQUM7SUFFNUQ7UUFDSSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNoQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDZixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVTLFdBQVcsQ0FBQyxHQUFxQjtRQUN2QyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQ2xGLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBcUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7d0dBMURRLGFBQWE7NEZBQWIsYUFBYSw2WkFFd0IsZ0JBQWdCLDZDQ2hDbEUsdzlHQXNGQSxvWUQ1RGMsMkJBQTJCLDBKQUFFLGdCQUFnQixvSkFBRSxPQUFPLG9GQUFFLGdCQUFnQjs7NEZBSXpFLGFBQWE7a0JBUHpCLFNBQVM7K0JBQ0ksUUFBUSxjQUNOLElBQUksV0FDUCxDQUFDLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgY29udGVudENoaWxkcmVuLCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdG9vbHRpcCc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhYkl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi90YWItaXRlbS90YWItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW50ZXJhY3RpdmVDb250ZW50RGlyZWN0aXZlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9pbnRlcmFjdGl2ZS1jb250ZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhYmFzICh0YWJzKSBxdWUgb3JnYW5pemEgbyBjb250ZcO6ZG8gZW0gcGFpbsOpaXMgYWNlc3PDrXZlaXMgcG9yIHLDs3R1bG9zIGNsaWPDoXZlaXMuXG4gKiBTdXBvcnRhIGxheW91dCBob3Jpem9udGFsIGUgdmVydGljYWwsIHR3by13YXkgYmluZGluZyBkYSBhYmEgYXRpdmEgZSByZW5kZXJpemHDp8OjbyBjb25kaWNpb25hbFxuICogZG8gY29udGXDumRvIGRlIGNhZGEgYWJhIHZpYSBgVGFiSXRlbUNvbXBvbmVudGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXRhYnMgWyhhY3RpdmVUYWIpXT1cImFjdGl2ZVRhYlwiIGxheW91dFR5cGU9XCJob3Jpem9udGFsXCI+XG4gKiAgIDxzLXRhYi1pdGVtIGhlYWRlcj1cIkFiYSAxXCIgdmFsdWU9XCJ0YWIxXCI+Q29udGXDumRvIDE8L3MtdGFiLWl0ZW0+XG4gKiAgIDxzLXRhYi1pdGVtIGhlYWRlcj1cIkFiYSAyXCIgdmFsdWU9XCJ0YWIyXCI+Q29udGXDumRvIDI8L3MtdGFiLWl0ZW0+XG4gKiA8L3MtdGFicz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBOYXZlZ2HDp8Ojb1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3MtdGFicycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSW50ZXJhY3RpdmVDb250ZW50RGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzLCBUb29sdGlwRGlyZWN0aXZlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0YWJJdGVtcyA9IGNvbnRlbnRDaGlsZHJlbihUYWJJdGVtQ29tcG9uZW50KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVUYWJDb21wb25lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYkl0ZW1zKClcbiAgICAgICAgICAgIC5maW5kKCh0YWIpID0+IHRhYi52YWx1ZSgpID09PSB0aGlzLmFjdGl2ZVRhYigpICYmIHRhYi5kZXN0cm95T25IaWRlKCkpXG4gICAgICAgICAgICA/LnRlbXBsYXRlKCk7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkga2VlcEFsaXZlVGFic0NvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYkl0ZW1zKCkuZmlsdGVyKCh0YWIpID0+ICF0YWIuZGVzdHJveU9uSGlkZSgpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBWYWxvciBkYSBhYmEgYXR1YWxtZW50ZSBhdGl2YS4gU3Vwb3J0YSB0d28td2F5IGJpbmRpbmcgdmlhIGBbKGFjdGl2ZVRhYildYC5cbiAgICAgKiBQb3IgcGFkcsOjbywgYXRpdmEgYSBwcmltZWlyYSBhYmEgKMOtbmRpY2UgYDBgKS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBhY3RpdmVUYWIgPSBtb2RlbDxzdHJpbmcgfCBudW1iZXI+KDApO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE9yaWVudGHDp8OjbyB2aXN1YWwgZGFzIGFiYXMuXG4gICAgICogLSBgJ2hvcml6b250YWwnYDogYWJhcyBleGliaWRhcyBlbSBsaW5oYSwgYWNpbWEgZG8gY29udGXDumRvIChwYWRyw6NvKS5cbiAgICAgKiAtIGAndmVydGljYWwnYDogYWJhcyBleGliaWRhcyBlbSBjb2x1bmEsIMOgIGVzcXVlcmRhIGRvIGNvbnRlw7pkby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0ICdob3Jpem9udGFsJ1xuICAgICAqL1xuICAgIGxheW91dFR5cGUgPSBpbnB1dDwnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnPignaG9yaXpvbnRhbCcpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnRhYkl0ZW1zKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJzID0gdGhpcy50YWJJdGVtcygpO1xuICAgICAgICAgICAgICAgIHRhYnMuZm9yRWFjaCgodGFiLCAkaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFiSGFzVmFsdWUgPSAhIXRhYi52YWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYkhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWIudmFsdWUuc2V0KCRpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkFjdGl2ZVRhYih0YWI6IFRhYkl0ZW1Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKHRhYi5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgX3ByZXZpb3VzVGFiID0gdGhpcy50YWJJdGVtcygpLmZpbmQoKHRhYikgPT4gdGFiLnZhbHVlKCkgPT09IHRoaXMuYWN0aXZlVGFiKCkpO1xuICAgICAgICBpZiAoX3ByZXZpb3VzVGFiICYmICFfcHJldmlvdXNUYWIudGVtcGxhdGVDb250ZW50KCkgJiYgX3ByZXZpb3VzVGFiLmRlc3Ryb3lPbkhpZGUoKSkge1xuICAgICAgICAgICAgX3ByZXZpb3VzVGFiLnRlbXBsYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hY3RpdmVUYWIuc2V0KHRhYi52YWx1ZSgpIGFzIHN0cmluZyB8IG51bWJlcik7XG4gICAgfVxufVxuXG4iLCJAbGV0IGxheW91dCA9IGxheW91dFR5cGUoKTtcbkBsZXQgaXNIb3Jpem9udGFsID0gbGF5b3V0ID09PSAnaG9yaXpvbnRhbCc7XG5AbGV0IGlzVmVydGljYWwgPSBsYXlvdXQgPT09ICd2ZXJ0aWNhbCc7XG48bmctdGVtcGxhdGUgI2J1dHRvbnNSZW5kZXI+XG4gICAgQGZvciAodGFiIG9mIHRhYkl0ZW1zKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICBAbGV0IGlzQWN0aXZlVGFiID0gdGFiLnZhbHVlKCkgPT09IGFjdGl2ZVRhYigpO1xuICAgICAgICBAbGV0IGRpc2FibGVkVGFiID0gdGFiLmRpc2FibGVkKCk7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICN0YWJCdXR0b25cbiAgICAgICAgICAgIChzSW50ZXJhY3RpdmVDb250ZW50KT1cIm9uQWN0aXZlVGFiKHRhYilcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IG1pbi1oLTExIG1pbi13LTI0IGp1c3RpZnktc3RhcnQgb3ZlcmZsb3ctaGlkZGVuIHRleHQtZWxsaXBzaXMgd2hpdGVzcGFjZS1ub3dyYXAgYm9yZGVyLXByaW1hcnkgcC0yIGhvdmVyOnRyYW5zaXRpb24tYWxsIGRpc2FibGVkOmJvcmRlci1ncmF5c2NhbGUtMzAgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZS10YWJdPVwiaXNBY3RpdmVUYWJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkVGFiXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnZm9udC1ib2xkJzogaXNBY3RpdmVUYWIsXG4gICAgICAgICAgICAgICAgJ3RleHQtcHJpbWFyeSc6ICFpc0FjdGl2ZVRhYixcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWItNCc6IGlzQWN0aXZlVGFiICYmIGlzSG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXItNCc6IGlzQWN0aXZlVGFiICYmIGlzVmVydGljYWwsXG4gICAgICAgICAgICAgICAgJ2hvdmVyOmJvcmRlci1iLTQnOiBpc0hvcml6b250YWwgJiYgIWRpc2FibGVkVGFiLFxuICAgICAgICAgICAgICAgICdob3Zlcjpib3JkZXItci00JzogaXNWZXJ0aWNhbCAmJiAhZGlzYWJsZWRUYWIsXG4gICAgICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yJzogdGFiLmljb24oKSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICBAbGV0IGhlYWRlckVsZW1lbnQgPSB0YWIuaGVhZGVyRWxlbWVudCgpO1xuICAgICAgICAgICAgQGlmIChoZWFkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImhlYWRlckVsZW1lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIEBpZiAodGFiLmljb24oKSkge1xuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWdyYXlzY2FsZS0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInRhYi5pY29uKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJsb2NrIG92ZXJmbG93LWhpZGRlbiB0ZXh0LWVsbGlwc2lzIHdoaXRlc3BhY2Utbm93cmFwIHRleHQtbGVmdFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYXgtdy0yOF09XCJpc0hvcml6b250YWxcIlxuICAgICAgICAgICAgICAgICAgICBbc1Rvb2x0aXBdPVwidGFiLmhlYWRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgW3Zpc2libGVdPVwiIWRpc2FibGVkVGFiXCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrVHJ1bmNhdGVkVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRhYi5oZWFkZXIoKSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyZW5kZXJDb21wb25lbnQ+XG4gICAgQGxldCB0ZW1wbGF0ZSA9IGFjdGl2ZVRhYkNvbXBvbmVudCgpO1xuICAgIEBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJoLWZ1bGwgbWluLWgtMTAgYmctZ3JheXNjYWxlLTAgcC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIiAvPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgfVxuICAgIEBmb3IgKGtlZXBBbGl2ZVRhYiBvZiBrZWVwQWxpdmVUYWJzQ29udGVudCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgQGxldCBpc0FjdGl2ZVRhYiA9IGtlZXBBbGl2ZVRhYi52YWx1ZSgpID09PSBhY3RpdmVUYWIoKTtcblxuICAgICAgICA8c2VjdGlvblxuICAgICAgICAgICAgY2xhc3M9XCJoLWZ1bGwgbWluLWgtMTAgYmctZ3JheXNjYWxlLTAgcC0yXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWlzQWN0aXZlVGFiXCJcbiAgICAgICAgICAgIFtjbGFzcy5ibG9ja109XCJpc0FjdGl2ZVRhYlwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoa2VlcEFsaXZlVGFiLnRlbXBsYXRlKCkpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwia2VlcEFsaXZlVGFiLnRlbXBsYXRlKCkhXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG5AaWYgKGlzSG9yaXpvbnRhbCkge1xuICAgIDxzZWN0aW9uIGNsYXNzPVwicC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdyaWQtZmxvdy1jb2wgb3ZlcmZsb3ctYXV0byBib3JkZXItYi1bMXB4XSBib3JkZXItYi1ncmF5c2NhbGUtMjBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zUmVuZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVuZGVyQ29tcG9uZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9zZWN0aW9uPlxufSBAZWxzZSBpZiAoaXNWZXJ0aWNhbCkge1xuICAgIDxzZWN0aW9uIGNsYXNzPVwidmVydGljYWwtdGFiIGZsZXggdy1mdWxsIGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICA8YXNpZGUgY2xhc3M9XCJ2ZXJ0aWNhbC10YWItYnV0dG9ucyBmbGV4IG1heC1oLTk2IGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJidXR0b25zUmVuZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYXNpZGU+XG4gICAgICAgIDxhc2lkZSBjbGFzcz1cInZlcnRpY2FsLXRhYi1jb250ZW50IGZsZXgtMVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbmRlckNvbXBvbmVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2FzaWRlPlxuICAgIDwvc2VjdGlvbj5cbn1cbiJdfQ==
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGFicy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGFicy9zcmMvbGliL3RhYnMvdGFicy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNyRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFbEU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFRSCxNQUFNLE9BQU8sYUFBYTtJQUNMLFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBQy9CLFFBQVEsR0FBRyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3QyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ2xELE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNw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Q2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgY29udGVudENoaWxkcmVuLCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJbnRlcmFjdGl2ZUNvbnRlbnREaXJlY3RpdmUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2ludGVyYWN0aXZlLWNvbnRlbnQnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUYWJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFiLWl0ZW0vdGFiLWl0ZW0uY29tcG9uZW50JztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBhYmFzICh0YWJzKSBxdWUgb3JnYW5pemEgbyBjb250ZcO6ZG8gZW0gcGFpbsOpaXMgYWNlc3PDrXZlaXMgcG9yIHLDs3R1bG9zIGNsaWPDoXZlaXMuXG4gKiBTdXBvcnRhIGxheW91dCBob3Jpem9udGFsIGUgdmVydGljYWwsIHR3by13YXkgYmluZGluZyBkYSBhYmEgYXRpdmEgZSByZW5kZXJpemHDp8OjbyBjb25kaWNpb25hbFxuICogZG8gY29udGXDumRvIGRlIGNhZGEgYWJhIHZpYSBgVGFiSXRlbUNvbXBvbmVudGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXRhYnMgWyhhY3RpdmVUYWIpXT1cImFjdGl2ZVRhYlwiIGxheW91dFR5cGU9XCJob3Jpem9udGFsXCI+XG4gKiAgIDxzLXRhYi1pdGVtIGhlYWRlcj1cIkFiYSAxXCIgdmFsdWU9XCJ0YWIxXCI+Q29udGXDumRvIDE8L3MtdGFiLWl0ZW0+XG4gKiAgIDxzLXRhYi1pdGVtIGhlYWRlcj1cIkFiYSAyXCIgdmFsdWU9XCJ0YWIyXCI+Q29udGXDumRvIDI8L3MtdGFiLWl0ZW0+XG4gKiA8L3MtdGFicz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBOYXZlZ2HDp8Ojb1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3MtdGFicycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbSW50ZXJhY3RpdmVDb250ZW50RGlyZWN0aXZlLCBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NsYXNzXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFicy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0YWJJdGVtcyA9IGNvbnRlbnRDaGlsZHJlbihUYWJJdGVtQ29tcG9uZW50KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmVUYWJDb21wb25lbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYkl0ZW1zKCkuZmluZCgodGFiKSA9PiB0YWIudmFsdWUoKSA9PT0gdGhpcy5hY3RpdmVUYWIoKSAmJiB0YWIudGVtcGxhdGVDb250ZW50KCkpO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGtlZXBBbGl2ZVRhYnNDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJJdGVtcygpLmZpbHRlcihcbiAgICAgICAgICAgICh0YWIpID0+ICF0YWIudGVtcGxhdGVDb250ZW50KCkgfHwgKHRhYi50ZW1wbGF0ZUNvbnRlbnQoKSAmJiAhdGFiLmRlc3Ryb3lPbkhpZGUoKSksXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gVmFsb3IgZGEgYWJhIGF0dWFsbWVudGUgYXRpdmEuIFN1cG9ydGEgdHdvLXdheSBiaW5kaW5nIHZpYSBgWyhhY3RpdmVUYWIpXWAuXG4gICAgICogUG9yIHBhZHLDo28sIGF0aXZhIGEgcHJpbWVpcmEgYWJhICjDrW5kaWNlIGAwYCkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICovXG4gICAgYWN0aXZlVGFiID0gbW9kZWw8c3RyaW5nIHwgbnVtYmVyPigwKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBPcmllbnRhw6fDo28gdmlzdWFsIGRhcyBhYmFzLlxuICAgICAqIC0gYCdob3Jpem9udGFsJ2A6IGFiYXMgZXhpYmlkYXMgZW0gbGluaGEsIGFjaW1hIGRvIGNvbnRlw7pkbyAocGFkcsOjbykuXG4gICAgICogLSBgJ3ZlcnRpY2FsJ2A6IGFiYXMgZXhpYmlkYXMgZW0gY29sdW5hLCDDoCBlc3F1ZXJkYSBkbyBjb250ZcO6ZG8uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAnaG9yaXpvbnRhbCdcbiAgICAgKi9cbiAgICBsYXlvdXRUeXBlID0gaW5wdXQ8J2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJz4oJ2hvcml6b250YWwnKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlVGFiRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5hY3RpdmVUYWIoKTtcbiAgICAgICAgY29uc3QgYWN0aXZlVGFiQ29tcG9uZW50ID0gdGhpcy50YWJJdGVtcygpLmZpbmQoKHRhYikgPT4gdGFiLnZhbHVlKCkgPT09IGFjdGl2ZVRhYik7XG4gICAgICAgIGlmIChhY3RpdmVUYWJDb21wb25lbnQgJiYgIWFjdGl2ZVRhYkNvbXBvbmVudC5hbHJlYWR5T3BlbmVkKSB7XG4gICAgICAgICAgICBhY3RpdmVUYWJDb21wb25lbnQuYWxyZWFkeU9wZW5lZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0b09ic2VydmFibGUodGhpcy50YWJJdGVtcylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IHRoaXMudGFiSXRlbXMoKTtcbiAgICAgICAgICAgICAgICB0YWJzLmZvckVhY2goKHRhYiwgJGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYkhhc1ZhbHVlID0gISF0YWIudmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJIYXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFiLnZhbHVlLnNldCgkaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25BY3RpdmVUYWIodGFiOiBUYWJJdGVtQ29tcG9uZW50KSB7XG4gICAgICAgIGlmICh0YWIuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IF9wcmV2aW91c1RhYiA9IHRoaXMudGFiSXRlbXMoKS5maW5kKCh0YWIpID0+IHRhYi52YWx1ZSgpID09PSB0aGlzLmFjdGl2ZVRhYigpKTtcbiAgICAgICAgaWYgKF9wcmV2aW91c1RhYiAmJiAhX3ByZXZpb3VzVGFiLnRlbXBsYXRlQ29udGVudCgpICYmIF9wcmV2aW91c1RhYi5kZXN0cm95T25IaWRlKCkpIHtcbiAgICAgICAgICAgIF9wcmV2aW91c1RhYi50ZW1wbGF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlVGFiLnNldCh0YWIudmFsdWUoKSBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH1cbn1cblxuIiwiQGxldCBsYXlvdXQgPSBsYXlvdXRUeXBlKCk7XG5AbGV0IGlzSG9yaXpvbnRhbCA9IGxheW91dCA9PT0gJ2hvcml6b250YWwnO1xuQGxldCBpc1ZlcnRpY2FsID0gbGF5b3V0ID09PSAndmVydGljYWwnO1xuPG5nLXRlbXBsYXRlICNidXR0b25zUmVuZGVyPlxuICAgIEBmb3IgKHRhYiBvZiB0YWJJdGVtcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgQGxldCBpc0FjdGl2ZVRhYiA9IHRhYi52YWx1ZSgpID09PSBhY3RpdmVUYWIoKTtcbiAgICAgICAgQGxldCBkaXNhYmxlZFRhYiA9IHRhYi5kaXNhYmxlZCgpO1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAjdGFiQnV0dG9uXG4gICAgICAgICAgICAoc0ludGVyYWN0aXZlQ29udGVudCk9XCJvbkFjdGl2ZVRhYih0YWIpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFRhYlwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggbWluLWgtMTEgbWluLXctMjQganVzdGlmeS1zdGFydCBwLTIgaG92ZXI6dHJhbnNpdGlvbi1hbGxcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZS10YWJdPVwiaXNBY3RpdmVUYWJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdmb250LWJvbGQnOiBpc0FjdGl2ZVRhYixcbiAgICAgICAgICAgICAgICAndGV4dC1wcmltYXJ5JzogIWlzQWN0aXZlVGFiICYmICFkaXNhYmxlZFRhYixcbiAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZFRhYixcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWItNCc6IGlzSG9yaXpvbnRhbCxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLXItNCc6IGlzVmVydGljYWwsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1wcmltYXJ5JzogaXNBY3RpdmVUYWIgJiYgIWRpc2FibGVkVGFiLFxuICAgICAgICAgICAgICAgICdib3JkZXItdHJhbnNwYXJlbnQnOiAhaXNBY3RpdmVUYWIgfHwgZGlzYWJsZWRUYWIsXG4gICAgICAgICAgICAgICAgJ2hvdmVyOmJvcmRlci1wcmltYXJ5JzogIWRpc2FibGVkVGFiICYmICFpc0FjdGl2ZVRhYixcbiAgICAgICAgICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTInOiB0YWIuaWNvbigpLFxuICAgICAgICAgICAgICAgICdjdXJzb3ItZGVmYXVsdCc6IGRpc2FibGVkVGFiLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIEBsZXQgaGVhZGVyRWxlbWVudCA9IHRhYi5oZWFkZXJFbGVtZW50KCk7XG4gICAgICAgICAgICBAaWYgKGhlYWRlckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyRWxlbWVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGlmICh0YWIuaWNvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZ3JheXNjYWxlLTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwidGFiLmljb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdGV4dC1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnNvci1kZWZhdWx0JzogZGlzYWJsZWRUYWIsXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFiLmhlYWRlcigpIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlbmRlckNvbXBvbmVudD5cbiAgICBAbGV0IF9hY3RpdmVUYWIgPSBhY3RpdmVUYWJDb21wb25lbnQoKTtcbiAgICBAbGV0IHRlbXBsYXRlID0gX2FjdGl2ZVRhYj8udGVtcGxhdGVDb250ZW50KCkhO1xuICAgIEBpZiAoX2FjdGl2ZVRhYiAmJiB0ZW1wbGF0ZSAmJiAhX2FjdGl2ZVRhYi5kaXNhYmxlZCgpICYmIF9hY3RpdmVUYWIuZGVzdHJveU9uSGlkZSgpKSB7XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaC1mdWxsIG1pbi1oLTEwIGJnLWdyYXlzY2FsZS0wIHAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlXCIgLz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgIH1cbiAgICBAZm9yIChrZWVwQWxpdmVUYWIgb2Yga2VlcEFsaXZlVGFic0NvbnRlbnQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIEBsZXQgaXNBY3RpdmVUYWIgPSBrZWVwQWxpdmVUYWIudmFsdWUoKSA9PT0gYWN0aXZlVGFiKCk7XG5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIG1pbi1oLTEwIGJnLWdyYXlzY2FsZS0wIHAtMlwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFpc0FjdGl2ZVRhYlwiXG4gICAgICAgICAgICBbY2xhc3MuYmxvY2tdPVwiaXNBY3RpdmVUYWJcIlxuICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKGtlZXBBbGl2ZVRhYi50ZW1wbGF0ZSgpICYmIGtlZXBBbGl2ZVRhYi5hbHJlYWR5T3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImtlZXBBbGl2ZVRhYi50ZW1wbGF0ZSgpIVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuQGlmIChpc0hvcml6b250YWwpIHtcbiAgICA8c2VjdGlvbiBjbGFzcz1cInAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBncmlkLWZsb3ctY29sIG92ZXJmbG93LWF1dG8gYm9yZGVyLWItWzFweF0gYm9yZGVyLWItZ3JheXNjYWxlLTIwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlbmRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbmRlckNvbXBvbmVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvc2VjdGlvbj5cbn0gQGVsc2UgaWYgKGlzVmVydGljYWwpIHtcbiAgICA8c2VjdGlvbiBjbGFzcz1cInZlcnRpY2FsLXRhYiBmbGV4IHctZnVsbCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgPGFzaWRlIGNsYXNzPVwiZmxleCBtYXgtaC05NiBmbGV4LWNvbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnV0dG9uc1JlbmRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2FzaWRlPlxuICAgICAgICA8YXNpZGUgY2xhc3M9XCJ2ZXJ0aWNhbC10YWItY29udGVudCBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW5kZXJDb21wb25lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hc2lkZT5cbiAgICA8L3NlY3Rpb24+XG59XG5cbiJdfQ==
|
package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs
CHANGED
|
@@ -1,33 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Injector, Input, Output, inject, } from '@angular/core';
|
|
2
|
+
import { Overlay } from '@angular/cdk/overlay';
|
|
3
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
4
|
+
import { FocusTrapFactory } from '@angular/cdk/a11y';
|
|
2
5
|
import { Subject } from 'rxjs';
|
|
3
6
|
import { takeUntil } from 'rxjs/operators';
|
|
4
7
|
import { TieredMenuEventService } from '../../services/tiered-menu.event.service';
|
|
5
8
|
import { TieredMenuService } from '../../services/tiered-menu.service';
|
|
6
|
-
import { disableScroll, enableScroll } from '@seniorsistemas/angular-components/utils';
|
|
7
|
-
import { NgStyle } from '@angular/common';
|
|
8
9
|
import { TieredMenuItemComponent } from '../tiered-menu-item/tiered-menu-item.component';
|
|
9
10
|
import { TieredMenuDividerComponent } from '../tiered-menu-divider/tiered-menu-divider.component';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
export class TieredMenuComponent {
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
_overlay = inject(Overlay);
|
|
14
|
+
_elementRef = inject(ElementRef);
|
|
14
15
|
_injector = inject(Injector);
|
|
16
|
+
_focusTrapFactory = inject(FocusTrapFactory);
|
|
15
17
|
_changeDetectorRef = inject(ChangeDetectorRef);
|
|
16
18
|
tieredMenuService = inject(TieredMenuService);
|
|
17
19
|
_tieredMenuEventService = inject(TieredMenuEventService);
|
|
18
20
|
ariaLabel;
|
|
19
21
|
items = [];
|
|
20
|
-
top = 0;
|
|
21
|
-
left = 0;
|
|
22
22
|
menuTriggerEvent = 'hover';
|
|
23
23
|
isSubmenu = false;
|
|
24
|
+
_overlayRef = null;
|
|
24
25
|
_componentRef = null;
|
|
25
|
-
|
|
26
|
+
_focusTrap = null;
|
|
26
27
|
_unsubscribe$ = new Subject();
|
|
27
28
|
destroyRequest = new EventEmitter();
|
|
28
|
-
onResize() {
|
|
29
|
-
this._tieredMenuEventService.closeAllMenusEvent.emit();
|
|
30
|
-
}
|
|
31
29
|
onDocumentClick(event) {
|
|
32
30
|
// Closing menu when clicked outside.
|
|
33
31
|
const target = event.target;
|
|
@@ -39,12 +37,10 @@ export class TieredMenuComponent {
|
|
|
39
37
|
onKeydownHandler(event) {
|
|
40
38
|
switch (event.key) {
|
|
41
39
|
case 'Escape':
|
|
40
|
+
this._tieredMenuEventService.restoreFocusEvent.emit();
|
|
42
41
|
this._tieredMenuEventService.closeAllMenusEvent.emit();
|
|
43
42
|
event.preventDefault();
|
|
44
43
|
break;
|
|
45
|
-
case 'Tab':
|
|
46
|
-
this._tieredMenuEventService.closeAllMenusEvent.emit();
|
|
47
|
-
break;
|
|
48
44
|
case ' ':
|
|
49
45
|
case 'Enter':
|
|
50
46
|
if (this.tieredMenuService.currentItem &&
|
|
@@ -64,6 +60,17 @@ export class TieredMenuComponent {
|
|
|
64
60
|
event.preventDefault();
|
|
65
61
|
event.stopImmediatePropagation();
|
|
66
62
|
break;
|
|
63
|
+
case 'Tab':
|
|
64
|
+
// Move focus between items instead of letting Tab escape the (trapped) menu.
|
|
65
|
+
if (event.shiftKey) {
|
|
66
|
+
this._tieredMenuEventService.decrementCurrentItemEvent.emit();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this._tieredMenuEventService.incrementCurrentItemEvent.emit();
|
|
70
|
+
}
|
|
71
|
+
event.preventDefault();
|
|
72
|
+
event.stopImmediatePropagation();
|
|
73
|
+
break;
|
|
67
74
|
case 'ArrowLeft':
|
|
68
75
|
if (this.tieredMenuService.currentItem && this.items.includes(this.tieredMenuService.currentItem)) {
|
|
69
76
|
this._tieredMenuEventService.closeItemMenuEvent.emit(this.tieredMenuService.currentItem);
|
|
@@ -84,11 +91,11 @@ export class TieredMenuComponent {
|
|
|
84
91
|
}
|
|
85
92
|
ngOnInit() {
|
|
86
93
|
this._subscribeEvents();
|
|
94
|
+
this._focusTrap = this._focusTrapFactory.create(this._elementRef.nativeElement);
|
|
87
95
|
// Submenus have their focus managed by the openItemMenuEvent handler.
|
|
88
96
|
if (!this.isSubmenu) {
|
|
89
97
|
this.tieredMenuService.currentItems = this.items;
|
|
90
98
|
this.tieredMenuService.currentItem = this.items[0] ?? null;
|
|
91
|
-
disableScroll();
|
|
92
99
|
requestAnimationFrame(() => {
|
|
93
100
|
this._focusCurrentItem();
|
|
94
101
|
});
|
|
@@ -97,6 +104,7 @@ export class TieredMenuComponent {
|
|
|
97
104
|
ngOnDestroy() {
|
|
98
105
|
this._unsubscribe$.next();
|
|
99
106
|
this._unsubscribe$.complete();
|
|
107
|
+
this._focusTrap?.destroy();
|
|
100
108
|
}
|
|
101
109
|
_focusCurrentItem() {
|
|
102
110
|
const id = this.tieredMenuService.currentItem?.id;
|
|
@@ -146,66 +154,74 @@ export class TieredMenuComponent {
|
|
|
146
154
|
this._decrementCurItem();
|
|
147
155
|
}
|
|
148
156
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
157
|
+
static SUBMENU_POSITIONS = [
|
|
158
|
+
{ originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top' },
|
|
159
|
+
{ originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' },
|
|
160
|
+
{ originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom' },
|
|
161
|
+
{ originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'bottom' },
|
|
162
|
+
];
|
|
163
|
+
_createMenu(items, itemEl) {
|
|
164
|
+
if (!this._overlayRef && items) {
|
|
165
|
+
const positionStrategy = this._overlay
|
|
166
|
+
.position()
|
|
167
|
+
.flexibleConnectedTo(itemEl)
|
|
168
|
+
.withPositions(TieredMenuComponent.SUBMENU_POSITIONS)
|
|
169
|
+
.withFlexibleDimensions(false)
|
|
170
|
+
.withPush(false);
|
|
171
|
+
this._overlayRef = this._overlay.create({
|
|
172
|
+
positionStrategy,
|
|
173
|
+
scrollStrategy: this._overlay.scrollStrategies.reposition(),
|
|
174
|
+
});
|
|
175
|
+
const componentRef = this._overlayRef.attach(new ComponentPortal(TieredMenuComponent, null, this._injector));
|
|
176
|
+
this._componentRef = componentRef;
|
|
156
177
|
// Setting the menu items.
|
|
157
|
-
|
|
158
|
-
|
|
178
|
+
componentRef.instance.items = items;
|
|
179
|
+
componentRef.instance.isSubmenu = true;
|
|
180
|
+
// Render synchronously so item elements are queryable right away (needed by restoreOpenChain()).
|
|
181
|
+
componentRef.changeDetectorRef.detectChanges();
|
|
159
182
|
// Subscribe menu events.
|
|
160
|
-
|
|
183
|
+
componentRef.instance.destroyRequest.subscribe((propagate) => {
|
|
161
184
|
this._destroy(propagate);
|
|
162
185
|
});
|
|
163
|
-
this._menuDivElement = domElem.querySelector('.menu');
|
|
164
|
-
this._setMenuPosition(position);
|
|
165
186
|
}
|
|
166
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Recreates the flyout chain for whichever item is currently marked `isOpen` in `items`,
|
|
190
|
+
* recursively — used when switching from the nested/mobile menu back to desktop, where the
|
|
191
|
+
* open state lives on the shared item data but each tier is a separate overlay that must be
|
|
192
|
+
* explicitly recreated to match it.
|
|
193
|
+
*/
|
|
194
|
+
restoreOpenChain() {
|
|
195
|
+
const openItem = this.items.find((item) => item.isOpen && item.submenu);
|
|
196
|
+
if (!openItem)
|
|
197
|
+
return;
|
|
198
|
+
const itemEl = document.querySelector(`#${openItem.id}`);
|
|
199
|
+
if (!itemEl)
|
|
200
|
+
return;
|
|
201
|
+
this._createMenu(openItem.submenu, itemEl);
|
|
202
|
+
this._componentRef?.instance.restoreOpenChain();
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Disposes this tier's own submenu overlay chain (if any) without touching `isOpen` state —
|
|
206
|
+
* used when switching from desktop to nested, where the open state must survive but the
|
|
207
|
+
* flyout overlays themselves need to go away.
|
|
208
|
+
*/
|
|
209
|
+
disposeChain() {
|
|
210
|
+
this._componentRef?.instance.disposeChain();
|
|
211
|
+
this._overlayRef?.dispose();
|
|
212
|
+
this._overlayRef = null;
|
|
213
|
+
this._componentRef = null;
|
|
214
|
+
}
|
|
167
215
|
_destroy(propagate = true) {
|
|
168
|
-
if (this.
|
|
169
|
-
this.
|
|
170
|
-
this.
|
|
216
|
+
if (this._overlayRef !== null) {
|
|
217
|
+
this._overlayRef.dispose();
|
|
218
|
+
this._overlayRef = null;
|
|
171
219
|
this._componentRef = null;
|
|
172
|
-
this._menuDivElement = null;
|
|
173
220
|
}
|
|
174
221
|
if (propagate) {
|
|
175
222
|
this.destroyRequest.emit();
|
|
176
223
|
}
|
|
177
224
|
}
|
|
178
|
-
_setMenuPosition(position) {
|
|
179
|
-
const ITEM_HEIGHT = 37;
|
|
180
|
-
const DIVIDER_HEIGHT = 5;
|
|
181
|
-
const PADDING = 8;
|
|
182
|
-
if (this._componentRef !== null) {
|
|
183
|
-
const { top, right, bottom, left } = position;
|
|
184
|
-
const itemsCount = this._componentRef.instance.items?.reduce((count, item) => {
|
|
185
|
-
return !item.divider ? count + 1 : count;
|
|
186
|
-
}, 0);
|
|
187
|
-
const dividersCount = this._componentRef.instance.items?.reduce((count, item) => {
|
|
188
|
-
return item.divider ? count + 1 : count;
|
|
189
|
-
}, 0);
|
|
190
|
-
// I need to calculate the height of the component because the internal elements have not been created yet.
|
|
191
|
-
const menuHeight = itemsCount * ITEM_HEIGHT + dividersCount * DIVIDER_HEIGHT + PADDING + 8;
|
|
192
|
-
const menuWidth = this._menuDivElement?.getBoundingClientRect().width ?? 0;
|
|
193
|
-
const rightFreeSpace = window.innerWidth - right;
|
|
194
|
-
const bottomFreeSpace = window.innerHeight - bottom;
|
|
195
|
-
if (rightFreeSpace > menuWidth) {
|
|
196
|
-
this._componentRef.instance.left = right;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
this._componentRef.instance.left = left - menuWidth;
|
|
200
|
-
}
|
|
201
|
-
if (bottomFreeSpace <= menuHeight) {
|
|
202
|
-
this._componentRef.instance.top = Math.max(window.innerHeight - menuHeight, window.scrollY);
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
this._componentRef.instance.top = window.scrollY + top;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
225
|
_subscribeEvents() {
|
|
210
226
|
// Increment current item event.
|
|
211
227
|
this._tieredMenuEventService.incrementCurrentItemEvent.pipe(takeUntil(this._unsubscribe$)).subscribe(() => {
|
|
@@ -237,7 +253,6 @@ export class TieredMenuComponent {
|
|
|
237
253
|
this.tieredMenuService.currentItem = null;
|
|
238
254
|
this.tieredMenuService.currentItems = this.tieredMenuService.items;
|
|
239
255
|
this.tieredMenuService.markAllItemsAsClosed(this.tieredMenuService.items);
|
|
240
|
-
enableScroll();
|
|
241
256
|
});
|
|
242
257
|
// Open item menu event.
|
|
243
258
|
this._tieredMenuEventService.openItemMenuEvent
|
|
@@ -268,9 +283,7 @@ export class TieredMenuComponent {
|
|
|
268
283
|
const itemEl = document.querySelector(`#${item.id}`);
|
|
269
284
|
if (!itemEl)
|
|
270
285
|
return;
|
|
271
|
-
|
|
272
|
-
const position = { top, right, left, bottom };
|
|
273
|
-
this._createMenu(item.submenu, position);
|
|
286
|
+
this._createMenu(item.submenu, itemEl);
|
|
274
287
|
this.tieredMenuService.currentItems = item.submenu;
|
|
275
288
|
this.tieredMenuService.currentItem = item.submenu[0];
|
|
276
289
|
item.isOpen = true;
|
|
@@ -289,9 +302,6 @@ export class TieredMenuComponent {
|
|
|
289
302
|
if (item.parent) {
|
|
290
303
|
item.parent.isOpen = false;
|
|
291
304
|
}
|
|
292
|
-
else {
|
|
293
|
-
enableScroll();
|
|
294
|
-
}
|
|
295
305
|
this.tieredMenuService.currentItems = item?.parent?.parent?.submenu || this.tieredMenuService.items;
|
|
296
306
|
this.tieredMenuService.currentItem = item.parent;
|
|
297
307
|
this.destroyRequest.emit(false);
|
|
@@ -302,18 +312,15 @@ export class TieredMenuComponent {
|
|
|
302
312
|
});
|
|
303
313
|
}
|
|
304
314
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
305
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TieredMenuComponent, isStandalone: true, selector: "s-tiered-menu", inputs: { ariaLabel: "ariaLabel" }, outputs: { destroyRequest: "destroyRequest" }, host: { listeners: { "
|
|
315
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TieredMenuComponent, isStandalone: true, selector: "s-tiered-menu", inputs: { ariaLabel: "ariaLabel" }, outputs: { destroyRequest: "destroyRequest" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown": "onKeydownHandler($event)" } }, ngImport: i0, template: "<div\r\n class=\"menu\"\r\n role=\"application\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n>\r\n @for (item of items; track $index) {\r\n @if (item.visible && !item.divider) {\r\n <s-tiered-menu-item\r\n [item]=\"item\"\r\n [focused]=\"item === tieredMenuService.currentItem\"\r\n [highlight]=\"item.isOpen\"\r\n fieldUtils.triggerEvent=\"hover\"\r\n [closeOnClick]=\"false\"\r\n />\r\n }\r\n @if (item.divider) {\r\n <s-tiered-menu-divider />\r\n }\r\n }\r\n</div>\r\n", styles: [".menu{background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 2px 12px #0000001a;display:inline-flex;flex-direction:column;max-height:100vh;min-width:200px;padding:4px 0;overflow-y:auto}\n"], dependencies: [{ kind: "component", type: TieredMenuItemComponent, selector: "s-tiered-menu-item", inputs: ["item", "focused", "highlight", "triggerEvent", "closeOnClick"] }, { kind: "component", type: TieredMenuDividerComponent, selector: "s-tiered-menu-divider" }] });
|
|
306
316
|
}
|
|
307
317
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TieredMenuComponent, decorators: [{
|
|
308
318
|
type: Component,
|
|
309
|
-
args: [{ selector: 's-tiered-menu', standalone: true, imports: [
|
|
319
|
+
args: [{ selector: 's-tiered-menu', standalone: true, imports: [TieredMenuItemComponent, TieredMenuDividerComponent], template: "<div\r\n class=\"menu\"\r\n role=\"application\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n>\r\n @for (item of items; track $index) {\r\n @if (item.visible && !item.divider) {\r\n <s-tiered-menu-item\r\n [item]=\"item\"\r\n [focused]=\"item === tieredMenuService.currentItem\"\r\n [highlight]=\"item.isOpen\"\r\n fieldUtils.triggerEvent=\"hover\"\r\n [closeOnClick]=\"false\"\r\n />\r\n }\r\n @if (item.divider) {\r\n <s-tiered-menu-divider />\r\n }\r\n }\r\n</div>\r\n", styles: [".menu{background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 2px 12px #0000001a;display:inline-flex;flex-direction:column;max-height:100vh;min-width:200px;padding:4px 0;overflow-y:auto}\n"] }]
|
|
310
320
|
}], propDecorators: { ariaLabel: [{
|
|
311
321
|
type: Input
|
|
312
322
|
}], destroyRequest: [{
|
|
313
323
|
type: Output
|
|
314
|
-
}], onResize: [{
|
|
315
|
-
type: HostListener,
|
|
316
|
-
args: ['window:resize']
|
|
317
324
|
}], onDocumentClick: [{
|
|
318
325
|
type: HostListener,
|
|
319
326
|
args: ['document:click', ['$event']]
|
|
@@ -321,4 +328,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
321
328
|
type: HostListener,
|
|
322
329
|
args: ['document:keydown', ['$event']]
|
|
323
330
|
}] } });
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3RpZXJlZC1tZW51L3NyYy9saWIvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS90aWVyZWQtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGllcmVkLW1lbnUvc3JjL2xpYi90aWVyZWQtbWVudS9jb21wb25lbnRzL3RpZXJlZC1tZW51L3RpZXJlZC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCx3QkFBd0IsRUFHeEIsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsUUFBUSxFQUdSLE1BQU0sRUFDTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7O0FBU2xHLE1BQU0sT0FBTyxtQkFBbUI7SUFDWCxPQUFPLEdBQUcsTUFB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QUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVoQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7d0dBM1ZRLG1CQUFtQjs0RkFBbkIsbUJBQW1CLGlUQ25DaEMscXNCQXdCQSx3U0RTYyxPQUFPLDJFQUFFLHVCQUF1Qix5SUFBRSwwQkFBMEI7OzRGQUU3RCxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0ksZUFBZSxjQUdiLElBQUksV0FDUCxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQzs4QkFVdkQsU0FBUztzQkFBeEIsS0FBSztnQkFZQyxjQUFjO3NCQURwQixNQUFNO2dCQUlBLFFBQVE7c0JBRGQsWUFBWTt1QkFBQyxlQUFlO2dCQU10QixlQUFlO3NCQURyQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVduQyxnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQXBwbGljYXRpb25SZWYsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIEVtYmVkZGVkVmlld1JlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIElucHV0LFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBpbmplY3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RpZXJlZC1tZW51LWl0ZW0taW50ZXJuYWwtZGF0YSc7XHJcbmltcG9ydCB7IFRpZXJlZE1lbnVFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGllcmVkTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aWVyZWQtbWVudS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZGlzYWJsZVNjcm9sbCwgZW5hYmxlU2Nyb2xsIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy91dGlscyc7XHJcbmltcG9ydCB7IE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBUaWVyZWRNZW51SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWl0ZW0vdGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWRpdmlkZXIvdGllcmVkLW1lbnUtZGl2aWRlci5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtdGllcmVkLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpZXJlZC1tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RpZXJlZC1tZW51LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW05nU3R5bGUsIFRpZXJlZE1lbnVJdGVtQ29tcG9uZW50LCBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaWVyZWRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwUmVmID0gaW5qZWN0KEFwcGxpY2F0aW9uUmVmKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IGluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgcmVhZG9ubHkgdGllcmVkTWVudVNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudVNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGllcmVkTWVudUV2ZW50U2VydmljZSA9IGluamVjdChUaWVyZWRNZW51RXZlbnRTZXJ2aWNlKTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG4gICAgcHVibGljIGl0ZW1zOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVtdID0gW107XHJcbiAgICBwdWJsaWMgdG9wID0gMDtcclxuICAgIHB1YmxpYyBsZWZ0ID0gMDtcclxuICAgIHB1YmxpYyBtZW51VHJpZ2dlckV2ZW50OiAnY2xpY2snIHwgJ2hvdmVyJyA9ICdob3Zlcic7XHJcbiAgICBwdWJsaWMgaXNTdWJtZW51ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8VGllcmVkTWVudUNvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX21lbnVEaXZFbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZGVzdHJveVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgICBwdWJsaWMgb25SZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAgIHB1YmxpYyBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICAvLyBDbG9zaW5nIG1lbnUgd2hlbiBjbGlja2VkIG91dHNpZGUuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2xpY2tlZEluc2lkZSA9IHRhcmdldC5jbG9zZXN0KCdzLXRpZXJlZC1tZW51LWl0ZW0nKSB8fCB0YXJnZXQuY2xvc2VzdCgncy10aWVyZWQtbWVudS1kaXZpZGVyJyk7XHJcbiAgICAgICAgaWYgKCFjbGlja2VkSW5zaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnICc6XHJcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0uZGlzYWJsZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudC5lbWl0KHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmRlY3JlbWVudEN1cnJlbnRJdGVtRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmluY3JlbWVudEN1cnJlbnRJdGVtRXZlbnQuZW1pdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSAmJiB0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUl0ZW1NZW51RXZlbnQuZW1pdCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0uZGlzYWJsZWQgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLm9wZW5JdGVtTWVudUV2ZW50LmVtaXQodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIC8vIFN1Ym1lbnVzIGhhdmUgdGhlaXIgZm9jdXMgbWFuYWdlZCBieSB0aGUgb3Blbkl0ZW1NZW51RXZlbnQgaGFuZGxlci5cclxuICAgICAgICBpZiAoIXRoaXMuaXNTdWJtZW51KSB7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID0gdGhpcy5pdGVtcztcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMuaXRlbXNbMF0gPz8gbnVsbDtcclxuICAgICAgICAgICAgZGlzYWJsZVNjcm9sbCgpO1xyXG5cclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZvY3VzQ3VycmVudEl0ZW0oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtPy5pZDtcclxuXHJcbiAgICAgICAgaWYgKCFpZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaW5jcmVtZW50Q3VySXRlbSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pdGVtcy5pbmNsdWRlcyh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAvLyBDaGVja2luZyBpZiBpdCBpcyB0aGUgY3VycmVudCBtZW51LlxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5pbmRleE9mKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pICsgMTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbY3VycmVudEluZGV4XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbS5kaXZpZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudEN1ckl0ZW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVjcmVtZW50Q3VySXRlbSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIENoZWNraW5nIGlmIGl0IGlzIHRoZSBjdXJyZW50IG1lbnUuXHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pdGVtcy5pbmNsdWRlcyh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjdXJJbmRleCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmluZGV4T2YodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkgLSAxO1xyXG5cclxuICAgICAgICBpZiAoY3VySW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbY3VySW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPVxyXG4gICAgICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbS5kaXZpZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlY3JlbWVudEN1ckl0ZW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfY3JlYXRlTWVudShpdGVtczogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGFbXSwgcG9zaXRpb246IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5fY29tcG9uZW50UmVmICYmIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoVGllcmVkTWVudUNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKHRoaXMuX2luamVjdG9yKTtcclxuICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5fY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgICAgICAgICAgY29uc3QgZG9tRWxlbSA9ICh0aGlzLl9jb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNldHRpbmcgdGhlIG1lbnUgaXRlbXMuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5pdGVtcyA9IGl0ZW1zO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UuaXNTdWJtZW51ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFN1YnNjcmliZSBtZW51IGV2ZW50cy5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmRlc3Ryb3lSZXF1ZXN0LnN1YnNjcmliZSgocHJvcGFnYXRlOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95KHByb3BhZ2F0ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fbWVudURpdkVsZW1lbnQgPSBkb21FbGVtLnF1ZXJ5U2VsZWN0b3IoJy5tZW51Jyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NldE1lbnVQb3NpdGlvbihwb3NpdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3kocHJvcGFnYXRlID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRSZWYgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmRldGFjaFZpZXcodGhpcy5fY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5fbWVudURpdkVsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3BhZ2F0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lSZXF1ZXN0LmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2V0TWVudVBvc2l0aW9uKHBvc2l0aW9uOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBJVEVNX0hFSUdIVCA9IDM3O1xyXG4gICAgICAgIGNvbnN0IERJVklERVJfSEVJR0hUID0gNTtcclxuICAgICAgICBjb25zdCBQQURESU5HID0gODtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFJlZiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCB9ID0gcG9zaXRpb247XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpdGVtc0NvdW50ID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLml0ZW1zPy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoY291bnQ6IG51bWJlciwgaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWl0ZW0uZGl2aWRlciA/IGNvdW50ICsgMSA6IGNvdW50O1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkaXZpZGVyc0NvdW50ID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLml0ZW1zPy5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAoY291bnQ6IG51bWJlciwgaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5kaXZpZGVyID8gY291bnQgKyAxIDogY291bnQ7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEkgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGhlaWdodCBvZiB0aGUgY29tcG9uZW50IGJlY2F1c2UgdGhlIGludGVybmFsIGVsZW1lbnRzIGhhdmUgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnVIZWlnaHQgPSBpdGVtc0NvdW50ICogSVRFTV9IRUlHSFQgKyBkaXZpZGVyc0NvdW50ICogRElWSURFUl9IRUlHSFQgKyBQQURESU5HICsgODtcclxuICAgICAgICAgICAgY29uc3QgbWVudVdpZHRoID0gdGhpcy5fbWVudURpdkVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID8/IDA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByaWdodEZyZWVTcGFjZSA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcmlnaHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbUZyZWVTcGFjZSA9IHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyaWdodEZyZWVTcGFjZSA+IG1lbnVXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmxlZnQgPSByaWdodDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5sZWZ0ID0gbGVmdCAtIG1lbnVXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGJvdHRvbUZyZWVTcGFjZSA8PSBtZW51SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UudG9wID0gTWF0aC5tYXgod2luZG93LmlubmVySGVpZ2h0IC0gbWVudUhlaWdodCwgd2luZG93LnNjcm9sbFkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLnRvcCA9IHdpbmRvdy5zY3JvbGxZICsgdG9wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICAvLyBJbmNyZW1lbnQgY3VycmVudCBpdGVtIGV2ZW50LlxyXG4gICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuaW5jcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRDdXJJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBEZWNyZW1lbnQgY3VycmVudCBpdGVtIGV2ZW50LlxyXG4gICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuZGVjcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWNyZW1lbnRDdXJJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBTZWxlY3QgaXRlbSBldmVudC5cclxuICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnN1Ym1lbnUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyBDbG9zZSBhbGwgbWVudXMgZXZlbnQuXHJcbiAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zO1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLm1hcmtBbGxJdGVtc0FzQ2xvc2VkKHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXMpO1xyXG4gICAgICAgICAgICBlbmFibGVTY3JvbGwoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gT3BlbiBpdGVtIG1lbnUgZXZlbnQuXHJcbiAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtLnBhcmVudCA9PT0gaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbT8ucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMudGllcmVkTWVudVNlcnZpY2Uuc2VhcmNoVGhlSGllcmFyY2h5KHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0ucGFyZW50LCBpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50OiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IHVuZGVmaW5lZCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5pc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudD8ucGFyZW50ICE9PSBpdGVtLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuY2xvc2VJdGVtTWVudUV2ZW50LmVtaXQoY3VycmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudD8ucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbT8uc3VibWVudSAmJiAhaXRlbT8uaXNPcGVuICYmIHRoaXMuaXRlbXMuaW5jbHVkZXMoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtpdGVtLmlkfWApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW1FbCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRvcCwgcmlnaHQsIGxlZnQsIGJvdHRvbSB9ID0gaXRlbUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0geyB0b3AsIHJpZ2h0LCBsZWZ0LCBib3R0b20gfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWVudShpdGVtLnN1Ym1lbnUsIHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcyA9IGl0ZW0uc3VibWVudTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gaXRlbS5zdWJtZW51WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uaXNPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNDdXJyZW50SXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2xvc2UgaXRlbSBtZW51IGV2ZW50LlxyXG4gICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuY2xvc2VJdGVtTWVudUV2ZW50XHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChpdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGwpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtcy5zb21lKChpKSA9PiBpLmlkID09PSBpdGVtLmlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhcmVudC5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSBpdGVtPy5wYXJlbnQ/LnBhcmVudD8uc3VibWVudSB8fCB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSBpdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lSZXF1ZXN0LmVtaXQoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c0N1cnJlbnRJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAgIGNsYXNzPVwibWVudVwiXHJcbiAgICByb2xlPVwiYXBwbGljYXRpb25cIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxyXG4gICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgIGxlZnQ6IGxlZnQgKyAncHgnLFxyXG4gICAgICAgIHRvcDogdG9wICsgJ3B4JyxcclxuICAgIH1cIlxyXG4+XHJcbiAgICBAZm9yIChpdGVtIG9mIGl0ZW1zOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICBAaWYgKGl0ZW0udmlzaWJsZSAmJiAhaXRlbS5kaXZpZGVyKSB7XHJcbiAgICAgICAgICAgIDxzLXRpZXJlZC1tZW51LWl0ZW1cclxuICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxyXG4gICAgICAgICAgICAgICAgW2ZvY3VzZWRdPVwiaXRlbSA9PT0gdGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgW2hpZ2hsaWdodF09XCJpdGVtLmlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICBmaWVsZFV0aWxzLnRyaWdnZXJFdmVudD1cImhvdmVyXCJcclxuICAgICAgICAgICAgICAgIFtjbG9zZU9uQ2xpY2tdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGl0ZW0uZGl2aWRlcikge1xyXG4gICAgICAgICAgICA8cy10aWVyZWQtbWVudS1kaXZpZGVyIC8+XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG48L2Rpdj5cclxuIl19
|
|
331
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllcmVkLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3RpZXJlZC1tZW51L3NyYy9saWIvdGllcmVkLW1lbnUvY29tcG9uZW50cy90aWVyZWQtbWVudS90aWVyZWQtbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvdGllcmVkLW1lbnUvc3JjL2xpYi90aWVyZWQtbWVudS9jb21wb25lbnRzL3RpZXJlZC1tZW51L3RpZXJlZC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUVULFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFFBQVEsRUFDUixLQUFLLEVBR0wsTUFBTSxFQUNOLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXFCLE9BQU8sRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7QUFTbEcsTUFBTSxPQUFPLG1C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U0FBUztzQkFBeEIsS0FBSztnQkFXQyxjQUFjO3NCQURwQixNQUFNO2dCQUlBLGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBV25DLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIENvbXBvbmVudCxcclxuICAgIENvbXBvbmVudFJlZixcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IEZvY3VzVHJhcCwgRm9jdXNUcmFwRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuXHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGllcmVkLW1lbnUtaXRlbS1pbnRlcm5hbC1kYXRhJztcclxuaW1wb3J0IHsgVGllcmVkTWVudUV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpZXJlZC1tZW51LmV2ZW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaWVyZWRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpZXJlZC1tZW51LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaWVyZWRNZW51SXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWl0ZW0vdGllcmVkLW1lbnUtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3RpZXJlZC1tZW51LWRpdmlkZXIvdGllcmVkLW1lbnUtZGl2aWRlci5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3MtdGllcmVkLW1lbnUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RpZXJlZC1tZW51LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RpZXJlZC1tZW51LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgaW1wb3J0czogW1RpZXJlZE1lbnVJdGVtQ29tcG9uZW50LCBUaWVyZWRNZW51RGl2aWRlckNvbXBvbmVudF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaWVyZWRNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb2N1c1RyYXBGYWN0b3J5ID0gaW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgcmVhZG9ubHkgdGllcmVkTWVudVNlcnZpY2UgPSBpbmplY3QoVGllcmVkTWVudVNlcnZpY2UpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGllcmVkTWVudUV2ZW50U2VydmljZSA9IGluamVjdChUaWVyZWRNZW51RXZlbnRTZXJ2aWNlKTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG4gICAgcHVibGljIGl0ZW1zOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVtdID0gW107XHJcbiAgICBwdWJsaWMgbWVudVRyaWdnZXJFdmVudDogJ2NsaWNrJyB8ICdob3ZlcicgPSAnaG92ZXInO1xyXG4gICAgcHVibGljIGlzU3VibWVudSA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFRpZXJlZE1lbnVDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9mb2N1c1RyYXA6IEZvY3VzVHJhcCB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBkZXN0cm95UmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgICBwdWJsaWMgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgLy8gQ2xvc2luZyBtZW51IHdoZW4gY2xpY2tlZCBvdXRzaWRlLlxyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0YXJnZXQuY2xvc2VzdCgncy10aWVyZWQtbWVudS1pdGVtJykgfHwgdGFyZ2V0LmNsb3Nlc3QoJ3MtdGllcmVkLW1lbnUtZGl2aWRlcicpO1xyXG4gICAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xyXG4gICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgcHVibGljIG9uS2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5yZXN0b3JlRm9jdXNFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmNsb3NlQWxsTWVudXNFdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtLmRpc2FibGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5pbmNsdWRlcyh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5zZWxlY3RJdGVtRXZlbnQuZW1pdCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5kZWNyZW1lbnRDdXJyZW50SXRlbUV2ZW50LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5pbmNyZW1lbnRDdXJyZW50SXRlbUV2ZW50LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdUYWInOlxyXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBmb2N1cyBiZXR3ZWVuIGl0ZW1zIGluc3RlYWQgb2YgbGV0dGluZyBUYWIgZXNjYXBlIHRoZSAodHJhcHBlZCkgbWVudS5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuZGVjcmVtZW50Q3VycmVudEl0ZW1FdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuaW5jcmVtZW50Q3VycmVudEl0ZW1FdmVudC5lbWl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtICYmIHRoaXMuaXRlbXMuaW5jbHVkZXModGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLmNsb3NlSXRlbU1lbnVFdmVudC5lbWl0KHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gJiZcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbS5kaXNhYmxlZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuaW5jbHVkZXModGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSlcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2Uub3Blbkl0ZW1NZW51RXZlbnQuZW1pdCh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zdWJzY3JpYmVFdmVudHMoKTtcclxuICAgICAgICB0aGlzLl9mb2N1c1RyYXAgPSB0aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAvLyBTdWJtZW51cyBoYXZlIHRoZWlyIGZvY3VzIG1hbmFnZWQgYnkgdGhlIG9wZW5JdGVtTWVudUV2ZW50IGhhbmRsZXIuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU3VibWVudSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcyA9IHRoaXMuaXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSB0aGlzLml0ZW1zWzBdID8/IG51bGw7XHJcblxyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNDdXJyZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNUcmFwPy5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZm9jdXNDdXJyZW50SXRlbSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0/LmlkO1xyXG5cclxuICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKT8uZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9pbmNyZW1lbnRDdXJJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIC8vIENoZWNraW5nIGlmIGl0IGlzIHRoZSBjdXJyZW50IG1lbnUuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zLmluZGV4T2YodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkgKyAxO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtc1tjdXJyZW50SW5kZXhdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtc1swXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtLmRpdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50Q3VySXRlbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9kZWNyZW1lbnRDdXJJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgLy8gQ2hlY2tpbmcgaWYgaXQgaXMgdGhlIGN1cnJlbnQgbWVudS5cclxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLml0ZW1zLmluY2x1ZGVzKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGN1ckluZGV4ID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMuaW5kZXhPZih0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSAtIDE7XHJcblxyXG4gICAgICAgIGlmIChjdXJJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtc1tjdXJJbmRleF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtc1t0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtLmRpdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVjcmVtZW50Q3VySXRlbSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVUJNRU5VX1BPU0lUSU9OUzogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcclxuICAgICAgICB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxyXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnIH0sXHJcbiAgICAgICAgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSxcclxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBwcml2YXRlIF9jcmVhdGVNZW51KGl0ZW1zOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YVtdLCBpdGVtRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmICYmIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5XHJcbiAgICAgICAgICAgICAgICAucG9zaXRpb24oKVxyXG4gICAgICAgICAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8oaXRlbUVsKVxyXG4gICAgICAgICAgICAgICAgLndpdGhQb3NpdGlvbnMoVGllcmVkTWVudUNvbXBvbmVudC5TVUJNRU5VX1BPU0lUSU9OUylcclxuICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgLndpdGhQdXNoKGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LFxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCksXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5fb3ZlcmxheVJlZi5hdHRhY2gobmV3IENvbXBvbmVudFBvcnRhbChUaWVyZWRNZW51Q29tcG9uZW50LCBudWxsLCB0aGlzLl9pbmplY3RvcikpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XHJcblxyXG4gICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBtZW51IGl0ZW1zLlxyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuaXRlbXMgPSBpdGVtcztcclxuICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmlzU3VibWVudSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBSZW5kZXIgc3luY2hyb25vdXNseSBzbyBpdGVtIGVsZW1lbnRzIGFyZSBxdWVyeWFibGUgcmlnaHQgYXdheSAobmVlZGVkIGJ5IHJlc3RvcmVPcGVuQ2hhaW4oKSkuXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgbWVudSBldmVudHMuXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kZXN0cm95UmVxdWVzdC5zdWJzY3JpYmUoKHByb3BhZ2F0ZTogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveShwcm9wYWdhdGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWNyZWF0ZXMgdGhlIGZseW91dCBjaGFpbiBmb3Igd2hpY2hldmVyIGl0ZW0gaXMgY3VycmVudGx5IG1hcmtlZCBgaXNPcGVuYCBpbiBgaXRlbXNgLFxyXG4gICAgICogcmVjdXJzaXZlbHkg4oCUIHVzZWQgd2hlbiBzd2l0Y2hpbmcgZnJvbSB0aGUgbmVzdGVkL21vYmlsZSBtZW51IGJhY2sgdG8gZGVza3RvcCwgd2hlcmUgdGhlXHJcbiAgICAgKiBvcGVuIHN0YXRlIGxpdmVzIG9uIHRoZSBzaGFyZWQgaXRlbSBkYXRhIGJ1dCBlYWNoIHRpZXIgaXMgYSBzZXBhcmF0ZSBvdmVybGF5IHRoYXQgbXVzdCBiZVxyXG4gICAgICogZXhwbGljaXRseSByZWNyZWF0ZWQgdG8gbWF0Y2ggaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXN0b3JlT3BlbkNoYWluKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG9wZW5JdGVtID0gdGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLmlzT3BlbiAmJiBpdGVtLnN1Ym1lbnUpO1xyXG5cclxuICAgICAgICBpZiAoIW9wZW5JdGVtKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGl0ZW1FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke29wZW5JdGVtLmlkfWApO1xyXG5cclxuICAgICAgICBpZiAoIWl0ZW1FbCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLl9jcmVhdGVNZW51KG9wZW5JdGVtLnN1Ym1lbnUgYXMgVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGFbXSwgaXRlbUVsIGFzIEhUTUxFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZWY/Lmluc3RhbmNlLnJlc3RvcmVPcGVuQ2hhaW4oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpc3Bvc2VzIHRoaXMgdGllcidzIG93biBzdWJtZW51IG92ZXJsYXkgY2hhaW4gKGlmIGFueSkgd2l0aG91dCB0b3VjaGluZyBgaXNPcGVuYCBzdGF0ZSDigJRcclxuICAgICAqIHVzZWQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBkZXNrdG9wIHRvIG5lc3RlZCwgd2hlcmUgdGhlIG9wZW4gc3RhdGUgbXVzdCBzdXJ2aXZlIGJ1dCB0aGVcclxuICAgICAqIGZseW91dCBvdmVybGF5cyB0aGVtc2VsdmVzIG5lZWQgdG8gZ28gYXdheS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRpc3Bvc2VDaGFpbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZWY/Lmluc3RhbmNlLmRpc3Bvc2VDaGFpbigpO1xyXG4gICAgICAgIHRoaXMuX292ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcclxuICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2Rlc3Ryb3kocHJvcGFnYXRlID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcm9wYWdhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVxdWVzdC5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3N1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICAvLyBJbmNyZW1lbnQgY3VycmVudCBpdGVtIGV2ZW50LlxyXG4gICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuaW5jcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRDdXJJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBEZWNyZW1lbnQgY3VycmVudCBpdGVtIGV2ZW50LlxyXG4gICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuZGVjcmVtZW50Q3VycmVudEl0ZW1FdmVudC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWNyZW1lbnRDdXJJdGVtKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBTZWxlY3QgaXRlbSBldmVudC5cclxuICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLnNlbGVjdEl0ZW1FdmVudFxyXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoaXRlbTogVGllcmVkTWVudUl0ZW1JbnRlcm5hbERhdGEgfCBudWxsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnN1Ym1lbnUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5vcGVuSXRlbU1lbnVFdmVudC5lbWl0KGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5jb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJlZE1lbnVFdmVudFNlcnZpY2UuY2xvc2VBbGxNZW51c0V2ZW50LmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAvLyBDbG9zZSBhbGwgbWVudXMgZXZlbnQuXHJcbiAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUFsbE1lbnVzRXZlbnQucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbXMgPSB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLml0ZW1zO1xyXG4gICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLm1hcmtBbGxJdGVtc0FzQ2xvc2VkKHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBPcGVuIGl0ZW0gbWVudSBldmVudC5cclxuICAgICAgICB0aGlzLl90aWVyZWRNZW51RXZlbnRTZXJ2aWNlLm9wZW5JdGVtTWVudUV2ZW50XHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl91bnN1YnNjcmliZSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChpdGVtOiBUaWVyZWRNZW51SXRlbUludGVybmFsRGF0YSB8IG51bGwpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0ucGFyZW50ID09PSBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtPy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy50aWVyZWRNZW51U2VydmljZS5zZWFyY2hUaGVIaWVyYXJjaHkodGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbS5wYXJlbnQsIGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIHwgdW5kZWZpbmVkID0gdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Py5wYXJlbnQgIT09IGl0ZW0ucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUl0ZW1NZW51RXZlbnQuZW1pdChjdXJyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Py5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtPy5zdWJtZW51ICYmICFpdGVtPy5pc09wZW4gJiYgdGhpcy5pdGVtcy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2l0ZW0uaWR9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbUVsKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1lbnUoaXRlbS5zdWJtZW51LCBpdGVtRWwgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW1zID0gaXRlbS5zdWJtZW51O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGllcmVkTWVudVNlcnZpY2UuY3VycmVudEl0ZW0gPSBpdGVtLnN1Ym1lbnVbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5pc09wZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c0N1cnJlbnRJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbG9zZSBpdGVtIG1lbnUgZXZlbnQuXHJcbiAgICAgICAgdGhpcy5fdGllcmVkTWVudUV2ZW50U2VydmljZS5jbG9zZUl0ZW1NZW51RXZlbnRcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGl0ZW06IFRpZXJlZE1lbnVJdGVtSW50ZXJuYWxEYXRhIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLnNvbWUoKGkpID0+IGkuaWQgPT09IGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGFyZW50LmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpZXJlZE1lbnVTZXJ2aWNlLmN1cnJlbnRJdGVtcyA9IGl0ZW0/LnBhcmVudD8ucGFyZW50Py5zdWJtZW51IHx8IHRoaXMudGllcmVkTWVudVNlcnZpY2UuaXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbSA9IGl0ZW0ucGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlcXVlc3QuZW1pdChmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzQ3VycmVudEl0ZW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICAgY2xhc3M9XCJtZW51XCJcclxuICAgIHJvbGU9XCJhcHBsaWNhdGlvblwiXHJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXHJcbj5cclxuICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXM7IHRyYWNrICRpbmRleCkge1xyXG4gICAgICAgIEBpZiAoaXRlbS52aXNpYmxlICYmICFpdGVtLmRpdmlkZXIpIHtcclxuICAgICAgICAgICAgPHMtdGllcmVkLW1lbnUtaXRlbVxyXG4gICAgICAgICAgICAgICAgW2l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICBbZm9jdXNlZF09XCJpdGVtID09PSB0aWVyZWRNZW51U2VydmljZS5jdXJyZW50SXRlbVwiXHJcbiAgICAgICAgICAgICAgICBbaGlnaGxpZ2h0XT1cIml0ZW0uaXNPcGVuXCJcclxuICAgICAgICAgICAgICAgIGZpZWxkVXRpbHMudHJpZ2dlckV2ZW50PVwiaG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgW2Nsb3NlT25DbGlja109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEBpZiAoaXRlbS5kaXZpZGVyKSB7XHJcbiAgICAgICAgICAgIDxzLXRpZXJlZC1tZW51LWRpdmlkZXIgLz5cclxuICAgICAgICB9XHJcbiAgICB9XHJcbjwvZGl2PlxyXG4iXX0=
|