@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.
Files changed (79) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +2 -1
  2. package/code-editor/lib/code-editor/core/facades/core-facade.d.ts +3 -1
  3. package/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.d.ts +12 -2
  4. package/drawer/README.md +119 -0
  5. package/drawer/index.d.ts +5 -0
  6. package/{sidebar/lib/sidebar/sidebar.component.d.ts → drawer/lib/drawer/drawer.component.d.ts} +18 -15
  7. package/drawer/lib/drawer/drawer.module.d.ts +8 -0
  8. package/drawer/public-api.d.ts +2 -0
  9. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +6 -3
  10. package/esm2022/code-editor/lib/code-editor/core/facades/core-facade.mjs +7 -1
  11. package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/codemirror-6-core.mjs +47 -22
  12. package/esm2022/drawer/lib/drawer/drawer.component.mjs +192 -0
  13. package/esm2022/drawer/lib/drawer/drawer.module.mjs +17 -0
  14. package/esm2022/drawer/public-api.mjs +3 -0
  15. package/esm2022/drawer/seniorsistemas-angular-components-drawer.mjs +5 -0
  16. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +4 -5
  17. package/esm2022/lib/locale/fallback.mjs +3 -2
  18. package/esm2022/select/lib/select/select.component.mjs +11 -14
  19. package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-config.mjs +2 -0
  20. package/esm2022/side-sheet/lib/side-sheet/models/side-sheet-size.mjs +2 -0
  21. package/esm2022/side-sheet/lib/side-sheet/services/side-sheet.service.mjs +82 -0
  22. package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +171 -0
  23. package/esm2022/side-sheet/public-api.mjs +3 -0
  24. package/esm2022/side-sheet/seniorsistemas-angular-components-side-sheet.mjs +5 -0
  25. package/esm2022/sidebar/public-api.mjs +12 -3
  26. package/esm2022/switch/lib/switch/switch.component.mjs +5 -3
  27. package/esm2022/switch/lib/switch/switch.module.mjs +2 -2
  28. package/esm2022/tabs/lib/tab-item/tab-item.component.mjs +4 -3
  29. package/esm2022/tabs/lib/tabs/tabs.component.mjs +14 -10
  30. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.mjs +82 -75
  31. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
  32. package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.mjs +35 -18
  33. package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.mjs +2 -1
  34. package/esm2022/tiered-menu/lib/tiered-menu/tiered-menu.directive.mjs +89 -77
  35. package/esm2022/toast/lib/toast/toast.service.mjs +2 -2
  36. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +5 -2
  37. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  38. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +52 -21
  39. package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-drawer.mjs +211 -0
  41. package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -0
  42. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +3 -4
  43. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  44. package/fesm2022/seniorsistemas-angular-components-select.mjs +10 -13
  45. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  46. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +257 -0
  47. package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -0
  48. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs +10 -180
  49. package/fesm2022/seniorsistemas-angular-components-sidebar.mjs.map +1 -1
  50. package/fesm2022/seniorsistemas-angular-components-switch.mjs +5 -3
  51. package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
  52. package/fesm2022/seniorsistemas-angular-components-tabs.mjs +16 -11
  53. package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
  54. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +201 -164
  55. package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
  56. package/fesm2022/seniorsistemas-angular-components-toast.mjs +1 -1
  57. package/fesm2022/seniorsistemas-angular-components-toast.mjs.map +1 -1
  58. package/fesm2022/seniorsistemas-angular-components.mjs +2 -1
  59. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  60. package/package.json +19 -7
  61. package/select/lib/select/select.component.d.ts +2 -1
  62. package/side-sheet/README.md +184 -0
  63. package/side-sheet/index.d.ts +5 -0
  64. package/side-sheet/lib/side-sheet/models/side-sheet-config.d.ts +20 -0
  65. package/side-sheet/lib/side-sheet/models/side-sheet-size.d.ts +1 -0
  66. package/side-sheet/lib/side-sheet/services/side-sheet.service.d.ts +49 -0
  67. package/side-sheet/lib/side-sheet/side-sheet.component.d.ts +61 -0
  68. package/side-sheet/public-api.d.ts +4 -0
  69. package/sidebar/README.md +20 -93
  70. package/sidebar/public-api.d.ts +11 -2
  71. package/tabs/lib/tab-item/tab-item.component.d.ts +1 -0
  72. package/tabs/lib/tabs/tabs.component.d.ts +2 -1
  73. package/tiered-menu/lib/tiered-menu/components/tiered-menu/tiered-menu.component.d.ts +19 -7
  74. package/tiered-menu/lib/tiered-menu/components/tiered-menu-nested/tiered-menu-nested.component.d.ts +4 -3
  75. package/tiered-menu/lib/tiered-menu/services/tiered-menu.event.service.d.ts +1 -0
  76. package/tiered-menu/lib/tiered-menu/tiered-menu.directive.d.ts +6 -5
  77. package/esm2022/sidebar/lib/sidebar/sidebar.component.mjs +0 -169
  78. package/esm2022/sidebar/lib/sidebar/sidebar.module.mjs +0 -17
  79. 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 { TooltipDirective } from '@seniorsistemas/angular-components/tooltip';
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 overflow-hidden text-ellipsis whitespace-nowrap border-primary p-2 hover:transition-all disabled:border-grayscale-30 disabled:text-grayscale-30\"\n [class.active-tab]=\"isActiveTab\"\n [disabled]=\"disabledTab\"\n [ngClass]=\"{\n 'font-bold': isActiveTab,\n 'text-primary': !isActiveTab,\n 'border-b-4': isActiveTab && isHorizontal,\n 'border-r-4': isActiveTab && isVertical,\n 'hover:border-b-4': isHorizontal && !disabledTab,\n 'hover:border-r-4': isVertical && !disabledTab,\n 'flex items-center gap-2': tab.icon(),\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 overflow-hidden text-ellipsis whitespace-nowrap text-left\"\n [class.max-w-28]=\"isHorizontal\"\n [sTooltip]=\"tab.header()\"\n [visible]=\"!disabledTab\"\n [checkTruncatedText]=\"true\"\n >\n {{ tab.header() }}\n </span>\n }\n </button>\n }\n</ng-template>\n\n<ng-template #renderComponent>\n @let template = activeTabComponent();\n @if (template) {\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()) {\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=\"vertical-tab-buttons 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", styles: [".vertical-tab{container:vertical-tab/inline-size}.vertical-tab-buttons{width:14rem}.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"] }, { kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }] });
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, TooltipDirective], 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 overflow-hidden text-ellipsis whitespace-nowrap border-primary p-2 hover:transition-all disabled:border-grayscale-30 disabled:text-grayscale-30\"\n [class.active-tab]=\"isActiveTab\"\n [disabled]=\"disabledTab\"\n [ngClass]=\"{\n 'font-bold': isActiveTab,\n 'text-primary': !isActiveTab,\n 'border-b-4': isActiveTab && isHorizontal,\n 'border-r-4': isActiveTab && isVertical,\n 'hover:border-b-4': isHorizontal && !disabledTab,\n 'hover:border-r-4': isVertical && !disabledTab,\n 'flex items-center gap-2': tab.icon(),\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 overflow-hidden text-ellipsis whitespace-nowrap text-left\"\n [class.max-w-28]=\"isHorizontal\"\n [sTooltip]=\"tab.header()\"\n [visible]=\"!disabledTab\"\n [checkTruncatedText]=\"true\"\n >\n {{ tab.header() }}\n </span>\n }\n </button>\n }\n</ng-template>\n\n<ng-template #renderComponent>\n @let template = activeTabComponent();\n @if (template) {\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()) {\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=\"vertical-tab-buttons 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", styles: [".vertical-tab{container:vertical-tab/inline-size}.vertical-tab-buttons{width:14rem}.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"] }]
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==
@@ -1,33 +1,31 @@
1
- import { ApplicationRef, ChangeDetectorRef, Component, ComponentFactoryResolver, EventEmitter, HostListener, Input, Injector, Output, inject, } from '@angular/core';
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
- _appRef = inject(ApplicationRef);
13
- _componentFactoryResolver = inject(ComponentFactoryResolver);
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
- _menuDivElement = null;
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
- _createMenu(items, position) {
150
- if (!this._componentRef && items) {
151
- const componentFactory = this._componentFactoryResolver.resolveComponentFactory(TieredMenuComponent);
152
- this._componentRef = componentFactory.create(this._injector);
153
- this._appRef.attachView(this._componentRef.hostView);
154
- const domElem = this._componentRef.hostView.rootNodes[0];
155
- document.body.appendChild(domElem);
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
- this._componentRef.instance.items = items;
158
- this._componentRef.instance.isSubmenu = true;
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
- this._componentRef.instance.destroyRequest.subscribe((propagate) => {
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._componentRef !== null) {
169
- this._appRef.detachView(this._componentRef.hostView);
170
- this._componentRef.destroy();
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
- const { top, right, left, bottom } = itemEl.getBoundingClientRect();
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: { "window:resize": "onResize()", "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 [ngStyle]=\"{\r\n left: left + 'px',\r\n top: top + 'px',\r\n }\"\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:176px;padding:4px 0;overflow-y:auto;position:absolute;z-index:9999}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TieredMenuItemComponent, selector: "s-tiered-menu-item", inputs: ["item", "focused", "highlight", "triggerEvent", "closeOnClick"] }, { kind: "component", type: TieredMenuDividerComponent, selector: "s-tiered-menu-divider" }] });
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: [NgStyle, TieredMenuItemComponent, TieredMenuDividerComponent], template: "<div\r\n class=\"menu\"\r\n role=\"application\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [ngStyle]=\"{\r\n left: left + 'px',\r\n top: top + 'px',\r\n }\"\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:176px;padding:4px 0;overflow-y:auto;position:absolute;z-index:9999}\n"] }]
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=