@magicx-eng/ai-autocomplete-angular 0.12.0 → 0.13.1

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 (27) hide show
  1. package/README.md +34 -15
  2. package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +3 -3
  3. package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +44 -5
  4. package/esm2020/lib/controller/ai-autocomplete.controller.mjs +3 -3
  5. package/esm2020/lib/internal/date-grid/date-grid.component.mjs +9 -3
  6. package/esm2020/lib/internal/layout/grid.component.mjs +10 -4
  7. package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +79 -18
  8. package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +25 -4
  9. package/esm2020/lib/shared/types.mjs +1 -1
  10. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +165 -29
  11. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  12. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +162 -29
  13. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  14. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +17 -2
  15. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -1
  16. package/lib/controller/ai-autocomplete.controller.d.ts +1 -1
  17. package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -1
  18. package/lib/internal/date-grid/date-grid.component.d.ts +2 -0
  19. package/lib/internal/date-grid/date-grid.component.d.ts.map +1 -1
  20. package/lib/internal/layout/grid.component.d.ts +10 -2
  21. package/lib/internal/layout/grid.component.d.ts.map +1 -1
  22. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +30 -9
  23. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -1
  24. package/lib/internal/suggestion-item/suggestion-item.component.d.ts +16 -2
  25. package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -1
  26. package/lib/shared/types.d.ts +1 -1
  27. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject, ViewEncapsulation, } from "@angular/core";
3
- import { buildAttributionUrl, getFooterHint, } from "@magicx-eng/ai-autocomplete-vanilla";
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject, ViewChild, ViewEncapsulation, } from "@angular/core";
3
+ import { attachScrollArrow, buildAttributionUrl, getFooterHint, SCROLL_ARROW_LABEL, } from "@magicx-eng/ai-autocomplete-vanilla";
4
4
  import { BehaviorSubject, combineLatest } from "rxjs";
5
5
  import { map } from "rxjs/operators";
6
6
  import { DateGridComponent } from "../internal/date-grid/date-grid.component";
@@ -44,6 +44,10 @@ export class AIAutocompleteDropdownComponent {
44
44
  this.cdr = inject(ChangeDetectorRef);
45
45
  /** Fallback skeleton-bar widths used when loading with zero cached options. */
46
46
  this.fallbackSkeletonBarWidths = [159, 119, 164];
47
+ /** Accessible name of the "more below" scroll arrow. */
48
+ this.scrollArrowLabel = SCROLL_ARROW_LABEL;
49
+ /** The grid the scroll-arrow controller is currently bound to. */
50
+ this.scrollArrowBinding = null;
47
51
  /**
48
52
  * Attribution/branding link URL for the footer, with a `utm_source` derived
49
53
  * from the embedding page's hostname (see {@link buildAttributionUrl}).
@@ -97,8 +101,37 @@ export class AIAutocompleteDropdownComponent {
97
101
  this.initVm();
98
102
  }
99
103
  }
104
+ /**
105
+ * Keep the core's "more below" arrow controller bound to whichever options
106
+ * grid is currently rendered — the Angular analogue of React's
107
+ * useScrollArrow. The controller owns the behaviour (measuring, visibility,
108
+ * the page-scroll on click — see the core's scrollArrow.ts); this only hands
109
+ * it the live elements after each view check, re-attaching when the grid
110
+ * element is replaced and tearing down when there is no grid.
111
+ */
112
+ ngAfterViewChecked() {
113
+ const root = this.dropdownRootRef?.nativeElement;
114
+ const button = this.scrollArrowRef?.nativeElement;
115
+ const grid = root?.querySelector(".aia-grid[data-scroll]") ?? null;
116
+ if (this.scrollArrowBinding && this.scrollArrowBinding.grid !== grid) {
117
+ this.scrollArrowBinding.controller.destroy();
118
+ this.scrollArrowBinding = null;
119
+ }
120
+ if (!root || !button || !grid)
121
+ return;
122
+ if (!this.scrollArrowBinding) {
123
+ this.scrollArrowBinding = {
124
+ grid,
125
+ controller: attachScrollArrow({ dropdown: root, grid, button }),
126
+ };
127
+ return; // attach() runs the first update itself
128
+ }
129
+ this.scrollArrowBinding.controller.update();
130
+ }
100
131
  ngOnDestroy() {
101
132
  this.teardownModeListener();
133
+ this.scrollArrowBinding?.controller.destroy();
134
+ this.scrollArrowBinding = null;
102
135
  }
103
136
  /**
104
137
  * Resolve the `mode` input into `resolvedMode`. Unset → null (the dropdown
@@ -238,7 +271,7 @@ export class AIAutocompleteDropdownComponent {
238
271
  }
239
272
  }
240
273
  AIAutocompleteDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
241
- AIAutocompleteDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteDropdownComponent, isStandalone: true, selector: "ai-autocomplete-dropdown", inputs: { controller: "controller", showPills: "showPills", showSkipButton: "showSkipButton", className: "className", mode: "mode" }, usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"vm$ | async as vm\"\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n [attr.data-mode]=\"resolvedMode\"\n [attr.data-options-position]=\"vm.optionsPosition\"\n [attr.data-aia-has-products]=\"vm.products.length > 0 ? '' : null\"\n [class]=\"rootClass\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n (mousedown)=\"preventBlur($event)\"\n>\n <aia-stack space=\"8px\">\n <aia-cluster\n *ngIf=\"vm.showsPills || vm.showsSkip\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n [noWrap]=\"true\"\n >\n <!-- The scroll + right-edge fade live on this wrapper (not the bar) so\n the skip button stays outside the masked region \u2014 pinned and fully\n opaque while overflowing pills fade under it. Absent in a skip-only\n row (pills rendered elsewhere via pillPlacement inline/hidden). -->\n <span *ngIf=\"vm.showsPills\" class=\"magicx-aia-pill-scroll\" data-aia-pill-scroll=\"\">\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"vm.isActivePillSelected\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </span>\n <button\n *ngIf=\"vm.showsSkip\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-skip\"\n data-aia-skip=\"\"\n [disabled]=\"vm.skipDisabled\"\n [attr.aria-label]=\"vm.activePillLabel ? 'Skip ' + vm.activePillLabel : 'Skip'\"\n (click)=\"onSkip()\"\n >\n skip\n </button>\n </aia-cluster>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n [groupKey]=\"vm.groupKey\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <aia-date-grid\n *ngIf=\"vm.showsDateGrid\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [view]=\"vm.dateView\"\n [selectedIso]=\"vm.selectedDateIso\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n (previousMonth)=\"onPreviousMonth()\"\n (nextMonth)=\"onNextMonth()\"\n ></aia-date-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n\n <!-- *ngIf, not just the section's own guard inside the component: the host\n element is an in-flow child of .aia-stack (display:flex; gap:8px), so\n an always-instantiated zero-height host would add a SECOND 8px gap\n between the grid and the footer \u2014 in every dropdown, products or not.\n The grid's --aia-grid-overlap-bottom is tuned for exactly one gap, so\n the footer would land 8px below the band it is meant to cover. -->\n <aia-product-strip\n *ngIf=\"vm.products.length > 0\"\n [products]=\"vm.products\"\n [listboxId]=\"controller.listboxId\"\n [focusable]=\"vm.isVisible\"\n (select)=\"onProductSelect($event)\"\n (focusChange)=\"onProductFocusChange($event)\"\n ></aia-product-strip>\n\n <footer class=\"magicx-aia-footer\" data-aia-footer=\"\">\n <div class=\"magicx-aia-footer-row\">\n <span class=\"magicx-aia-footer-hint-group\">\n <kbd class=\"magicx-aia-footer-key\">{{ vm.footerKey }}</kbd>\n <span class=\"magicx-aia-footer-hint\">{{ vm.footerHint }}</span>\n </span>\n <a\n class=\"magicx-aia-footer-brand-link\"\n [href]=\"brandHref\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"magicx-aia-footer-brand\">AI</span>\n <span class=\"magicx-aia-footer-badge\">Autocomplete</span>\n </a>\n </div>\n </footer>\n </aia-stack>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia){--aia-primitive-neutral-0: #000000;--aia-primitive-neutral-150: #1a1b1d;--aia-primitive-neutral-250: #323232;--aia-primitive-neutral-300: #333539;--aia-primitive-neutral-400: #4a4a4a;--aia-primitive-neutral-500: #505050;--aia-primitive-neutral-700: #b0b0b0;--aia-primitive-neutral-750: #bdbdbd;--aia-primitive-neutral-900: #e7e7e7;--aia-primitive-neutral-1000: #ffffff;--aia-primitive-blue-50: #eef2ff;--aia-primitive-neutral-750-a50: rgba(189, 189, 189, .51);--aia-primitive-neutral-750-a25: rgba(189, 189, 189, .25);--aia-primitive-neutral-750-a35: rgba(189, 189, 189, .35);--aia-primitive-neutral-750-a30: rgba(189, 189, 189, .3);--aia-primitive-neutral-750-a15: rgba(189, 189, 189, .15);--aia-primitive-neutral-750-a105: rgba(189, 189, 189, .105);--aia-primitive-neutral-700-a40: rgba(176, 176, 176, .4);--aia-primitive-neutral-900-a50: rgba(231, 231, 231, .5);--aia-primitive-neutral-400-a50: rgba(74, 74, 74, .5)}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: var(--aia-primitive-neutral-1000);--aia-border: var(--aia-primitive-neutral-700);--aia-dropdown-border: var(--aia-primitive-neutral-900-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-300);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a105);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-0);--aia-option-bg: var(--aia-primitive-blue-50);--aia-option-color: var(--aia-primitive-neutral-150);--aia-option-color-selected: var(--aia-primitive-neutral-0);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-0);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: var(--aia-primitive-neutral-0);--aia-submit-color: var(--aia-primitive-neutral-1000);--aia-color-text-muted: #6b7280;--aia-skeleton-bg: var(--aia-primitive-neutral-750-a25);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--aia-footer-hint-color: var(--aia-primitive-neutral-500);--aia-footer-brand-color: var(--aia-primitive-neutral-700);--aia-footer-badge-border: var(--aia-primitive-neutral-750-a50)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: var(--aia-primitive-neutral-0);--aia-border: var(--aia-primitive-neutral-500);--aia-dropdown-border: var(--aia-primitive-neutral-400-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-700);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a15);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-1000);--aia-option-bg: var(--aia-primitive-neutral-250);--aia-option-color: var(--aia-primitive-neutral-900);--aia-option-color-selected: var(--aia-primitive-neutral-1000);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-1000);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: var(--aia-primitive-neutral-1000);--aia-submit-color: var(--aia-primitive-neutral-0);--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: var(--aia-primitive-neutral-150);--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-hint-color: var(--aia-primitive-neutral-700);--aia-footer-brand-color: var(--aia-primitive-neutral-500);--aia-footer-badge-border: var(--aia-primitive-neutral-500)}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown],[data-aia-dropdown][data-options-position=above]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));top:auto;bottom:100%;margin-top:0;margin-bottom:6px}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack,[data-aia-dropdown][data-options-position=above] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer],[data-aia-dropdown][data-options-position=above] [data-aia-footer]{padding:0 8px var(--aia-footer-gap, 8px)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer,[data-aia-dropdown][data-options-position=above] .magicx-aia-footer{flex-direction:column-reverse}\n", ".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:544px;margin-top:6px;display:flex;flex-direction:column;box-sizing:border-box;padding:10px 8px;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.4,0,.2,1);background:var(--aia-surface, #ffffff);border:1px solid var(--aia-dropdown-border, rgba(231, 231, 231, .5));border-radius:18px;box-shadow:var(--aia-dropdown-shadow, 0 8px 12px rgba(0, 0, 0, .05))}.magicx-aia-dropdown[data-aia-surface=glass]{background:transparent;border-color:transparent;box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px)}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto}.magicx-aia-dropdown-pillbar{overflow:hidden}.magicx-aia-pill-scroll{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-pill-scroll::-webkit-scrollbar{display:none}.magicx-aia-skip{display:inline-flex;align-items:center;margin-inline-start:auto;flex-shrink:0;padding:5px 8px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:var(--aia-skip-font-size, 10px);line-height:18px;color:var(--aia-skip-color, var(--aia-footer-hint-color, #505050));cursor:pointer;white-space:nowrap;transition:color .15s ease-out,background-color .15s ease-out}.magicx-aia-skip:hover{color:var(--aia-skip-color-hover, var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb)));background:var(--aia-skip-hover-bg, var(--aia-option-bg, transparent))}.magicx-aia-skip:disabled{pointer-events:none;cursor:default;opacity:.5}.magicx-aia-footer{display:flex;flex-direction:column;gap:8px;padding:var(--aia-footer-gap, 8px) 8px 0;position:relative;z-index:3;pointer-events:none}.magicx-aia-footer-row{display:flex;align-items:center;justify-content:space-between}.magicx-aia-footer-hint-group{display:inline-flex;align-items:center;gap:5px}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{pointer-events:auto}.magicx-aia-footer-brand-link{display:inline-flex;align-items:center;gap:2px;text-decoration:none;cursor:pointer;transition:opacity .15s ease-out}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{background:var( --aia-footer-chip-bg, color-mix(in srgb, var(--aia-surface, #ffffff) 65%, transparent) );padding-inline:4px;border-radius:6px}.magicx-aia-footer-brand-link{background:var(--aia-footer-brand-pill-bg, var(--aia-surface, #ffffff));border-radius:999px;padding:2px 7px;gap:4px}.magicx-aia-footer-brand-link:hover{opacity:.7}.magicx-aia-footer-key{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:2px 6px;border:.5px solid var(--aia-footer-hint-color, #505050);border-radius:5px;font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-hint{font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-brand{font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}.magicx-aia-footer-badge{display:inline-flex;align-items:center;height:var(--aia-footer-row-height, 23px);padding:2.5px 5.5px;border:.5px solid var(--aia-footer-badge-border, rgba(189, 189, 189, .51));border-radius:999px;font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}@media (max-width: 768px){.magicx-aia-footer-hint-group{display:none}.magicx-aia-footer-row{justify-content:flex-end}}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:7px 8px}.magicx-aia-dropdown-skeleton-bar{display:block;height:14px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .25)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading", "activeSelected"], outputs: ["selectPill"] }, { kind: "component", type: ProductStripComponent, selector: "aia-product-strip", inputs: ["products", "listboxId", "focusable"], outputs: ["select", "focusChange"] }, { kind: "component", type: SuggestionGridComponent, selector: "aia-suggestion-grid", inputs: ["options", "activeIndex", "listboxId", "loading", "groupKey"], outputs: ["select", "highlight"] }, { kind: "component", type: DateGridComponent, selector: "aia-date-grid", inputs: ["options", "activeIndex", "listboxId", "view", "selectedIso"], outputs: ["select", "highlight", "previousMonth", "nextMonth"] }, { kind: "component", type: StackComponent, selector: "aia-stack", inputs: ["space", "align"] }, { kind: "component", type: ClusterComponent, selector: "aia-cluster", inputs: ["gap", "align", "justify", "noWrap", "inline"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
274
+ AIAutocompleteDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteDropdownComponent, isStandalone: true, selector: "ai-autocomplete-dropdown", inputs: { controller: "controller", showPills: "showPills", showSkipButton: "showSkipButton", className: "className", mode: "mode" }, viewQueries: [{ propertyName: "dropdownRootRef", first: true, predicate: ["dropdownRoot"], descendants: true }, { propertyName: "scrollArrowRef", first: true, predicate: ["scrollArrow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"vm$ | async as vm\"\n #dropdownRoot\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n [attr.data-mode]=\"resolvedMode\"\n [attr.data-options-position]=\"vm.optionsPosition\"\n [attr.data-aia-has-products]=\"vm.products.length > 0 ? '' : null\"\n [class]=\"rootClass\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n (mousedown)=\"preventBlur($event)\"\n>\n <aia-stack space=\"8px\">\n <aia-cluster\n *ngIf=\"vm.showsPills || vm.showsSkip\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n [noWrap]=\"true\"\n >\n <!-- The scroll + right-edge fade live on this wrapper (not the bar) so\n the skip button stays outside the masked region \u2014 pinned and fully\n opaque while overflowing pills fade under it. Absent in a skip-only\n row (pills rendered elsewhere via pillPlacement inline/hidden). -->\n <span *ngIf=\"vm.showsPills\" class=\"magicx-aia-pill-scroll\" data-aia-pill-scroll=\"\">\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"vm.isActivePillSelected\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </span>\n <button\n *ngIf=\"vm.showsSkip\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-skip\"\n data-aia-skip=\"\"\n [disabled]=\"vm.skipDisabled\"\n [attr.aria-label]=\"vm.activePillLabel ? 'Skip ' + vm.activePillLabel : 'Skip'\"\n (click)=\"onSkip()\"\n >\n skip\n </button>\n </aia-cluster>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n [groupKey]=\"vm.groupKey\"\n [optionsPosition]=\"vm.optionsPosition\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <aia-date-grid\n *ngIf=\"vm.showsDateGrid\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [view]=\"vm.dateView\"\n [selectedIso]=\"vm.selectedDateIso\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n (previousMonth)=\"onPreviousMonth()\"\n (nextMonth)=\"onNextMonth()\"\n ></aia-date-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n\n <!-- *ngIf, not just the section's own guard inside the component: the host\n element is an in-flow child of .aia-stack (display:flex; gap:8px), so\n an always-instantiated zero-height host would add a SECOND 8px gap\n between the grid and the footer \u2014 in every dropdown, products or not.\n The grid's --aia-grid-overlap-bottom is tuned for exactly one gap, so\n the footer would land 8px below the band it is meant to cover. -->\n <aia-product-strip\n *ngIf=\"vm.products.length > 0\"\n [products]=\"vm.products\"\n [listboxId]=\"controller.listboxId\"\n [focusable]=\"vm.isVisible\"\n (select)=\"onProductSelect($event)\"\n (focusChange)=\"onProductFocusChange($event)\"\n ></aia-product-strip>\n\n <footer class=\"magicx-aia-footer\" data-aia-footer=\"\">\n <div class=\"magicx-aia-footer-row\">\n <span class=\"magicx-aia-footer-hint-group\">\n <kbd class=\"magicx-aia-footer-key\">{{ vm.footerKey }}</kbd>\n <span class=\"magicx-aia-footer-hint\">{{ vm.footerHint }}</span>\n </span>\n <a\n class=\"magicx-aia-footer-brand-link\"\n [href]=\"brandHref\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"magicx-aia-footer-brand\">AI</span>\n <span class=\"magicx-aia-footer-badge\">Autocomplete</span>\n </a>\n </div>\n </footer>\n </aia-stack>\n <!-- \"More below\" arrow \u2014 an overlay on the panel, not a section of the\n stack. Shown/positioned by the core's scroll-arrow controller (see\n syncScrollArrow); markup mirrors vanilla's createScrollArrowButton. -->\n <button\n #scrollArrow\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-scroll-arrow\"\n data-aia-scroll-arrow=\"\"\n [attr.aria-label]=\"scrollArrowLabel\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 6.5 8 10.5l4-4\" />\n </svg>\n </button>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia){--aia-primitive-neutral-0: #000000;--aia-primitive-neutral-150: #1a1b1d;--aia-primitive-neutral-250: #323232;--aia-primitive-neutral-300: #333539;--aia-primitive-neutral-400: #4a4a4a;--aia-primitive-neutral-500: #505050;--aia-primitive-neutral-700: #b0b0b0;--aia-primitive-neutral-750: #bdbdbd;--aia-primitive-neutral-900: #e7e7e7;--aia-primitive-neutral-1000: #ffffff;--aia-primitive-blue-50: #eef2ff;--aia-primitive-neutral-750-a50: rgba(189, 189, 189, .51);--aia-primitive-neutral-750-a25: rgba(189, 189, 189, .25);--aia-primitive-neutral-750-a35: rgba(189, 189, 189, .35);--aia-primitive-neutral-750-a30: rgba(189, 189, 189, .3);--aia-primitive-neutral-750-a15: rgba(189, 189, 189, .15);--aia-primitive-neutral-750-a105: rgba(189, 189, 189, .105);--aia-primitive-neutral-700-a40: rgba(176, 176, 176, .4);--aia-primitive-neutral-900-a50: rgba(231, 231, 231, .5);--aia-primitive-neutral-400-a50: rgba(74, 74, 74, .5)}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: var(--aia-primitive-neutral-1000);--aia-border: var(--aia-primitive-neutral-700);--aia-shadow: inset 0 1px 0 rgba(255, 255, 255, .9), 0 1px 2px rgba(16, 24, 40, .05), 0 8px 24px rgba(16, 24, 40, .08);--aia-dropdown-border: var(--aia-primitive-neutral-900-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-300);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a105);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-0);--aia-option-bg: var(--aia-primitive-blue-50);--aia-option-color: var(--aia-primitive-neutral-150);--aia-option-color-selected: var(--aia-primitive-neutral-0);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-0);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: var(--aia-primitive-neutral-0);--aia-submit-color: var(--aia-primitive-neutral-1000);--aia-color-text-muted: #6b7280;--aia-skeleton-bg: var(--aia-primitive-neutral-750-a25);--aia-streak-rgb: 99, 102, 241;--aia-footer-hint-color: var(--aia-primitive-neutral-500);--aia-footer-brand-color: var(--aia-primitive-neutral-700);--aia-footer-badge-border: var(--aia-primitive-neutral-750-a50)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: var(--aia-primitive-neutral-0);--aia-border: var(--aia-primitive-neutral-500);--aia-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 1px 2px rgba(0, 0, 0, .2), 0 8px 24px rgba(0, 0, 0, .25);--aia-dropdown-border: var(--aia-primitive-neutral-400-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-700);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a15);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-1000);--aia-option-bg: var(--aia-primitive-neutral-250);--aia-option-color: var(--aia-primitive-neutral-900);--aia-option-color-selected: var(--aia-primitive-neutral-1000);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-1000);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: var(--aia-primitive-neutral-1000);--aia-submit-color: var(--aia-primitive-neutral-0);--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: var(--aia-primitive-neutral-150);--aia-streak-rgb: 255, 255, 255;--aia-footer-hint-color: var(--aia-primitive-neutral-700);--aia-footer-brand-color: var(--aia-primitive-neutral-500);--aia-footer-badge-border: var(--aia-primitive-neutral-500)}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown],[data-aia-dropdown][data-options-position=above]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));transform-origin:50% 100%;top:auto;bottom:100%;margin-top:0;margin-bottom:6px}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack,[data-aia-dropdown][data-options-position=above] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer],[data-aia-dropdown][data-options-position=above] [data-aia-footer]{padding:0 0 var(--aia-footer-gap, 8px) 8px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer,[data-aia-dropdown][data-options-position=above] .magicx-aia-footer{flex-direction:column-reverse}@media (min-width: 769px){[data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before,:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{inset:0;background:var(--aia-surface, #ffffff)}}\n", ".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:544px;margin-top:6px;display:flex;flex-direction:column;box-sizing:border-box;padding:10px 8px;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transform-origin:50% 0;transform:scaleY(var(--aia-dropdown-reveal-scale, .02));transition:opacity .4s cubic-bezier(.4,0,.2,1),transform 0s .4s;background:var(--aia-surface, #ffffff);border:1px solid var(--aia-dropdown-border, rgba(231, 231, 231, .5));border-radius:18px;box-shadow:var(--aia-dropdown-shadow, 0 8px 12px rgba(0, 0, 0, .05))}.magicx-aia-dropdown:has([data-aia-datepicker]){max-width:var(--aia-date-panel-width, 312px)}.magicx-aia-dropdown[data-aia-surface=glass]{background:transparent;border-color:transparent;box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px)}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto;transform:scaleY(1);transition:opacity .1s cubic-bezier(.4,0,.2,1),transform .32s cubic-bezier(.22,1.28,.36,1)}.magicx-aia-scroll-arrow{position:absolute;left:50%;bottom:var(--aia-scroll-arrow-bottom, 8px);z-index:2;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 -16px;padding:0;border:1px solid var(--aia-scroll-arrow-border, var(--aia-dropdown-border, rgba(231, 231, 231, .5)));border-radius:50%;background:var(--aia-scroll-arrow-bg, var(--aia-surface, #ffffff));color:var( --aia-scroll-arrow-color, var(--aia-option-color, var(--aia-color-text-muted, #c1c4cb)) );box-shadow:var(--aia-scroll-arrow-shadow, 0 2px 8px rgba(0, 0, 0, .12));cursor:pointer;pointer-events:none;transform:translateY(calc(100% + var(--aia-scroll-arrow-bottom, 8px) + 4px));transition:transform .18s cubic-bezier(.4,0,.2,1)}.magicx-aia-scroll-arrow[data-aia-visible]{pointer-events:auto;transform:translateY(0)}.magicx-aia-scroll-arrow:hover{color:var( --aia-scroll-arrow-color-hover, var(--aia-option-color-selected, var(--aia-color-text-default, #fff)) )}@media (prefers-reduced-motion: reduce){.magicx-aia-scroll-arrow,.magicx-aia-dropdown{transition-duration:0s}}.magicx-aia-dropdown-pillbar{overflow:hidden}.magicx-aia-pill-scroll{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-pill-scroll::-webkit-scrollbar{display:none}.magicx-aia-skip{display:inline-flex;align-items:center;margin-inline-start:auto;flex-shrink:0;padding:5px 8px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:var(--aia-skip-font-size, 10px);line-height:18px;color:var(--aia-skip-color, var(--aia-footer-hint-color, #505050));cursor:pointer;white-space:nowrap;transition:color .15s ease-out,background-color .15s ease-out}.magicx-aia-skip:hover{color:var(--aia-skip-color-hover, var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb)));background:var(--aia-skip-hover-bg, var(--aia-option-bg, transparent))}.magicx-aia-skip:disabled{pointer-events:none;cursor:default;opacity:.5}.magicx-aia-footer{display:flex;flex-direction:column;gap:8px;padding:var(--aia-footer-gap, 8px) 0 0 8px;position:relative;z-index:3;pointer-events:none}.magicx-aia-footer-row{display:flex;align-items:center;justify-content:space-between}.magicx-aia-footer-hint-group{display:inline-flex;align-items:center;gap:5px}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{pointer-events:auto}.magicx-aia-footer-brand-link{display:inline-flex;align-items:center;gap:2px;text-decoration:none;cursor:pointer;transition:opacity .15s ease-out}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{background:var( --aia-footer-chip-bg, color-mix(in srgb, var(--aia-surface, #ffffff) 65%, transparent) );padding-inline:4px;border-radius:6px}.magicx-aia-footer-brand-link{background:var(--aia-footer-brand-pill-bg, var(--aia-surface, #ffffff));border-radius:999px;padding:2px 4px;gap:4px}.magicx-aia-footer-brand-link:hover{opacity:.7}.magicx-aia-footer-key{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:2px 6px;border:.5px solid var(--aia-footer-hint-color, #505050);border-radius:5px;font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-hint{font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-brand{font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}.magicx-aia-footer-badge{display:inline-flex;align-items:center;height:var(--aia-footer-row-height, 23px);padding:2.5px 5.5px;border:.5px solid var(--aia-footer-badge-border, rgba(189, 189, 189, .51));border-radius:999px;font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}@media (max-width: 768px){.magicx-aia-footer-hint-group{display:none}.magicx-aia-footer-row{justify-content:flex-end}}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:7px 8px}.magicx-aia-dropdown-skeleton-bar{display:block;height:14px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .25)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "component", type: PillListComponent, selector: "aia-pill-list", inputs: ["pills", "activePillIndex", "rounded", "loading", "activeSelected"], outputs: ["selectPill"] }, { kind: "component", type: ProductStripComponent, selector: "aia-product-strip", inputs: ["products", "listboxId", "focusable"], outputs: ["select", "focusChange"] }, { kind: "component", type: SuggestionGridComponent, selector: "aia-suggestion-grid", inputs: ["options", "activeIndex", "listboxId", "loading", "groupKey", "optionsPosition"], outputs: ["select", "highlight"] }, { kind: "component", type: DateGridComponent, selector: "aia-date-grid", inputs: ["options", "activeIndex", "listboxId", "view", "selectedIso"], outputs: ["select", "highlight", "previousMonth", "nextMonth"] }, { kind: "component", type: StackComponent, selector: "aia-stack", inputs: ["space", "align"] }, { kind: "component", type: ClusterComponent, selector: "aia-cluster", inputs: ["gap", "align", "justify", "noWrap", "inline"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
242
275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteDropdownComponent, decorators: [{
243
276
  type: Component,
244
277
  args: [{ selector: "ai-autocomplete-dropdown", standalone: true, imports: [
@@ -249,7 +282,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
249
282
  DateGridComponent,
250
283
  StackComponent,
251
284
  ClusterComponent,
252
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n *ngIf=\"vm$ | async as vm\"\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n [attr.data-mode]=\"resolvedMode\"\n [attr.data-options-position]=\"vm.optionsPosition\"\n [attr.data-aia-has-products]=\"vm.products.length > 0 ? '' : null\"\n [class]=\"rootClass\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n (mousedown)=\"preventBlur($event)\"\n>\n <aia-stack space=\"8px\">\n <aia-cluster\n *ngIf=\"vm.showsPills || vm.showsSkip\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n [noWrap]=\"true\"\n >\n <!-- The scroll + right-edge fade live on this wrapper (not the bar) so\n the skip button stays outside the masked region \u2014 pinned and fully\n opaque while overflowing pills fade under it. Absent in a skip-only\n row (pills rendered elsewhere via pillPlacement inline/hidden). -->\n <span *ngIf=\"vm.showsPills\" class=\"magicx-aia-pill-scroll\" data-aia-pill-scroll=\"\">\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"vm.isActivePillSelected\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </span>\n <button\n *ngIf=\"vm.showsSkip\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-skip\"\n data-aia-skip=\"\"\n [disabled]=\"vm.skipDisabled\"\n [attr.aria-label]=\"vm.activePillLabel ? 'Skip ' + vm.activePillLabel : 'Skip'\"\n (click)=\"onSkip()\"\n >\n skip\n </button>\n </aia-cluster>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n [groupKey]=\"vm.groupKey\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <aia-date-grid\n *ngIf=\"vm.showsDateGrid\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [view]=\"vm.dateView\"\n [selectedIso]=\"vm.selectedDateIso\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n (previousMonth)=\"onPreviousMonth()\"\n (nextMonth)=\"onNextMonth()\"\n ></aia-date-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n\n <!-- *ngIf, not just the section's own guard inside the component: the host\n element is an in-flow child of .aia-stack (display:flex; gap:8px), so\n an always-instantiated zero-height host would add a SECOND 8px gap\n between the grid and the footer \u2014 in every dropdown, products or not.\n The grid's --aia-grid-overlap-bottom is tuned for exactly one gap, so\n the footer would land 8px below the band it is meant to cover. -->\n <aia-product-strip\n *ngIf=\"vm.products.length > 0\"\n [products]=\"vm.products\"\n [listboxId]=\"controller.listboxId\"\n [focusable]=\"vm.isVisible\"\n (select)=\"onProductSelect($event)\"\n (focusChange)=\"onProductFocusChange($event)\"\n ></aia-product-strip>\n\n <footer class=\"magicx-aia-footer\" data-aia-footer=\"\">\n <div class=\"magicx-aia-footer-row\">\n <span class=\"magicx-aia-footer-hint-group\">\n <kbd class=\"magicx-aia-footer-key\">{{ vm.footerKey }}</kbd>\n <span class=\"magicx-aia-footer-hint\">{{ vm.footerHint }}</span>\n </span>\n <a\n class=\"magicx-aia-footer-brand-link\"\n [href]=\"brandHref\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"magicx-aia-footer-brand\">AI</span>\n <span class=\"magicx-aia-footer-badge\">Autocomplete</span>\n </a>\n </div>\n </footer>\n </aia-stack>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia){--aia-primitive-neutral-0: #000000;--aia-primitive-neutral-150: #1a1b1d;--aia-primitive-neutral-250: #323232;--aia-primitive-neutral-300: #333539;--aia-primitive-neutral-400: #4a4a4a;--aia-primitive-neutral-500: #505050;--aia-primitive-neutral-700: #b0b0b0;--aia-primitive-neutral-750: #bdbdbd;--aia-primitive-neutral-900: #e7e7e7;--aia-primitive-neutral-1000: #ffffff;--aia-primitive-blue-50: #eef2ff;--aia-primitive-neutral-750-a50: rgba(189, 189, 189, .51);--aia-primitive-neutral-750-a25: rgba(189, 189, 189, .25);--aia-primitive-neutral-750-a35: rgba(189, 189, 189, .35);--aia-primitive-neutral-750-a30: rgba(189, 189, 189, .3);--aia-primitive-neutral-750-a15: rgba(189, 189, 189, .15);--aia-primitive-neutral-750-a105: rgba(189, 189, 189, .105);--aia-primitive-neutral-700-a40: rgba(176, 176, 176, .4);--aia-primitive-neutral-900-a50: rgba(231, 231, 231, .5);--aia-primitive-neutral-400-a50: rgba(74, 74, 74, .5)}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: var(--aia-primitive-neutral-1000);--aia-border: var(--aia-primitive-neutral-700);--aia-dropdown-border: var(--aia-primitive-neutral-900-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-300);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a105);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-0);--aia-option-bg: var(--aia-primitive-blue-50);--aia-option-color: var(--aia-primitive-neutral-150);--aia-option-color-selected: var(--aia-primitive-neutral-0);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-0);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: var(--aia-primitive-neutral-0);--aia-submit-color: var(--aia-primitive-neutral-1000);--aia-color-text-muted: #6b7280;--aia-skeleton-bg: var(--aia-primitive-neutral-750-a25);--aia-streak-rgb: 99, 102, 241;--aia-streak-glass-bg: rgba(99, 102, 241, .1);--aia-footer-hint-color: var(--aia-primitive-neutral-500);--aia-footer-brand-color: var(--aia-primitive-neutral-700);--aia-footer-badge-border: var(--aia-primitive-neutral-750-a50)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: var(--aia-primitive-neutral-0);--aia-border: var(--aia-primitive-neutral-500);--aia-dropdown-border: var(--aia-primitive-neutral-400-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-700);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a15);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-1000);--aia-option-bg: var(--aia-primitive-neutral-250);--aia-option-color: var(--aia-primitive-neutral-900);--aia-option-color-selected: var(--aia-primitive-neutral-1000);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-1000);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: var(--aia-primitive-neutral-1000);--aia-submit-color: var(--aia-primitive-neutral-0);--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: var(--aia-primitive-neutral-150);--aia-streak-rgb: 255, 255, 255;--aia-streak-glass-bg: rgba(255, 255, 255, .1);--aia-footer-hint-color: var(--aia-primitive-neutral-700);--aia-footer-brand-color: var(--aia-primitive-neutral-500);--aia-footer-badge-border: var(--aia-primitive-neutral-500)}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown],[data-aia-dropdown][data-options-position=above]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));top:auto;bottom:100%;margin-top:0;margin-bottom:6px}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack,[data-aia-dropdown][data-options-position=above] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer],[data-aia-dropdown][data-options-position=above] [data-aia-footer]{padding:0 8px var(--aia-footer-gap, 8px)}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer,[data-aia-dropdown][data-options-position=above] .magicx-aia-footer{flex-direction:column-reverse}\n", ".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:544px;margin-top:6px;display:flex;flex-direction:column;box-sizing:border-box;padding:10px 8px;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transition:opacity .4s cubic-bezier(.4,0,.2,1);background:var(--aia-surface, #ffffff);border:1px solid var(--aia-dropdown-border, rgba(231, 231, 231, .5));border-radius:18px;box-shadow:var(--aia-dropdown-shadow, 0 8px 12px rgba(0, 0, 0, .05))}.magicx-aia-dropdown[data-aia-surface=glass]{background:transparent;border-color:transparent;box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px)}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto}.magicx-aia-dropdown-pillbar{overflow:hidden}.magicx-aia-pill-scroll{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-pill-scroll::-webkit-scrollbar{display:none}.magicx-aia-skip{display:inline-flex;align-items:center;margin-inline-start:auto;flex-shrink:0;padding:5px 8px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:var(--aia-skip-font-size, 10px);line-height:18px;color:var(--aia-skip-color, var(--aia-footer-hint-color, #505050));cursor:pointer;white-space:nowrap;transition:color .15s ease-out,background-color .15s ease-out}.magicx-aia-skip:hover{color:var(--aia-skip-color-hover, var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb)));background:var(--aia-skip-hover-bg, var(--aia-option-bg, transparent))}.magicx-aia-skip:disabled{pointer-events:none;cursor:default;opacity:.5}.magicx-aia-footer{display:flex;flex-direction:column;gap:8px;padding:var(--aia-footer-gap, 8px) 8px 0;position:relative;z-index:3;pointer-events:none}.magicx-aia-footer-row{display:flex;align-items:center;justify-content:space-between}.magicx-aia-footer-hint-group{display:inline-flex;align-items:center;gap:5px}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{pointer-events:auto}.magicx-aia-footer-brand-link{display:inline-flex;align-items:center;gap:2px;text-decoration:none;cursor:pointer;transition:opacity .15s ease-out}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{background:var( --aia-footer-chip-bg, color-mix(in srgb, var(--aia-surface, #ffffff) 65%, transparent) );padding-inline:4px;border-radius:6px}.magicx-aia-footer-brand-link{background:var(--aia-footer-brand-pill-bg, var(--aia-surface, #ffffff));border-radius:999px;padding:2px 7px;gap:4px}.magicx-aia-footer-brand-link:hover{opacity:.7}.magicx-aia-footer-key{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:2px 6px;border:.5px solid var(--aia-footer-hint-color, #505050);border-radius:5px;font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-hint{font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-brand{font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}.magicx-aia-footer-badge{display:inline-flex;align-items:center;height:var(--aia-footer-row-height, 23px);padding:2.5px 5.5px;border:.5px solid var(--aia-footer-badge-border, rgba(189, 189, 189, .51));border-radius:999px;font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}@media (max-width: 768px){.magicx-aia-footer-hint-group{display:none}.magicx-aia-footer-row{justify-content:flex-end}}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:7px 8px}.magicx-aia-dropdown-skeleton-bar{display:block;height:14px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .25)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"] }]
285
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div\n *ngIf=\"vm$ | async as vm\"\n #dropdownRoot\n [id]=\"controller.listboxId\"\n role=\"listbox\"\n data-aia-dropdown=\"\"\n [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n [attr.data-mode]=\"resolvedMode\"\n [attr.data-options-position]=\"vm.optionsPosition\"\n [attr.data-aia-has-products]=\"vm.products.length > 0 ? '' : null\"\n [class]=\"rootClass\"\n [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n (mousedown)=\"preventBlur($event)\"\n>\n <aia-stack space=\"8px\">\n <aia-cluster\n *ngIf=\"vm.showsPills || vm.showsSkip\"\n class=\"magicx-aia-dropdown-pillbar\"\n data-aia-pillbar=\"\"\n [noWrap]=\"true\"\n >\n <!-- The scroll + right-edge fade live on this wrapper (not the bar) so\n the skip button stays outside the masked region \u2014 pinned and fully\n opaque while overflowing pills fade under it. Absent in a skip-only\n row (pills rendered elsewhere via pillPlacement inline/hidden). -->\n <span *ngIf=\"vm.showsPills\" class=\"magicx-aia-pill-scroll\" data-aia-pill-scroll=\"\">\n <aia-pill-list\n [pills]=\"vm.pills\"\n [activePillIndex]=\"0\"\n [activeSelected]=\"vm.isActivePillSelected\"\n [rounded]=\"true\"\n [loading]=\"vm.isLoading\"\n (selectPill)=\"onPillClick($event)\"\n ></aia-pill-list>\n </span>\n <button\n *ngIf=\"vm.showsSkip\"\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-skip\"\n data-aia-skip=\"\"\n [disabled]=\"vm.skipDisabled\"\n [attr.aria-label]=\"vm.activePillLabel ? 'Skip ' + vm.activePillLabel : 'Skip'\"\n (click)=\"onSkip()\"\n >\n skip\n </button>\n </aia-cluster>\n\n <aia-suggestion-grid\n *ngIf=\"vm.showsOptions\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [loading]=\"vm.isLoading\"\n [groupKey]=\"vm.groupKey\"\n [optionsPosition]=\"vm.optionsPosition\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n ></aia-suggestion-grid>\n\n <aia-date-grid\n *ngIf=\"vm.showsDateGrid\"\n [options]=\"vm.options\"\n [activeIndex]=\"vm.activeIndex\"\n [listboxId]=\"controller.listboxId\"\n [view]=\"vm.dateView\"\n [selectedIso]=\"vm.selectedDateIso\"\n (select)=\"onSelect($event)\"\n (highlight)=\"onHighlight($event)\"\n (previousMonth)=\"onPreviousMonth()\"\n (nextMonth)=\"onNextMonth()\"\n ></aia-date-grid>\n\n <div\n *ngIf=\"vm.showsFallbackSkeleton\"\n class=\"magicx-aia-dropdown-skeleton-bars\"\n data-aia-skeleton-bars=\"\"\n >\n <span\n *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n class=\"magicx-aia-dropdown-skeleton-bar\"\n [style.width.px]=\"w\"\n ></span>\n </div>\n\n <!-- *ngIf, not just the section's own guard inside the component: the host\n element is an in-flow child of .aia-stack (display:flex; gap:8px), so\n an always-instantiated zero-height host would add a SECOND 8px gap\n between the grid and the footer \u2014 in every dropdown, products or not.\n The grid's --aia-grid-overlap-bottom is tuned for exactly one gap, so\n the footer would land 8px below the band it is meant to cover. -->\n <aia-product-strip\n *ngIf=\"vm.products.length > 0\"\n [products]=\"vm.products\"\n [listboxId]=\"controller.listboxId\"\n [focusable]=\"vm.isVisible\"\n (select)=\"onProductSelect($event)\"\n (focusChange)=\"onProductFocusChange($event)\"\n ></aia-product-strip>\n\n <footer class=\"magicx-aia-footer\" data-aia-footer=\"\">\n <div class=\"magicx-aia-footer-row\">\n <span class=\"magicx-aia-footer-hint-group\">\n <kbd class=\"magicx-aia-footer-key\">{{ vm.footerKey }}</kbd>\n <span class=\"magicx-aia-footer-hint\">{{ vm.footerHint }}</span>\n </span>\n <a\n class=\"magicx-aia-footer-brand-link\"\n [href]=\"brandHref\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span class=\"magicx-aia-footer-brand\">AI</span>\n <span class=\"magicx-aia-footer-badge\">Autocomplete</span>\n </a>\n </div>\n </footer>\n </aia-stack>\n <!-- \"More below\" arrow \u2014 an overlay on the panel, not a section of the\n stack. Shown/positioned by the core's scroll-arrow controller (see\n syncScrollArrow); markup mirrors vanilla's createScrollArrowButton. -->\n <button\n #scrollArrow\n type=\"button\"\n tabindex=\"-1\"\n class=\"magicx-aia-scroll-arrow\"\n data-aia-scroll-arrow=\"\"\n [attr.aria-label]=\"scrollArrowLabel\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M4 6.5 8 10.5l4-4\" />\n </svg>\n </button>\n</div>\n", styles: [":where(.magicx-aia,.magicx-aia *,.magicx-aia *::before,.magicx-aia *::after){box-sizing:border-box}:where(.magicx-aia){--aia-primitive-neutral-0: #000000;--aia-primitive-neutral-150: #1a1b1d;--aia-primitive-neutral-250: #323232;--aia-primitive-neutral-300: #333539;--aia-primitive-neutral-400: #4a4a4a;--aia-primitive-neutral-500: #505050;--aia-primitive-neutral-700: #b0b0b0;--aia-primitive-neutral-750: #bdbdbd;--aia-primitive-neutral-900: #e7e7e7;--aia-primitive-neutral-1000: #ffffff;--aia-primitive-blue-50: #eef2ff;--aia-primitive-neutral-750-a50: rgba(189, 189, 189, .51);--aia-primitive-neutral-750-a25: rgba(189, 189, 189, .25);--aia-primitive-neutral-750-a35: rgba(189, 189, 189, .35);--aia-primitive-neutral-750-a30: rgba(189, 189, 189, .3);--aia-primitive-neutral-750-a15: rgba(189, 189, 189, .15);--aia-primitive-neutral-750-a105: rgba(189, 189, 189, .105);--aia-primitive-neutral-700-a40: rgba(176, 176, 176, .4);--aia-primitive-neutral-900-a50: rgba(231, 231, 231, .5);--aia-primitive-neutral-400-a50: rgba(74, 74, 74, .5)}:where(.magicx-aia),:where(.magicx-aia[data-mode=\"light\"]){--aia-surface: var(--aia-primitive-neutral-1000);--aia-border: var(--aia-primitive-neutral-700);--aia-shadow: inset 0 1px 0 rgba(255, 255, 255, .9), 0 1px 2px rgba(16, 24, 40, .05), 0 8px 24px rgba(16, 24, 40, .08);--aia-dropdown-border: var(--aia-primitive-neutral-900-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-300);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a105);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-0);--aia-option-bg: var(--aia-primitive-blue-50);--aia-option-color: var(--aia-primitive-neutral-150);--aia-option-color-selected: var(--aia-primitive-neutral-0);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-0);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #000000);--aia-submit-bg: var(--aia-primitive-neutral-0);--aia-submit-color: var(--aia-primitive-neutral-1000);--aia-color-text-muted: #6b7280;--aia-skeleton-bg: var(--aia-primitive-neutral-750-a25);--aia-streak-rgb: 99, 102, 241;--aia-footer-hint-color: var(--aia-primitive-neutral-500);--aia-footer-brand-color: var(--aia-primitive-neutral-700);--aia-footer-badge-border: var(--aia-primitive-neutral-750-a50)}:where(.magicx-aia[data-mode=\"dark\"]){--aia-surface: var(--aia-primitive-neutral-0);--aia-border: var(--aia-primitive-neutral-500);--aia-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 1px 2px rgba(0, 0, 0, .2), 0 8px 24px rgba(0, 0, 0, .25);--aia-dropdown-border: var(--aia-primitive-neutral-400-a50);--aia-dropdown-shadow: 0 8px 12px rgba(0, 0, 0, .05);--aia-pill-bg: var(--aia-primitive-neutral-750);--aia-pill-color: var(--aia-primitive-neutral-700);--aia-pill-font-size: 16px;--aia-completed-pill-bg: var(--aia-primitive-neutral-750-a15);--aia-completed-pill-bg-active: var(--aia-primitive-neutral-750-a35);--aia-completed-pill-color: var(--aia-primitive-neutral-1000);--aia-option-bg: var(--aia-primitive-neutral-250);--aia-option-color: var(--aia-primitive-neutral-900);--aia-option-color-selected: var(--aia-primitive-neutral-1000);--aia-option-font-size: 16px;--aia-written-text-color: var(--aia-primitive-neutral-1000);--aia-written-text-font-size: 16px;--aia-caret-color: var(--aia-written-text-color, #ffffff);--aia-submit-bg: var(--aia-primitive-neutral-1000);--aia-submit-color: var(--aia-primitive-neutral-0);--aia-color-text-muted: #c1c4cb;--aia-skeleton-bg: var(--aia-primitive-neutral-150);--aia-streak-rgb: 255, 255, 255;--aia-footer-hint-color: var(--aia-primitive-neutral-700);--aia-footer-brand-color: var(--aia-primitive-neutral-500);--aia-footer-badge-border: var(--aia-primitive-neutral-500)}[data-aia-dropdown]{--aia-footer-row-height: 23px;--aia-footer-band: calc(var(--aia-footer-gap, 8px) + var(--aia-footer-row-height, 23px));--aia-grid-scroll-bottom: var(--aia-footer-band);--aia-grid-overlap-bottom: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-lead: 20px;--aia-footer-fade-inset: calc(-1 * var(--aia-footer-fade-lead)) 0 0}[data-aia-dropdown] [data-aia-pillbar] .aia-pill-list{padding-inline:10px}[data-aia-dropdown] [data-aia-pillbar] .aia-pill{justify-content:flex-start;border-inline-width:0;padding-inline:0}[data-aia-dropdown] .aia-grid[data-scroll]{padding-top:var(--aia-grid-scroll-top, 0);padding-bottom:var(--aia-grid-scroll-bottom, 0);margin-top:var(--aia-grid-overlap-top, 0);margin-bottom:var(--aia-grid-overlap-bottom, 0)}[data-aia-dropdown] [data-aia-footer]:before{content:\"\";position:absolute;inset:var(--aia-footer-fade-inset, -20px 0 0);z-index:-1;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--aia-surface, #ffffff))}[data-aia-dropdown][data-aia-surface=glass]{--aia-footer-chip-bg: transparent}[data-aia-dropdown][data-aia-surface=glass] [data-aia-footer]:before{display:none}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown],[data-aia-dropdown][data-options-position=above]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: var(--aia-footer-band);--aia-grid-overlap-top: calc(-1 * (var(--aia-footer-band) + 8px));--aia-footer-fade-inset: 0 0 calc(-1 * var(--aia-footer-fade-lead));transform-origin:50% 100%;top:auto;bottom:100%;margin-top:0;margin-bottom:6px}[data-aia-dropdown][data-aia-has-products]{--aia-grid-scroll-bottom: 0px;--aia-grid-overlap-bottom: 0px;--aia-grid-scroll-top: 0px;--aia-grid-overlap-top: 0px;--aia-footer-fade-lead: 0px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .aia-stack,[data-aia-dropdown][data-options-position=above] .aia-stack{flex-direction:column-reverse}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer],[data-aia-dropdown][data-options-position=above] [data-aia-footer]{padding:0 0 var(--aia-footer-gap, 8px) 8px}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before{background:linear-gradient(to top,transparent,var(--aia-surface, #ffffff))}:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] .magicx-aia-footer,[data-aia-dropdown][data-options-position=above] .magicx-aia-footer{flex-direction:column-reverse}@media (min-width: 769px){[data-aia-dropdown] [data-aia-footer]:before,[data-aia-dropdown][data-options-position=above] [data-aia-footer]:before,:where(.magicx-aia[data-options-position=\"above\"]) [data-aia-dropdown] [data-aia-footer]:before{inset:0;background:var(--aia-surface, #ffffff)}}\n", ".magicx-aia-dropdown{position:absolute;left:0;right:0;top:100%;max-width:544px;margin-top:6px;display:flex;flex-direction:column;box-sizing:border-box;padding:10px 8px;overflow:hidden;container-type:inline-size;z-index:10;opacity:0;pointer-events:none;transform-origin:50% 0;transform:scaleY(var(--aia-dropdown-reveal-scale, .02));transition:opacity .4s cubic-bezier(.4,0,.2,1),transform 0s .4s;background:var(--aia-surface, #ffffff);border:1px solid var(--aia-dropdown-border, rgba(231, 231, 231, .5));border-radius:18px;box-shadow:var(--aia-dropdown-shadow, 0 8px 12px rgba(0, 0, 0, .05))}.magicx-aia-dropdown:has([data-aia-datepicker]){max-width:var(--aia-date-panel-width, 312px)}.magicx-aia-dropdown[data-aia-surface=glass]{background:transparent;border-color:transparent;box-shadow:#fff -3.2px -3.2px 3.2px -3.2px inset,#fff 6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) -6.4px 6.4px 1.6px -8px inset,var(--aia-dropdown-bg, transparent) 6.4px -6.4px 1.6px -8px inset,#ffffff26 -1.6px 0 0 -1.6px inset,#ffffff26 0 -1.6px 0 -1.6px inset,#ffffff4d 0 1.6px inset,#ffffff4d 1.6px 0 inset,inset 0 0 30px 5px #0000000d,#00000014 0 0 30px 2px;backdrop-filter:blur(30px)}.magicx-aia-dropdown-visible{opacity:1;pointer-events:auto;transform:scaleY(1);transition:opacity .1s cubic-bezier(.4,0,.2,1),transform .32s cubic-bezier(.22,1.28,.36,1)}.magicx-aia-scroll-arrow{position:absolute;left:50%;bottom:var(--aia-scroll-arrow-bottom, 8px);z-index:2;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 -16px;padding:0;border:1px solid var(--aia-scroll-arrow-border, var(--aia-dropdown-border, rgba(231, 231, 231, .5)));border-radius:50%;background:var(--aia-scroll-arrow-bg, var(--aia-surface, #ffffff));color:var( --aia-scroll-arrow-color, var(--aia-option-color, var(--aia-color-text-muted, #c1c4cb)) );box-shadow:var(--aia-scroll-arrow-shadow, 0 2px 8px rgba(0, 0, 0, .12));cursor:pointer;pointer-events:none;transform:translateY(calc(100% + var(--aia-scroll-arrow-bottom, 8px) + 4px));transition:transform .18s cubic-bezier(.4,0,.2,1)}.magicx-aia-scroll-arrow[data-aia-visible]{pointer-events:auto;transform:translateY(0)}.magicx-aia-scroll-arrow:hover{color:var( --aia-scroll-arrow-color-hover, var(--aia-option-color-selected, var(--aia-color-text-default, #fff)) )}@media (prefers-reduced-motion: reduce){.magicx-aia-scroll-arrow,.magicx-aia-dropdown{transition-duration:0s}}.magicx-aia-dropdown-pillbar{overflow:hidden}.magicx-aia-pill-scroll{display:inline-flex;align-items:center;flex:1 1 auto;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 48px),transparent 100%)}.magicx-aia-pill-scroll::-webkit-scrollbar{display:none}.magicx-aia-skip{display:inline-flex;align-items:center;margin-inline-start:auto;flex-shrink:0;padding:5px 8px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:var(--aia-skip-font-size, 10px);line-height:18px;color:var(--aia-skip-color, var(--aia-footer-hint-color, #505050));cursor:pointer;white-space:nowrap;transition:color .15s ease-out,background-color .15s ease-out}.magicx-aia-skip:hover{color:var(--aia-skip-color-hover, var(--aia-pill-color, var(--aia-color-text-muted, #c1c4cb)));background:var(--aia-skip-hover-bg, var(--aia-option-bg, transparent))}.magicx-aia-skip:disabled{pointer-events:none;cursor:default;opacity:.5}.magicx-aia-footer{display:flex;flex-direction:column;gap:8px;padding:var(--aia-footer-gap, 8px) 0 0 8px;position:relative;z-index:3;pointer-events:none}.magicx-aia-footer-row{display:flex;align-items:center;justify-content:space-between}.magicx-aia-footer-hint-group{display:inline-flex;align-items:center;gap:5px}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{pointer-events:auto}.magicx-aia-footer-brand-link{display:inline-flex;align-items:center;gap:2px;text-decoration:none;cursor:pointer;transition:opacity .15s ease-out}.magicx-aia-footer-hint-group,.magicx-aia-footer-brand-link{background:var( --aia-footer-chip-bg, color-mix(in srgb, var(--aia-surface, #ffffff) 65%, transparent) );padding-inline:4px;border-radius:6px}.magicx-aia-footer-brand-link{background:var(--aia-footer-brand-pill-bg, var(--aia-surface, #ffffff));border-radius:999px;padding:2px 4px;gap:4px}.magicx-aia-footer-brand-link:hover{opacity:.7}.magicx-aia-footer-key{display:inline-flex;align-items:center;justify-content:center;min-width:30px;height:22px;padding:2px 6px;border:.5px solid var(--aia-footer-hint-color, #505050);border-radius:5px;font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-hint{font-family:inherit;font-size:11px;line-height:18px;color:var(--aia-footer-hint-color, #505050)}.magicx-aia-footer-brand{font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}.magicx-aia-footer-badge{display:inline-flex;align-items:center;height:var(--aia-footer-row-height, 23px);padding:2.5px 5.5px;border:.5px solid var(--aia-footer-badge-border, rgba(189, 189, 189, .51));border-radius:999px;font-family:inherit;font-size:10px;line-height:18px;color:var(--aia-footer-brand-color, #b0b0b0)}@media (max-width: 768px){.magicx-aia-footer-hint-group{display:none}.magicx-aia-footer-row{justify-content:flex-end}}.magicx-aia-dropdown-skeleton-bars{display:flex;flex-direction:column;gap:20px;padding:7px 8px}.magicx-aia-dropdown-skeleton-bar{display:block;height:14px;border-radius:999px;background:var(--aia-skeleton-bg, var(--aia-pill-bg, rgba(189, 189, 189, .25)));opacity:.5;animation:aiaDropdownSkeletonPulse 1.4s ease-in-out infinite}.magicx-aia-dropdown-skeleton-bar:nth-child(2){animation-delay:.15s}.magicx-aia-dropdown-skeleton-bar:nth-child(3){animation-delay:.3s}@keyframes aiaDropdownSkeletonPulse{0%,to{opacity:.5}50%{opacity:.25}}\n"] }]
253
286
  }], propDecorators: { controller: [{
254
287
  type: Input
255
288
  }], showPills: [{
@@ -260,5 +293,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
260
293
  type: Input
261
294
  }], mode: [{
262
295
  type: Input
296
+ }], dropdownRootRef: [{
297
+ type: ViewChild,
298
+ args: ["dropdownRoot", { static: false }]
299
+ }], scrollArrowRef: [{
300
+ type: ViewChild,
301
+ args: ["scrollArrow", { static: false }]
263
302
  }] } });
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUtOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsbUJBQW1CLEVBRW5CLGFBQWEsR0FJZCxNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFtQixNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7QUF1Q2hHOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBcUJILE1BQU0sT0FBTywrQkFBK0I7SUFwQjVD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QUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFnQjtRQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsT0FBZ0I7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZO1FBQ3RCLDJFQUEyRTtRQUMzRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7NkhBdFFVLCtCQUErQjtpSEFBL0IsK0JBQStCLCtPQ3hHNUMscXlJQXNIQSwydVZEOUJJLFlBQVkscVRBQ1osaUJBQWlCLGlLQUNqQixxQkFBcUIsa0pBQ3JCLHVCQUF1QiwwS0FDdkIsaUJBQWlCLGtNQUNqQixjQUFjLGtGQUNkLGdCQUFnQjs0RkFVUCwrQkFBK0I7a0JBcEIzQyxTQUFTOytCQUNFLDBCQUEwQixjQUN4QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3dCQUN2QixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsZ0JBQWdCO3FCQUNqQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs4QkFTNUIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQVNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIGluamVjdCxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXBwZWFyYW5jZU1vZGUsXG4gIGJ1aWxkQXR0cmlidXRpb25VcmwsXG4gIHR5cGUgRGF0ZU1vbnRoVmlldyxcbiAgZ2V0Rm9vdGVySGludCxcbiAgdHlwZSBQcm9kdWN0LFxuICB0eXBlIFN1Z2dlc3Rpb24sXG4gIHR5cGUgU3VnZ2VzdGlvbk9wdGlvbixcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIHR5cGUgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERhdGVHcmlkQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL2RhdGUtZ3JpZC9kYXRlLWdyaWQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDbHVzdGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL2xheW91dC9jbHVzdGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgU3RhY2tDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvbGF5b3V0L3N0YWNrLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFByb2R1Y3RTdHJpcENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9wcm9kdWN0LXN0cmlwL3Byb2R1Y3Qtc3RyaXAuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uR3JpZENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWdnZXN0aW9uLWdyaWQvc3VnZ2VzdGlvbi1ncmlkLmNvbXBvbmVudFwiO1xuXG5pbnRlcmZhY2UgRHJvcGRvd25WbSB7XG4gIHBpbGxzOiBTdWdnZXN0aW9uW107XG4gIG9wdGlvbnM6IFN1Z2dlc3Rpb25PcHRpb25bXTtcbiAgYWN0aXZlSW5kZXg6IG51bWJlcjtcbiAgaXNBY3RpdmVQaWxsU2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgc2hvd3NQaWxsczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHBpbGxiYXIgZW5kcyBpbiB0aGUgdHJhaWxpbmcgXCJza2lwXCIgYnV0dG9uLiAqL1xuICBzaG93c1NraXA6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEaXNhYmxlZCBzdGF0ZSBmb3IgdGhlIHNraXAgYnV0dG9uOiBsb2FkaW5nLCBvciB0aGUgcG9zdC1zZWxlY3Rpb24gd2luZG93XG4gICAqIHdoZXJlIGlzTG9hZGluZyBpcyBzdXBwcmVzc2VkIGJ1dCB0aGUgY29yZSdzIHNraXBBY3RpdmVQaWxsKCkgbm8tb3BzLlxuICAgKi9cbiAgc2tpcERpc2FibGVkOiBib29sZWFuO1xuICAvKiogQWN0aXZlIHBpbGwncyBsYWJlbCwgZm9yIHRoZSBza2lwIGJ1dHRvbidzIGFyaWEtbGFiZWwuICovXG4gIGFjdGl2ZVBpbGxMYWJlbDogc3RyaW5nO1xuICBzaG93c09wdGlvbnM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBib2R5IHJlbmRlcnMgaW4gcGxhY2Ugb2YgdGhlIG9wdGlvbnMgZ3JpZC4gKi9cbiAgc2hvd3NEYXRlR3JpZDogYm9vbGVhbjtcbiAgLyoqIFRoZSBtb250aCB0aGUgY2FsZW5kYXIgc2hvd3MuIE51bGwgdW5sZXNzIGBzaG93c0RhdGVHcmlkYC4gKi9cbiAgZGF0ZVZpZXc6IERhdGVNb250aFZpZXcgfCBudWxsO1xuICAvKiogYFlZWVktTU0tRERgIHRoZSBwYXJhbSBiZWluZyByZS1lZGl0ZWQgYWxyZWFkeSBob2xkcywgb3IgbnVsbC4gKi9cbiAgc2VsZWN0ZWREYXRlSXNvOiBzdHJpbmcgfCBudWxsO1xuICBzaG93c0ZhbGxiYWNrU2tlbGV0b246IGJvb2xlYW47XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqIFByb2R1Y3QgY2FyZHMgZm9yIHRoZSBzdHJpcC4gRW1wdHkgdW5sZXNzIGBwcm9kdWN0c2AgaXMgY29uZmlndXJlZC4gKi9cbiAgcHJvZHVjdHM6IFByb2R1Y3RbXTtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzdWdnZXN0aW9uIHRoZSBvcHRpb25zIGJlbG9uZyB0byDigJQgZHJpdmVzIHRoZSBncmlkJ3Mgc2Nyb2xsIHJlc2V0LiAqL1xuICBncm91cEtleTogc3RyaW5nO1xuICBmb290ZXJLZXk6IHN0cmluZztcbiAgZm9vdGVySGludDogc3RyaW5nO1xuICBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIjtcbn1cblxuLyoqIFRoZSBjb250ZW50LWJlYXJpbmcgZmllbGRzIG9mIHRoZSB2aWV3LW1vZGVsIChldmVyeXRoaW5nIGJ1dCBgaXNWaXNpYmxlYCkuICovXG50eXBlIERyb3Bkb3duQ29udGVudCA9IE9taXQ8RHJvcGRvd25WbSwgXCJpc1Zpc2libGVcIj47XG5cbi8qKlxuICogVGllciAyIGRyb3Bkb3duIGNvbXBvbmVudCDigJQgdGhlIEFuZ3VsYXIgZXF1aXZhbGVudCBvZiBSZWFjdCdzXG4gKiBgPEFJQXV0b2NvbXBsZXRlRHJvcGRvd24gLz5gLiBSZW5kZXJzIHRoZSBwaWxsYmFyLCBvcHRpb25zIGdyaWQsIGFuZFxuICogbG9hZGluZyBza2VsZXRvbiBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgY29udHJvbGxlcidzIGBkcm9wZG93biRgIHNuYXBzaG90LlxuICpcbiAqIGBgYGh0bWxcbiAqIDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd24gW2NvbnRyb2xsZXJdPVwiYWNcIj48L2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bj5cbiAqIGBgYFxuICpcbiAqIEFsbCBhY3Rpb25zIChwaWxsIGNsaWNrLCBvcHRpb24gc2VsZWN0LCBvcHRpb24gaGlnaGxpZ2h0KSBhcmUgZm9yd2FyZGVkIHRvXG4gKiB0aGUgY29udHJvbGxlci4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIG9ic2VydmUgdGhlc2UgZXZlbnRzIGNhbiBzdWJzY3JpYmVcbiAqIHRvIHRoZSBjb250cm9sbGVyJ3MgcGVyLWZpZWxkIG9ic2VydmFibGVzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFpLWF1dG9jb21wbGV0ZS1kcm9wZG93blwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFBpbGxMaXN0Q29tcG9uZW50LFxuICAgIFByb2R1Y3RTdHJpcENvbXBvbmVudCxcbiAgICBTdWdnZXN0aW9uR3JpZENvbXBvbmVudCxcbiAgICBEYXRlR3JpZENvbXBvbmVudCxcbiAgICBTdGFja0NvbXBvbmVudCxcbiAgICBDbHVzdGVyQ29tcG9uZW50LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGVVcmw6IFwiLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWxcIixcbiAgLy8gVGhlIHNoYXJlZCBhcHBlYXJhbmNlIGxheWVyIGNhcnJpZXMgdGhlIGRlc2lnbiB0b2tlbnMgKyBib3gtc2l6aW5nIHJlc2V0ICtcbiAgLy8gb3B0aW9uc1Bvc2l0aW9uIHJldmVyc2FsLCBzbyBhIHN0YW5kYWxvbmUgZHJvcGRvd24gKG5vIFRpZXIgMSBjb21wb25lbnQgb25cbiAgLy8gdGhlIHBhZ2UpIGlzIGZ1bGx5IHN0eWxlZCBvbmNlIGBtb2RlYCBpcyBzZXQuXG4gIHN0eWxlVXJsczogW1wiLi4vc2hhcmVkL2FwcGVhcmFuY2UuY3NzXCIsIFwiLi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIGNvbnRyb2xsZXIgdGhhdCBvd25zIHRoZSBhdXRvY29tcGxldGUgc3RhdGUuIFJlcXVpcmVkLiAqL1xuICBASW5wdXQoKSBjb250cm9sbGVyITogQUlBdXRvY29tcGxldGVDb250cm9sbGVyO1xuICAvKiogV2hldGhlciB0byByZW5kZXIgdGhlIHBpbGxiYXIgYWJvdmUgdGhlIG9wdGlvbnMgZ3JpZC4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2hvd1BpbGxzID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpbGxiYXIgZW5kcyBpbiBhIHNtYWxsIFwic2tpcFwiIGJ1dHRvbiB0aGF0IGRpc21pc3NlcyB0aGVcbiAgICogYWN0aXZlIHBpbGwg4oCUIHNhbWUgYWN0aW9uIGFzIHByZXNzaW5nIOKGkiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gSXQgc2l0c1xuICAgKiBhdCB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYmFyOiB2aXN1YWxseSB0b3AtcmlnaHQgd2hlbiB0aGUgZHJvcGRvd25cbiAgICogb3BlbnMgYmVsb3cgdGhlIGlucHV0LCBib3R0b20tcmlnaHQgd2hlbiBgb3B0aW9uc1Bvc2l0aW9uYCBpcyBcImFib3ZlXCIuXG4gICAqIERlZmF1bHQ6IHRydWUuIEhpZGRlbiBhdXRvbWF0aWNhbGx5IGR1cmluZyByZS1lZGl0IGFuZCB3aGlsZSB0aGUgZmFsbGJhY2tcbiAgICogc2tlbGV0b24gcmVuZGVycy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTa2lwQnV0dG9uID0gdHJ1ZTtcbiAgLyoqIE9wdGlvbmFsIENTUyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBkcm9wZG93biByb290LiAqL1xuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb2xvciBtb2RlIGZvciBhIHN0YW5kYWxvbmUgZHJvcGRvd24uIFdoZW4gc2V0LCB0aGUgZHJvcGRvd24gc2VsZi1zY29wZXMgdGhlXG4gICAqIGRlc2lnbiB0b2tlbnMgdG8gaXRzIG93biByb290IChhZGRzIGBtYWdpY3gtYWlhYCArIGBkYXRhLW1vZGVgKSwgc28gaXQgbmVlZHNcbiAgICogbm8gYC5tYWdpY3gtYWlhYCB3cmFwcGVyLiBgXCJhdXRvXCJgIGZvbGxvd3MgYHByZWZlcnMtY29sb3Itc2NoZW1lYC4gTGVhdmUgaXRcbiAgICogdW5zZXQgd2hlbiB0aGUgZHJvcGRvd24gc2l0cyBpbnNpZGUgYSBgLm1hZ2ljeC1haWFgIGFuY2VzdG9yIChlLmcuIFRpZXIgMSkuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlPzogQXBwZWFyYW5jZU1vZGU7XG5cbiAgLyoqIENvbmNyZXRlIHJlc29sdmVkIG1vZGUsIG9yIG51bGwgd2hlbiBgbW9kZWAgaXMgdW5zZXQgKGluaGVyaXQgZnJvbSBhbmNlc3RvcikuICovXG4gIHJlc29sdmVkTW9kZTogXCJsaWdodFwiIHwgXCJkYXJrXCIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtb2RlTXFsPzogTWVkaWFRdWVyeUxpc3Q7XG4gIHByaXZhdGUgbW9kZUxpc3RlbmVyPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKiBSb290IGNsYXNzIGxpc3Qg4oCUIGFkZHMgYG1hZ2ljeC1haWFgIG9ubHkgd2hlbiBzZWxmLXNjb3BpbmcgdmlhIGBtb2RlYC4gKi9cbiAgZ2V0IHJvb3RDbGFzcygpOiBzdHJpbmcge1xuICAgIGxldCBjbHMgPSBcIm1hZ2ljeC1haWEtZHJvcGRvd25cIjtcbiAgICBpZiAodGhpcy5yZXNvbHZlZE1vZGUpIGNscyArPSBcIiBtYWdpY3gtYWlhXCI7XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lKSBjbHMgKz0gYCAke3RoaXMuY2xhc3NOYW1lfWA7XG4gICAgcmV0dXJuIGNscztcbiAgfVxuXG4gIC8qKiBGYWxsYmFjayBza2VsZXRvbi1iYXIgd2lkdGhzIHVzZWQgd2hlbiBsb2FkaW5nIHdpdGggemVybyBjYWNoZWQgb3B0aW9ucy4gKi9cbiAgcmVhZG9ubHkgZmFsbGJhY2tTa2VsZXRvbkJhcldpZHRocyA9IFsxNTksIDExOSwgMTY0XTtcblxuICAvKipcbiAgICogQXR0cmlidXRpb24vYnJhbmRpbmcgbGluayBVUkwgZm9yIHRoZSBmb290ZXIsIHdpdGggYSBgdXRtX3NvdXJjZWAgZGVyaXZlZFxuICAgKiBmcm9tIHRoZSBlbWJlZGRpbmcgcGFnZSdzIGhvc3RuYW1lIChzZWUge0BsaW5rIGJ1aWxkQXR0cmlidXRpb25Vcmx9KS5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5kSHJlZiA9IGJ1aWxkQXR0cmlidXRpb25VcmwoKTtcblxuICAvKipcbiAgICogVmlldy1tb2RlbCBkZXJpdmVkIGZyb20gdGhlIGNvbnRyb2xsZXIncyBgZHJvcGRvd24kYC4gQWRkcyB0aHJlZSBib29sZWFuc1xuICAgKiAoYHNob3dzUGlsbHNgLCBgc2hvd3NPcHRpb25zYCwgYHNob3dzRmFsbGJhY2tTa2VsZXRvbmAsIGBpc1Zpc2libGVgKSB0aGF0XG4gICAqIGtlZXAgdGVtcGxhdGUtbGV2ZWwgbG9naWMgdG8gYSBwcm9wZXJ0eSByZWFkIHBlciDCpzE5LjYuXG4gICAqXG4gICAqIEluaXRpYWxpemVkIG9uY2UgaW4gYG5nT25Jbml0YCDigJQgbXVzdCBOT1QgYmUgYSBnZXR0ZXIuIEEgZ2V0dGVyIHJldHVybnMgYVxuICAgKiBmcmVzaCBgT2JzZXJ2YWJsZWAgaW5zdGFuY2Ugb24gZXZlcnkgcHJvcGVydHkgcmVhZDsgd2l0aCBPblB1c2ggKyBgYXN5bmNgXG4gICAqIHBpcGUgdGhhdCBtZWFucyBlYWNoIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUgdW5zdWJzY3JpYmVzL3Jlc3Vic2NyaWJlcyxcbiAgICogY2F1c2luZyB0aGUgYCpuZ0lmPVwidm0kIHwgYXN5bmMgYXMgdm1cImAgcm9vdCB0byBicmllZmx5IHJlc29sdmUgYG51bGxgXG4gICAqIGFuZCBmbGlja2VyIHRoZSBlbnRpcmUgZHJvcGRvd24gRE9NLlxuICAgKi9cbiAgdm0kITogT2JzZXJ2YWJsZTxEcm9wZG93blZtPjtcblxuICAvLyBCcmlkZ2UgZm9yIHRoZSBASW5wdXQgYHNob3dQaWxsc2AgaW50byB0aGUgcmVhY3RpdmUgcGlwZWxpbmUuIFdpdGhvdXQgdGhpcyxcbiAgLy8gY2hhbmdpbmcgdGhlIGlucHV0IGFmdGVyIGluaXQgd291bGRuJ3QgdHJpZ2dlciBhIG5ldyB2bSBlbWlzc2lvbiB1bnRpbCB0aGVcbiAgLy8gbmV4dCBjb250cm9sbGVyLmRyb3Bkb3duJCB0aWNrIOKAlCBhbmQgd2UnZCBsb3NlIHRoZSBzaG93UGlsbHMgdXBkYXRlIGVudGlyZWx5XG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGlkbGUuIFVwZGF0ZWQgZnJvbSBuZ09uQ2hhbmdlcyBiZWxvdy5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93UGlsbHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd1NraXBCdXR0b25gLlxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dTa2lwQnV0dG9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLy8gTGFzdCBjb250ZW50IGVtaXR0ZWQgd2hpbGUgdGhlIGRyb3Bkb3duIHdhcyB2aXNpYmxlLiBSZXVzZWQgZHVyaW5nIHRoZVxuICAvLyBjbG9zZSBmYWRlIHNvIHRoZSBwb3B1bGF0ZWQgZHJvcGRvd24gZmFkZXMgb3V0IGFzIG9uZSDigJQgc2VlIGluaXRWbS5cbiAgcHJpdmF0ZSBsYXN0VmlzaWJsZUNvbnRlbnQ6IERyb3Bkb3duQ29udGVudCB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNlZWQgdGhlIGlucHV0IGJyaWRnZXMgZnJvbSB0aGVpciByZXNvbHZlZCB2YWx1ZXMgYXQgaW5pdCB0aW1lLlxuICAgIHRoaXMuc2hvd1BpbGxzJC5uZXh0KHRoaXMuc2hvd1BpbGxzKTtcbiAgICB0aGlzLnNob3dTa2lwQnV0dG9uJC5uZXh0KHRoaXMuc2hvd1NraXBCdXR0b24pO1xuICAgIHRoaXMuYXBwbHlNb2RlKCk7XG4gICAgdGhpcy5pbml0Vm0oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInNob3dQaWxsc1wiXSkge1xuICAgICAgdGhpcy5zaG93UGlsbHMkLm5leHQodGhpcy5zaG93UGlsbHMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dTa2lwQnV0dG9uXCJdKSB7XG4gICAgICB0aGlzLnNob3dTa2lwQnV0dG9uJC5uZXh0KHRoaXMuc2hvd1NraXBCdXR0b24pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcIm1vZGVcIl0gJiYgIWNoYW5nZXNbXCJtb2RlXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5TW9kZSgpO1xuICAgIH1cbiAgICAvLyBSZS1iaW5kIHZtJCB3aGVuIHRoZSBjb250cm9sbGVyIEBJbnB1dCBpcyBzd2FwcGVkIChlLmcuIGEgbXVsdGktc3RlcCBmb3JtXG4gICAgLy8gdG9nZ2xpbmcgYmV0d2VlbiBjb250cm9sbGVycykuIFdpdGhvdXQgdGhpcywgdm0kIHN0YXlzIHN1YnNjcmliZWQgdG8gdGhlXG4gICAgLy8gcHJldmlvdXMgY29udHJvbGxlcidzIGRyb3Bkb3duJCDigJQgcmVuZGVyaW5nIHN0YWxlIG9wdGlvbnMsIG9yLCBpZiB0aGF0XG4gICAgLy8gY29udHJvbGxlciB3YXMgZGVzdHJveSgpLWVkLCByZWNlaXZpbmcgYSBjb21wbGV0aW9uIHRoYXQgY29sbGFwc2VzIHRoZVxuICAgIC8vIGRyb3Bkb3duIHBlcm1hbmVudGx5LiBTa2lwIHRoZSBmaXJzdCBjaGFuZ2U6IG5nT25DaGFuZ2VzIGZpcmVzIGJlZm9yZVxuICAgIC8vIG5nT25Jbml0LCB3aGljaCBvd25zIHRoZSBpbml0aWFsIGNyZWF0aW9uLlxuICAgIGlmIChjaGFuZ2VzW1wiY29udHJvbGxlclwiXSAmJiAhY2hhbmdlc1tcImNvbnRyb2xsZXJcIl0uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICB0aGlzLmluaXRWbSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudGVhcmRvd25Nb2RlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBgbW9kZWAgaW5wdXQgaW50byBgcmVzb2x2ZWRNb2RlYC4gVW5zZXQg4oaSIG51bGwgKHRoZSBkcm9wZG93blxuICAgKiBzdGF5cyBjbGFzcy1sZXNzIGFuZCBpbmhlcml0cyBmcm9tIGEgYC5tYWdpY3gtYWlhYCBhbmNlc3RvcikuIGBcImF1dG9cImAgcmVhZHNcbiAgICogYHByZWZlcnMtY29sb3Itc2NoZW1lYCBhbmQgdHJhY2tzIGl0IGxpdmUgdmlhIGEgbWVkaWEtcXVlcnkgbGlzdGVuZXIuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TW9kZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRlYXJkb3duTW9kZUxpc3RlbmVyKCk7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm1vZGUgPT09IFwibGlnaHRcIiB8fCB0aGlzLm1vZGUgPT09IFwiZGFya1wiKSB7XG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHRoaXMubW9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gXCJhdXRvXCJcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSBcImxpZ2h0XCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubW9kZU1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiKTtcbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHRoaXMubW9kZU1xbC5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCI7XG4gICAgdGhpcy5tb2RlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHRoaXMubW9kZU1xbD8ubWF0Y2hlcyA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfTtcbiAgICB0aGlzLm1vZGVNcWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm1vZGVMaXN0ZW5lcik7XG4gIH1cblxuICBwcml2YXRlIHRlYXJkb3duTW9kZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVNcWwgJiYgdGhpcy5tb2RlTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMubW9kZU1xbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMubW9kZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlTXFsID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubW9kZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEJ1aWxkIHRoZSB2aWV3LW1vZGVsIHN0cmVhbSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgKyBzaG93UGlsbHMkLiAqL1xuICBwcml2YXRlIGluaXRWbSgpOiB2b2lkIHtcbiAgICB0aGlzLnZtJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5jb250cm9sbGVyLmRyb3Bkb3duJCxcbiAgICAgIHRoaXMuc2hvd1BpbGxzJCxcbiAgICAgIHRoaXMuc2hvd1NraXBCdXR0b24kLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtkZCwgc2hvd1BpbGxzLCBzaG93U2tpcEJ1dHRvbl0pID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlU3VnZ2VzdGlvbiA9IGRkLnN1Z2dlc3Rpb25zWzBdO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gYWN0aXZlU3VnZ2VzdGlvbj8ub3B0aW9ucyA/PyBbXTtcbiAgICAgICAgY29uc3Qgc2hvd3NQaWxscyA9IHNob3dQaWxscyAmJiAoZGQucGlsbHMubGVuZ3RoID4gMCB8fCBkZC5pc0xvYWRpbmcpO1xuICAgICAgICAvLyBUaGUgdHJhaWxpbmcgXCJza2lwXCIgYnV0dG9uIG9ubHkgbWFrZXMgc2Vuc2UgbmV4dCB0byBhIHJlYWwsXG4gICAgICAgIC8vIHNraXBwYWJsZSBwaWxsIOKAlCBuZXZlciBvbiB0aGUgZmFsbGJhY2sgc2tlbGV0b24gYmFyLCBhbmQgbmV2ZXJcbiAgICAgICAgLy8gZHVyaW5nIHJlLWVkaXQgKHRoZSBiYXIgdGhlbiBzaG93cyBhbiBhbHJlYWR5IGFuc3dlcmVkIHBhcmFtKS5cbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IE5PVCBnYXRlZCBvbiBzaG93c1BpbGxzOiB3aXRoIHBpbGxzIHJlbmRlcmVkIGVsc2V3aGVyZVxuICAgICAgICAvLyAocGlsbFBsYWNlbWVudCBcImlubGluZVwiL1wiaGlkZGVuXCIpIHRoZSBiYXIgcmVuZGVycyBhcyBhIHNraXAtb25seVxuICAgICAgICAvLyByb3cgaG9sZGluZyBqdXN0IHRoZSBidXR0b24uIEhpZGRlbiB3aGlsZSB0aGUgaW5wdXQgaXMgZW1wdHkg4oCUIHRoZVxuICAgICAgICAvLyBmb290ZXIgaGludCBkb2Vzbid0IGFkdmVydGlzZSBcIuKGkiB0byBza2lwXCIgdW50aWwgdGhlIHVzZXIgaGFzIHR5cGVkLFxuICAgICAgICAvLyBzbyB0aGUgcHJpc3RpbmUgc3RhcnRpbmcgc3RhdGUgc3RheXMgZnJlZSBvZiB0aGUgYWZmb3JkYW5jZSB0b28uXG4gICAgICAgIGNvbnN0IHNob3dzU2tpcCA9XG4gICAgICAgICAgZGQucGlsbHMubGVuZ3RoID4gMCAmJiBzaG93U2tpcEJ1dHRvbiAmJiAhZGQuaXNFZGl0aW5nICYmICFkZC5pc0lucHV0RW1wdHk7XG4gICAgICAgIC8vIEV4YWN0bHkgb25lIGJvZHkgcmVuZGVycy4gYG9wdGlvbnNgIGFib3ZlIGFscmVhZHkgaG9sZHMgdGhlIHZpc2libGVcbiAgICAgICAgLy8gbW9udGgncyBjZWxscyB3aGVuIHRoaXMgaXMgYSBkYXRlIOKAlCB0aGUgY29yZSBzd2FwcGVkIHRoZW0gaW4gaXRzXG4gICAgICAgIC8vIGRlcml2ZSBsYXllciDigJQgc28gdGhlIHR3byBhcmUgdGhlIHNhbWUgbGlzdCBkcmF3biB0d28gZGlmZmVyZW50XG4gICAgICAgIC8vIHdheXMsIGFuZCBuZXZlciBib3RoIGF0IG9uY2UgKHR3byBlbGVtZW50cyBhbnN3ZXJpbmcgdG8gdGhlIHNhbWVcbiAgICAgICAgLy8gb3B0aW9uIGlkIHdvdWxkIGJyZWFrIGtleWJvYXJkIGNvbW1pdCkuXG4gICAgICAgIGNvbnN0IGlzRGF0ZSA9IGRkLmZvcm1hdFR5cGUgPT09IFwiZGF0ZVwiICYmIGRkLmRhdGVWaWV3ICE9IG51bGw7XG4gICAgICAgIGNvbnN0IHNob3dzT3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiAhaXNEYXRlO1xuICAgICAgICBjb25zdCBzaG93c0RhdGVHcmlkID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIGlzRGF0ZTtcbiAgICAgICAgY29uc3Qgc2hvd3NGYWxsYmFja1NrZWxldG9uID0gZGQuaXNMb2FkaW5nICYmICFzaG93c09wdGlvbnMgJiYgIXNob3dzRGF0ZUdyaWQ7XG4gICAgICAgIC8vIEVpdGhlciBoYWxmIGlzIGVub3VnaCB0byBrZWVwIHRoZSBwYW5lbCB1cDogcHJvZHVjdHMgcmVuZGVyIHdpdGggbm9cbiAgICAgICAgLy8gc3VnZ2VzdGlvbnMsIHN1Z2dlc3Rpb25zIHJlbmRlciB3aXRoIG5vIHByb2R1Y3RzLlxuICAgICAgICBjb25zdCBpc1Zpc2libGUgPVxuICAgICAgICAgIGRkLmlzT3BlbiAmJlxuICAgICAgICAgIChzaG93c09wdGlvbnMgfHwgc2hvd3NEYXRlR3JpZCB8fCBzaG93c1BpbGxzIHx8IGRkLmlzTG9hZGluZyB8fCBkZC5wcm9kdWN0cy5sZW5ndGggPiAwKTtcblxuICAgICAgICAvLyBXaGlsZSBjbG9zaW5nLCByZXVzZSB0aGUgbGFzdCB2aXNpYmxlIGNvbnRlbnQgc28gdGhlIHBvcHVsYXRlZFxuICAgICAgICAvLyBkcm9wZG93biBmYWRlcyBvdXQgYXMgb25lLiBPdGhlcndpc2UgdGhlIHBpbGxzL29wdGlvbnMgdmFuaXNoIHRoZVxuICAgICAgICAvLyBpbnN0YW50IHRoZSBzdGF0ZSBlbXB0aWVzIChlLmcuIHNraXBwaW5nIHRoZSBsYXN0IHBpbGwgd2l0aCDihpIpLFxuICAgICAgICAvLyBsZWF2aW5nIHRoZSBhbHdheXMtcHJlc2VudCBmb290ZXIgYWxvbmUgZm9yIGEgZmxhc2ggb2YgYSBmb290ZXItb25seVxuICAgICAgICAvLyBcIm5vIG9wdGlvbnNcIiBib3ggbWlkLWZhZGUuIE9ubHkgYGlzVmlzaWJsZWAgdHJhY2tzIGxpdmUgc3RhdGUgdG9cbiAgICAgICAgLy8gZHJpdmUgdGhlIG9wYWNpdHkgdHJhbnNpdGlvbi5cbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgdGhpcy5sYXN0VmlzaWJsZUNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi50aGlzLmxhc3RWaXNpYmxlQ29udGVudCwgaXNWaXNpYmxlOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uSGlnaGxpZ2h0ZWQgPVxuICAgICAgICAgIGRkLmFjdGl2ZUluZGV4ID49IDAgJiYgQm9vbGVhbihvcHRpb25zW2RkLmFjdGl2ZUluZGV4XT8uaXNfdGFwcGFibGUpO1xuICAgICAgICBjb25zdCB7IGtleTogZm9vdGVyS2V5LCBoaW50OiBmb290ZXJIaW50IH0gPSBnZXRGb290ZXJIaW50KFxuICAgICAgICAgIG9wdGlvbkhpZ2hsaWdodGVkLFxuICAgICAgICAgIGRkLmlzSW5wdXRFbXB0eSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29udGVudDogRHJvcGRvd25Db250ZW50ID0ge1xuICAgICAgICAgIHBpbGxzOiBkZC5waWxscyxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGFjdGl2ZUluZGV4OiBkZC5hY3RpdmVJbmRleCxcbiAgICAgICAgICBpc0FjdGl2ZVBpbGxTZWxlY3RlZDogZGQuaXNBY3RpdmVQaWxsU2VsZWN0ZWQsXG4gICAgICAgICAgaXNMb2FkaW5nOiBkZC5pc0xvYWRpbmcsXG4gICAgICAgICAgc2hvd3NQaWxscyxcbiAgICAgICAgICBzaG93c1NraXAsXG4gICAgICAgICAgc2tpcERpc2FibGVkOiBkZC5pc0xvYWRpbmcgfHwgQm9vbGVhbihkZC5pblNlbGVjdGlvbkFuaW1hdGlvbiksXG4gICAgICAgICAgYWN0aXZlUGlsbExhYmVsOiBkZC5waWxsc1swXT8udGV4dCA/PyBcIlwiLFxuICAgICAgICAgIHNob3dzT3B0aW9ucyxcbiAgICAgICAgICBzaG93c0RhdGVHcmlkLFxuICAgICAgICAgIGRhdGVWaWV3OiBkZC5kYXRlVmlldyA/PyBudWxsLFxuICAgICAgICAgIHNlbGVjdGVkRGF0ZUlzbzogZGQuc2VsZWN0ZWREYXRlSXNvID8/IG51bGwsXG4gICAgICAgICAgc2hvd3NGYWxsYmFja1NrZWxldG9uLFxuICAgICAgICAgIHByb2R1Y3RzOiBkZC5wcm9kdWN0cyxcbiAgICAgICAgICBncm91cEtleTogYWN0aXZlU3VnZ2VzdGlvbiA/IGAke2FjdGl2ZVN1Z2dlc3Rpb24udHlwZX0gJHthY3RpdmVTdWdnZXN0aW9uLnRleHR9YCA6IFwiXCIsXG4gICAgICAgICAgZm9vdGVyS2V5LFxuICAgICAgICAgIGZvb3RlckhpbnQsXG4gICAgICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBkZC5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpc1Zpc2libGUpIHRoaXMubGFzdFZpc2libGVDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29udGVudCwgaXNWaXNpYmxlIH07XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgdHJhY2tCeVdpZHRoID0gKF86IG51bWJlciwgdzogbnVtYmVyKTogbnVtYmVyID0+IHc7XG5cbiAgb25QaWxsQ2xpY2soaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIG9uU2tpcCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2tpcEFjdGl2ZVBpbGwoKTtcbiAgfVxuXG4gIG9uU2VsZWN0KG9wdGlvbjogU3VnZ2VzdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIG9uUHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2hvd1ByZXZpb3VzTW9udGgoKTtcbiAgfVxuXG4gIG9uTmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zaG93TmV4dE1vbnRoKCk7XG4gIH1cblxuICBvbkhpZ2hsaWdodChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZURyb3Bkb3duSW5kZXgoaW5kZXgpO1xuICB9XG5cbiAgb25Qcm9kdWN0U2VsZWN0KHByb2R1Y3Q6IFByb2R1Y3QpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0UHJvZHVjdChwcm9kdWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhcmQgdGFraW5nIGZvY3VzIGJsdXJzIHRoZSBlZGl0b3IsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjbG9zZSB0aGVcbiAgICogcGFuZWwgb3V0IGZyb20gdW5kZXIgdGhlIGNhcmQgdGhlIHVzZXIganVzdCB0YWJiZWQgdG8uXG4gICAqL1xuICBvblByb2R1Y3RGb2N1c0NoYW5nZShmb2N1c2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEZvY3VzZWQoZm9jdXNlZCk7XG4gIH1cblxuICBwcmV2ZW50Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBsb3NpbmcgZm9jdXMgd2hlbiBpbnRlcmFjdGluZyB3aXRoIHRoZSBkcm9wZG93bi5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwidm0kIHwgYXN5bmMgYXMgdm1cIlxuICBbaWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICByb2xlPVwibGlzdGJveFwiXG4gIGRhdGEtYWlhLWRyb3Bkb3duPVwiXCJcbiAgW2F0dHIuZGF0YS1haWEtbG9hZGluZ109XCJ2bS5pc0xvYWRpbmcgPyAnJyA6IG51bGxcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cInZtLm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYWlhLWhhcy1wcm9kdWN0c109XCJ2bS5wcm9kdWN0cy5sZW5ndGggPiAwID8gJycgOiBudWxsXCJcbiAgW2NsYXNzXT1cInJvb3RDbGFzc1wiXG4gIFtjbGFzcy5tYWdpY3gtYWlhLWRyb3Bkb3duLXZpc2libGVdPVwidm0uaXNWaXNpYmxlXCJcbiAgKG1vdXNlZG93bik9XCJwcmV2ZW50Qmx1cigkZXZlbnQpXCJcbj5cbiAgPGFpYS1zdGFjayBzcGFjZT1cIjhweFwiPlxuICAgIDxhaWEtY2x1c3RlclxuICAgICAgKm5nSWY9XCJ2bS5zaG93c1BpbGxzIHx8IHZtLnNob3dzU2tpcFwiXG4gICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtZHJvcGRvd24tcGlsbGJhclwiXG4gICAgICBkYXRhLWFpYS1waWxsYmFyPVwiXCJcbiAgICAgIFtub1dyYXBdPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPCEtLSBUaGUgc2Nyb2xsICsgcmlnaHQtZWRnZSBmYWRlIGxpdmUgb24gdGhpcyB3cmFwcGVyIChub3QgdGhlIGJhcikgc29cbiAgICAgICAgICAgdGhlIHNraXAgYnV0dG9uIHN0YXlzIG91dHNpZGUgdGhlIG1hc2tlZCByZWdpb24g4oCUIHBpbm5lZCBhbmQgZnVsbHlcbiAgICAgICAgICAgb3BhcXVlIHdoaWxlIG92ZXJmbG93aW5nIHBpbGxzIGZhZGUgdW5kZXIgaXQuIEFic2VudCBpbiBhIHNraXAtb25seVxuICAgICAgICAgICByb3cgKHBpbGxzIHJlbmRlcmVkIGVsc2V3aGVyZSB2aWEgcGlsbFBsYWNlbWVudCBpbmxpbmUvaGlkZGVuKS4gLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cInZtLnNob3dzUGlsbHNcIiBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1zY3JvbGxcIiBkYXRhLWFpYS1waWxsLXNjcm9sbD1cIlwiPlxuICAgICAgICA8YWlhLXBpbGwtbGlzdFxuICAgICAgICAgIFtwaWxsc109XCJ2bS5waWxsc1wiXG4gICAgICAgICAgW2FjdGl2ZVBpbGxJbmRleF09XCIwXCJcbiAgICAgICAgICBbYWN0aXZlU2VsZWN0ZWRdPVwidm0uaXNBY3RpdmVQaWxsU2VsZWN0ZWRcIlxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICAgICAgKHNlbGVjdFBpbGwpPVwib25QaWxsQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgID48L2FpYS1waWxsLWxpc3Q+XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwidm0uc2hvd3NTa2lwXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtc2tpcFwiXG4gICAgICAgIGRhdGEtYWlhLXNraXA9XCJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwidm0uc2tpcERpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ2bS5hY3RpdmVQaWxsTGFiZWwgPyAnU2tpcCAnICsgdm0uYWN0aXZlUGlsbExhYmVsIDogJ1NraXAnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU2tpcCgpXCJcbiAgICAgID5cbiAgICAgICAgc2tpcFxuICAgICAgPC9idXR0b24+XG4gICAgPC9haWEtY2x1c3Rlcj5cblxuICAgIDxhaWEtc3VnZ2VzdGlvbi1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzT3B0aW9uc1wiXG4gICAgICBbb3B0aW9uc109XCJ2bS5vcHRpb25zXCJcbiAgICAgIFthY3RpdmVJbmRleF09XCJ2bS5hY3RpdmVJbmRleFwiXG4gICAgICBbbGlzdGJveElkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICBbZ3JvdXBLZXldPVwidm0uZ3JvdXBLZXlcIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChoaWdobGlnaHQpPVwib25IaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgPjwvYWlhLXN1Z2dlc3Rpb24tZ3JpZD5cblxuICAgIDxhaWEtZGF0ZS1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzRGF0ZUdyaWRcIlxuICAgICAgW29wdGlvbnNdPVwidm0ub3B0aW9uc1wiXG4gICAgICBbYWN0aXZlSW5kZXhdPVwidm0uYWN0aXZlSW5kZXhcIlxuICAgICAgW2xpc3Rib3hJZF09XCJjb250cm9sbGVyLmxpc3Rib3hJZFwiXG4gICAgICBbdmlld109XCJ2bS5kYXRlVmlld1wiXG4gICAgICBbc2VsZWN0ZWRJc29dPVwidm0uc2VsZWN0ZWREYXRlSXNvXCJcbiAgICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoaGlnaGxpZ2h0KT1cIm9uSGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAgKHByZXZpb3VzTW9udGgpPVwib25QcmV2aW91c01vbnRoKClcIlxuICAgICAgKG5leHRNb250aCk9XCJvbk5leHRNb250aCgpXCJcbiAgICA+PC9haWEtZGF0ZS1ncmlkPlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJ2bS5zaG93c0ZhbGxiYWNrU2tlbGV0b25cIlxuICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLWRyb3Bkb3duLXNrZWxldG9uLWJhcnNcIlxuICAgICAgZGF0YS1haWEtc2tlbGV0b24tYmFycz1cIlwiXG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nRm9yPVwibGV0IHcgb2YgZmFsbGJhY2tTa2VsZXRvbkJhcldpZHRoczsgdHJhY2tCeTogdHJhY2tCeVdpZHRoXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLWRyb3Bkb3duLXNrZWxldG9uLWJhclwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJ3XCJcbiAgICAgID48L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tICpuZ0lmLCBub3QganVzdCB0aGUgc2VjdGlvbidzIG93biBndWFyZCBpbnNpZGUgdGhlIGNvbXBvbmVudDogdGhlIGhvc3RcbiAgICAgICAgIGVsZW1lbnQgaXMgYW4gaW4tZmxvdyBjaGlsZCBvZiAuYWlhLXN0YWNrIChkaXNwbGF5OmZsZXg7IGdhcDo4cHgpLCBzb1xuICAgICAgICAgYW4gYWx3YXlzLWluc3RhbnRpYXRlZCB6ZXJvLWhlaWdodCBob3N0IHdvdWxkIGFkZCBhIFNFQ09ORCA4cHggZ2FwXG4gICAgICAgICBiZXR3ZWVuIHRoZSBncmlkIGFuZCB0aGUgZm9vdGVyIOKAlCBpbiBldmVyeSBkcm9wZG93biwgcHJvZHVjdHMgb3Igbm90LlxuICAgICAgICAgVGhlIGdyaWQncyAtLWFpYS1ncmlkLW92ZXJsYXAtYm90dG9tIGlzIHR1bmVkIGZvciBleGFjdGx5IG9uZSBnYXAsIHNvXG4gICAgICAgICB0aGUgZm9vdGVyIHdvdWxkIGxhbmQgOHB4IGJlbG93IHRoZSBiYW5kIGl0IGlzIG1lYW50IHRvIGNvdmVyLiAtLT5cbiAgICA8YWlhLXByb2R1Y3Qtc3RyaXBcbiAgICAgICpuZ0lmPVwidm0ucHJvZHVjdHMubGVuZ3RoID4gMFwiXG4gICAgICBbcHJvZHVjdHNdPVwidm0ucHJvZHVjdHNcIlxuICAgICAgW2xpc3Rib3hJZF09XCJjb250cm9sbGVyLmxpc3Rib3hJZFwiXG4gICAgICBbZm9jdXNhYmxlXT1cInZtLmlzVmlzaWJsZVwiXG4gICAgICAoc2VsZWN0KT1cIm9uUHJvZHVjdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChmb2N1c0NoYW5nZSk9XCJvblByb2R1Y3RGb2N1c0NoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9haWEtcHJvZHVjdC1zdHJpcD5cblxuICAgIDxmb290ZXIgY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3RlclwiIGRhdGEtYWlhLWZvb3Rlcj1cIlwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWhpbnQtZ3JvdXBcIj5cbiAgICAgICAgICA8a2JkIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXIta2V5XCI+e3sgdm0uZm9vdGVyS2V5IH19PC9rYmQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1oaW50XCI+e3sgdm0uZm9vdGVySGludCB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYnJhbmQtbGlua1wiXG4gICAgICAgICAgW2hyZWZdPVwiYnJhbmRIcmVmXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1icmFuZFwiPkFJPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYmFkZ2VcIj5BdXRvY29tcGxldGU8L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9vdGVyPlxuICA8L2FpYS1zdGFjaz5cbjwvZGl2PlxuIl19
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUtOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFFbkIsYUFBYSxFQUViLGtCQUFrQixHQUluQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFtQixNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7QUF1Q2hHOzs7Ozs7Ozs7Ozs7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LE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICB0eXBlIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIHR5cGUgT25DaGFuZ2VzLFxuICB0eXBlIE9uRGVzdHJveSxcbiAgdHlwZSBPbkluaXQsXG4gIHR5cGUgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXBwZWFyYW5jZU1vZGUsXG4gIGF0dGFjaFNjcm9sbEFycm93LFxuICBidWlsZEF0dHJpYnV0aW9uVXJsLFxuICB0eXBlIERhdGVNb250aFZpZXcsXG4gIGdldEZvb3RlckhpbnQsXG4gIHR5cGUgUHJvZHVjdCxcbiAgU0NST0xMX0FSUk9XX0xBQkVMLFxuICB0eXBlIFNjcm9sbEFycm93Q29udHJvbGxlcixcbiAgdHlwZSBTdWdnZXN0aW9uLFxuICB0eXBlIFN1Z2dlc3Rpb25PcHRpb24sXG59IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB0eXBlIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyL2FpLWF1dG9jb21wbGV0ZS5jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBEYXRlR3JpZENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9kYXRlLWdyaWQvZGF0ZS1ncmlkLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2x1c3RlckNvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9sYXlvdXQvY2x1c3Rlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN0YWNrQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL2xheW91dC9zdGFjay5jb21wb25lbnRcIjtcbmltcG9ydCB7IFBpbGxMaXN0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3BpbGwtbGlzdC9waWxsLWxpc3QuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQcm9kdWN0U3RyaXBDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcHJvZHVjdC1zdHJpcC9wcm9kdWN0LXN0cmlwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgU3VnZ2VzdGlvbkdyaWRDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3VnZ2VzdGlvbi1ncmlkL3N1Z2dlc3Rpb24tZ3JpZC5jb21wb25lbnRcIjtcblxuaW50ZXJmYWNlIERyb3Bkb3duVm0ge1xuICBwaWxsczogU3VnZ2VzdGlvbltdO1xuICBvcHRpb25zOiBTdWdnZXN0aW9uT3B0aW9uW107XG4gIGFjdGl2ZUluZGV4OiBudW1iZXI7XG4gIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBib29sZWFuO1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIHNob3dzUGlsbHM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBwaWxsYmFyIGVuZHMgaW4gdGhlIHRyYWlsaW5nIFwic2tpcFwiIGJ1dHRvbi4gKi9cbiAgc2hvd3NTa2lwOiBib29sZWFuO1xuICAvKipcbiAgICogRGlzYWJsZWQgc3RhdGUgZm9yIHRoZSBza2lwIGJ1dHRvbjogbG9hZGluZywgb3IgdGhlIHBvc3Qtc2VsZWN0aW9uIHdpbmRvd1xuICAgKiB3aGVyZSBpc0xvYWRpbmcgaXMgc3VwcHJlc3NlZCBidXQgdGhlIGNvcmUncyBza2lwQWN0aXZlUGlsbCgpIG5vLW9wcy5cbiAgICovXG4gIHNraXBEaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqIEFjdGl2ZSBwaWxsJ3MgbGFiZWwsIGZvciB0aGUgc2tpcCBidXR0b24ncyBhcmlhLWxhYmVsLiAqL1xuICBhY3RpdmVQaWxsTGFiZWw6IHN0cmluZztcbiAgc2hvd3NPcHRpb25zOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgYm9keSByZW5kZXJzIGluIHBsYWNlIG9mIHRoZSBvcHRpb25zIGdyaWQuICovXG4gIHNob3dzRGF0ZUdyaWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgbW9udGggdGhlIGNhbGVuZGFyIHNob3dzLiBOdWxsIHVubGVzcyBgc2hvd3NEYXRlR3JpZGAuICovXG4gIGRhdGVWaWV3OiBEYXRlTW9udGhWaWV3IHwgbnVsbDtcbiAgLyoqIGBZWVlZLU1NLUREYCB0aGUgcGFyYW0gYmVpbmcgcmUtZWRpdGVkIGFscmVhZHkgaG9sZHMsIG9yIG51bGwuICovXG4gIHNlbGVjdGVkRGF0ZUlzbzogc3RyaW5nIHwgbnVsbDtcbiAgc2hvd3NGYWxsYmFja1NrZWxldG9uOiBib29sZWFuO1xuICBpc1Zpc2libGU6IGJvb2xlYW47XG4gIC8qKiBQcm9kdWN0IGNhcmRzIGZvciB0aGUgc3RyaXAuIEVtcHR5IHVubGVzcyBgcHJvZHVjdHNgIGlzIGNvbmZpZ3VyZWQuICovXG4gIHByb2R1Y3RzOiBQcm9kdWN0W107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc3VnZ2VzdGlvbiB0aGUgb3B0aW9ucyBiZWxvbmcgdG8g4oCUIGRyaXZlcyB0aGUgZ3JpZCdzIHNjcm9sbCByZXNldC4gKi9cbiAgZ3JvdXBLZXk6IHN0cmluZztcbiAgZm9vdGVyS2V5OiBzdHJpbmc7XG4gIGZvb3RlckhpbnQ6IHN0cmluZztcbiAgb3B0aW9uc1Bvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCI7XG59XG5cbi8qKiBUaGUgY29udGVudC1iZWFyaW5nIGZpZWxkcyBvZiB0aGUgdmlldy1tb2RlbCAoZXZlcnl0aGluZyBidXQgYGlzVmlzaWJsZWApLiAqL1xudHlwZSBEcm9wZG93bkNvbnRlbnQgPSBPbWl0PERyb3Bkb3duVm0sIFwiaXNWaXNpYmxlXCI+O1xuXG4vKipcbiAqIFRpZXIgMiBkcm9wZG93biBjb21wb25lbnQg4oCUIHRoZSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3Qnc1xuICogYDxBSUF1dG9jb21wbGV0ZURyb3Bkb3duIC8+YC4gUmVuZGVycyB0aGUgcGlsbGJhciwgb3B0aW9ucyBncmlkLCBhbmRcbiAqIGxvYWRpbmcgc2tlbGV0b24gYmFzZWQgb24gdGhlIHN1cHBsaWVkIGNvbnRyb2xsZXIncyBgZHJvcGRvd24kYCBzbmFwc2hvdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duIFtjb250cm9sbGVyXT1cImFjXCI+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG4gKiBgYGBcbiAqXG4gKiBBbGwgYWN0aW9ucyAocGlsbCBjbGljaywgb3B0aW9uIHNlbGVjdCwgb3B0aW9uIGhpZ2hsaWdodCkgYXJlIGZvcndhcmRlZCB0b1xuICogdGhlIGNvbnRyb2xsZXIuIENvbnN1bWVycyB3aG8gbmVlZCB0byBvYnNlcnZlIHRoZXNlIGV2ZW50cyBjYW4gc3Vic2NyaWJlXG4gKiB0byB0aGUgY29udHJvbGxlcidzIHBlci1maWVsZCBvYnNlcnZhYmxlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBQaWxsTGlzdENvbXBvbmVudCxcbiAgICBQcm9kdWN0U3RyaXBDb21wb25lbnQsXG4gICAgU3VnZ2VzdGlvbkdyaWRDb21wb25lbnQsXG4gICAgRGF0ZUdyaWRDb21wb25lbnQsXG4gICAgU3RhY2tDb21wb25lbnQsXG4gICAgQ2x1c3RlckNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sXCIsXG4gIC8vIFRoZSBzaGFyZWQgYXBwZWFyYW5jZSBsYXllciBjYXJyaWVzIHRoZSBkZXNpZ24gdG9rZW5zICsgYm94LXNpemluZyByZXNldCArXG4gIC8vIG9wdGlvbnNQb3NpdGlvbiByZXZlcnNhbCwgc28gYSBzdGFuZGFsb25lIGRyb3Bkb3duIChubyBUaWVyIDEgY29tcG9uZW50IG9uXG4gIC8vIHRoZSBwYWdlKSBpcyBmdWxseSBzdHlsZWQgb25jZSBgbW9kZWAgaXMgc2V0LlxuICBzdHlsZVVybHM6IFtcIi4uL3NoYXJlZC9hcHBlYXJhbmNlLmNzc1wiLCBcIi4vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5jc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95XG57XG4gIC8qKiBUaGUgY29udHJvbGxlciB0aGF0IG93bnMgdGhlIGF1dG9jb21wbGV0ZSBzdGF0ZS4gUmVxdWlyZWQuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xsZXIhOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXI7XG4gIC8qKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgcGlsbGJhciBhYm92ZSB0aGUgb3B0aW9ucyBncmlkLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBASW5wdXQoKSBzaG93UGlsbHMgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlsbGJhciBlbmRzIGluIGEgc21hbGwgXCJza2lwXCIgYnV0dG9uIHRoYXQgZGlzbWlzc2VzIHRoZVxuICAgKiBhY3RpdmUgcGlsbCDigJQgc2FtZSBhY3Rpb24gYXMgcHJlc3Npbmcg4oaSIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LiBJdCBzaXRzXG4gICAqIGF0IHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBiYXI6IHZpc3VhbGx5IHRvcC1yaWdodCB3aGVuIHRoZSBkcm9wZG93blxuICAgKiBvcGVucyBiZWxvdyB0aGUgaW5wdXQsIGJvdHRvbS1yaWdodCB3aGVuIGBvcHRpb25zUG9zaXRpb25gIGlzIFwiYWJvdmVcIi5cbiAgICogRGVmYXVsdDogdHJ1ZS4gSGlkZGVuIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHJlLWVkaXQgYW5kIHdoaWxlIHRoZSBmYWxsYmFja1xuICAgKiBza2VsZXRvbiByZW5kZXJzLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKiogT3B0aW9uYWwgQ1NTIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGRyb3Bkb3duIHJvb3QuICovXG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbG9yIG1vZGUgZm9yIGEgc3RhbmRhbG9uZSBkcm9wZG93bi4gV2hlbiBzZXQsIHRoZSBkcm9wZG93biBzZWxmLXNjb3BlcyB0aGVcbiAgICogZGVzaWduIHRva2VucyB0byBpdHMgb3duIHJvb3QgKGFkZHMgYG1hZ2ljeC1haWFgICsgYGRhdGEtbW9kZWApLCBzbyBpdCBuZWVkc1xuICAgKiBubyBgLm1hZ2ljeC1haWFgIHdyYXBwZXIuIGBcImF1dG9cImAgZm9sbG93cyBgcHJlZmVycy1jb2xvci1zY2hlbWVgLiBMZWF2ZSBpdFxuICAgKiB1bnNldCB3aGVuIHRoZSBkcm9wZG93biBzaXRzIGluc2lkZSBhIGAubWFnaWN4LWFpYWAgYW5jZXN0b3IgKGUuZy4gVGllciAxKS5cbiAgICovXG4gIEBJbnB1dCgpIG1vZGU/OiBBcHBlYXJhbmNlTW9kZTtcblxuICAvKiogQ29uY3JldGUgcmVzb2x2ZWQgbW9kZSwgb3IgbnVsbCB3aGVuIGBtb2RlYCBpcyB1bnNldCAoaW5oZXJpdCBmcm9tIGFuY2VzdG9yKS4gKi9cbiAgcmVzb2x2ZWRNb2RlOiBcImxpZ2h0XCIgfCBcImRhcmtcIiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVNcWw/OiBNZWRpYVF1ZXJ5TGlzdDtcbiAgcHJpdmF0ZSBtb2RlTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgLyoqIFJvb3QgY2xhc3MgbGlzdCDigJQgYWRkcyBgbWFnaWN4LWFpYWAgb25seSB3aGVuIHNlbGYtc2NvcGluZyB2aWEgYG1vZGVgLiAqL1xuICBnZXQgcm9vdENsYXNzKCk6IHN0cmluZyB7XG4gICAgbGV0IGNscyA9IFwibWFnaWN4LWFpYS1kcm9wZG93blwiO1xuICAgIGlmICh0aGlzLnJlc29sdmVkTW9kZSkgY2xzICs9IFwiIG1hZ2ljeC1haWFcIjtcbiAgICBpZiAodGhpcy5jbGFzc05hbWUpIGNscyArPSBgICR7dGhpcy5jbGFzc05hbWV9YDtcbiAgICByZXR1cm4gY2xzO1xuICB9XG5cbiAgLyoqIEZhbGxiYWNrIHNrZWxldG9uLWJhciB3aWR0aHMgdXNlZCB3aGVuIGxvYWRpbmcgd2l0aCB6ZXJvIGNhY2hlZCBvcHRpb25zLiAqL1xuICByZWFkb25seSBmYWxsYmFja1NrZWxldG9uQmFyV2lkdGhzID0gWzE1OSwgMTE5LCAxNjRdO1xuXG4gIC8qKiBBY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIFwibW9yZSBiZWxvd1wiIHNjcm9sbCBhcnJvdy4gKi9cbiAgcmVhZG9ubHkgc2Nyb2xsQXJyb3dMYWJlbCA9IFNDUk9MTF9BUlJPV19MQUJFTDtcblxuICAvLyBUaGUgZHJvcGRvd24gcm9vdCBhbmQgdGhlIGFycm93IGJ1dHRvbiBsaXZlIHVuZGVyIHRoZSBgKm5nSWZgIG9uIHZtJCwgc29cbiAgLy8gdGhleSBjb21lIGFuZCBnbyB3aXRoIGl0IOKAlCBoZW5jZSBub24tc3RhdGljIHF1ZXJpZXMsIHJlLXJlYWQgZXZlcnkgY2hlY2suXG4gIEBWaWV3Q2hpbGQoXCJkcm9wZG93blJvb3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHByaXZhdGUgZHJvcGRvd25Sb290UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoXCJzY3JvbGxBcnJvd1wiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBzY3JvbGxBcnJvd1JlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAvKiogVGhlIGdyaWQgdGhlIHNjcm9sbC1hcnJvdyBjb250cm9sbGVyIGlzIGN1cnJlbnRseSBib3VuZCB0by4gKi9cbiAgcHJpdmF0ZSBzY3JvbGxBcnJvd0JpbmRpbmc6IHsgZ3JpZDogSFRNTEVsZW1lbnQ7IGNvbnRyb2xsZXI6IFNjcm9sbEFycm93Q29udHJvbGxlciB9IHwgbnVsbCA9XG4gICAgbnVsbDtcblxuICAvKipcbiAgICogQXR0cmlidXRpb24vYnJhbmRpbmcgbGluayBVUkwgZm9yIHRoZSBmb290ZXIsIHdpdGggYSBgdXRtX3NvdXJjZWAgZGVyaXZlZFxuICAgKiBmcm9tIHRoZSBlbWJlZGRpbmcgcGFnZSdzIGhvc3RuYW1lIChzZWUge0BsaW5rIGJ1aWxkQXR0cmlidXRpb25Vcmx9KS5cbiAgICovXG4gIHJlYWRvbmx5IGJyYW5kSHJlZiA9IGJ1aWxkQXR0cmlidXRpb25VcmwoKTtcblxuICAvKipcbiAgICogVmlldy1tb2RlbCBkZXJpdmVkIGZyb20gdGhlIGNvbnRyb2xsZXIncyBgZHJvcGRvd24kYC4gQWRkcyB0aHJlZSBib29sZWFuc1xuICAgKiAoYHNob3dzUGlsbHNgLCBgc2hvd3NPcHRpb25zYCwgYHNob3dzRmFsbGJhY2tTa2VsZXRvbmAsIGBpc1Zpc2libGVgKSB0aGF0XG4gICAqIGtlZXAgdGVtcGxhdGUtbGV2ZWwgbG9naWMgdG8gYSBwcm9wZXJ0eSByZWFkIHBlciDCpzE5LjYuXG4gICAqXG4gICAqIEluaXRpYWxpemVkIG9uY2UgaW4gYG5nT25Jbml0YCDigJQgbXVzdCBOT1QgYmUgYSBnZXR0ZXIuIEEgZ2V0dGVyIHJldHVybnMgYVxuICAgKiBmcmVzaCBgT2JzZXJ2YWJsZWAgaW5zdGFuY2Ugb24gZXZlcnkgcHJvcGVydHkgcmVhZDsgd2l0aCBPblB1c2ggKyBgYXN5bmNgXG4gICAqIHBpcGUgdGhhdCBtZWFucyBlYWNoIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUgdW5zdWJzY3JpYmVzL3Jlc3Vic2NyaWJlcyxcbiAgICogY2F1c2luZyB0aGUgYCpuZ0lmPVwidm0kIHwgYXN5bmMgYXMgdm1cImAgcm9vdCB0byBicmllZmx5IHJlc29sdmUgYG51bGxgXG4gICAqIGFuZCBmbGlja2VyIHRoZSBlbnRpcmUgZHJvcGRvd24gRE9NLlxuICAgKi9cbiAgdm0kITogT2JzZXJ2YWJsZTxEcm9wZG93blZtPjtcblxuICAvLyBCcmlkZ2UgZm9yIHRoZSBASW5wdXQgYHNob3dQaWxsc2AgaW50byB0aGUgcmVhY3RpdmUgcGlwZWxpbmUuIFdpdGhvdXQgdGhpcyxcbiAgLy8gY2hhbmdpbmcgdGhlIGlucHV0IGFmdGVyIGluaXQgd291bGRuJ3QgdHJpZ2dlciBhIG5ldyB2bSBlbWlzc2lvbiB1bnRpbCB0aGVcbiAgLy8gbmV4dCBjb250cm9sbGVyLmRyb3Bkb3duJCB0aWNrIOKAlCBhbmQgd2UnZCBsb3NlIHRoZSBzaG93UGlsbHMgdXBkYXRlIGVudGlyZWx5XG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGlkbGUuIFVwZGF0ZWQgZnJvbSBuZ09uQ2hhbmdlcyBiZWxvdy5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93UGlsbHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd1NraXBCdXR0b25gLlxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dTa2lwQnV0dG9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLy8gTGFzdCBjb250ZW50IGVtaXR0ZWQgd2hpbGUgdGhlIGRyb3Bkb3duIHdhcyB2aXNpYmxlLiBSZXVzZWQgZHVyaW5nIHRoZVxuICAvLyBjbG9zZSBmYWRlIHNvIHRoZSBwb3B1bGF0ZWQgZHJvcGRvd24gZmFkZXMgb3V0IGFzIG9uZSDigJQgc2VlIGluaXRWbS5cbiAgcHJpdmF0ZSBsYXN0VmlzaWJsZUNvbnRlbnQ6IERyb3Bkb3duQ29udGVudCB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNlZWQgdGhlIGlucHV0IGJyaWRnZXMgZnJvbSB0aGVpciByZXNvbHZlZCB2YWx1ZXMgYXQgaW5pdCB0aW1lLlxuICAgIHRoaXMuc2hvd1BpbGxzJC5uZXh0KHRoaXMuc2hvd1BpbGxzKTtcbiAgICB0aGlzLnNob3dTa2lwQnV0dG9uJC5uZXh0KHRoaXMuc2hvd1NraXBCdXR0b24pO1xuICAgIHRoaXMuYXBwbHlNb2RlKCk7XG4gICAgdGhpcy5pbml0Vm0oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInNob3dQaWxsc1wiXSkge1xuICAgICAgdGhpcy5zaG93UGlsbHMkLm5leHQodGhpcy5zaG93UGlsbHMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dTa2lwQnV0dG9uXCJdKSB7XG4gICAgICB0aGlzLnNob3dTa2lwQnV0dG9uJC5uZXh0KHRoaXMuc2hvd1NraXBCdXR0b24pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcIm1vZGVcIl0gJiYgIWNoYW5nZXNbXCJtb2RlXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5TW9kZSgpO1xuICAgIH1cbiAgICAvLyBSZS1iaW5kIHZtJCB3aGVuIHRoZSBjb250cm9sbGVyIEBJbnB1dCBpcyBzd2FwcGVkIChlLmcuIGEgbXVsdGktc3RlcCBmb3JtXG4gICAgLy8gdG9nZ2xpbmcgYmV0d2VlbiBjb250cm9sbGVycykuIFdpdGhvdXQgdGhpcywgdm0kIHN0YXlzIHN1YnNjcmliZWQgdG8gdGhlXG4gICAgLy8gcHJldmlvdXMgY29udHJvbGxlcidzIGRyb3Bkb3duJCDigJQgcmVuZGVyaW5nIHN0YWxlIG9wdGlvbnMsIG9yLCBpZiB0aGF0XG4gICAgLy8gY29udHJvbGxlciB3YXMgZGVzdHJveSgpLWVkLCByZWNlaXZpbmcgYSBjb21wbGV0aW9uIHRoYXQgY29sbGFwc2VzIHRoZVxuICAgIC8vIGRyb3Bkb3duIHBlcm1hbmVudGx5LiBTa2lwIHRoZSBmaXJzdCBjaGFuZ2U6IG5nT25DaGFuZ2VzIGZpcmVzIGJlZm9yZVxuICAgIC8vIG5nT25Jbml0LCB3aGljaCBvd25zIHRoZSBpbml0aWFsIGNyZWF0aW9uLlxuICAgIGlmIChjaGFuZ2VzW1wiY29udHJvbGxlclwiXSAmJiAhY2hhbmdlc1tcImNvbnRyb2xsZXJcIl0uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICB0aGlzLmluaXRWbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBjb3JlJ3MgXCJtb3JlIGJlbG93XCIgYXJyb3cgY29udHJvbGxlciBib3VuZCB0byB3aGljaGV2ZXIgb3B0aW9uc1xuICAgKiBncmlkIGlzIGN1cnJlbnRseSByZW5kZXJlZCDigJQgdGhlIEFuZ3VsYXIgYW5hbG9ndWUgb2YgUmVhY3Qnc1xuICAgKiB1c2VTY3JvbGxBcnJvdy4gVGhlIGNvbnRyb2xsZXIgb3ducyB0aGUgYmVoYXZpb3VyIChtZWFzdXJpbmcsIHZpc2liaWxpdHksXG4gICAqIHRoZSBwYWdlLXNjcm9sbCBvbiBjbGljayDigJQgc2VlIHRoZSBjb3JlJ3Mgc2Nyb2xsQXJyb3cudHMpOyB0aGlzIG9ubHkgaGFuZHNcbiAgICogaXQgdGhlIGxpdmUgZWxlbWVudHMgYWZ0ZXIgZWFjaCB2aWV3IGNoZWNrLCByZS1hdHRhY2hpbmcgd2hlbiB0aGUgZ3JpZFxuICAgKiBlbGVtZW50IGlzIHJlcGxhY2VkIGFuZCB0ZWFyaW5nIGRvd24gd2hlbiB0aGVyZSBpcyBubyBncmlkLlxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRyb3Bkb3duUm9vdFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLnNjcm9sbEFycm93UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGdyaWQgPSByb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIi5haWEtZ3JpZFtkYXRhLXNjcm9sbF1cIikgPz8gbnVsbDtcbiAgICBpZiAodGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcgJiYgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuZ3JpZCAhPT0gZ3JpZCkge1xuICAgICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuY29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZyA9IG51bGw7XG4gICAgfVxuICAgIGlmICghcm9vdCB8fCAhYnV0dG9uIHx8ICFncmlkKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnNjcm9sbEFycm93QmluZGluZykge1xuICAgICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcgPSB7XG4gICAgICAgIGdyaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGF0dGFjaFNjcm9sbEFycm93KHsgZHJvcGRvd246IHJvb3QsIGdyaWQsIGJ1dHRvbiB9KSxcbiAgICAgIH07XG4gICAgICByZXR1cm47IC8vIGF0dGFjaCgpIHJ1bnMgdGhlIGZpcnN0IHVwZGF0ZSBpdHNlbGZcbiAgICB9XG4gICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuY29udHJvbGxlci51cGRhdGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudGVhcmRvd25Nb2RlTGlzdGVuZXIoKTtcbiAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZz8uY29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGBtb2RlYCBpbnB1dCBpbnRvIGByZXNvbHZlZE1vZGVgLiBVbnNldCDihpIgbnVsbCAodGhlIGRyb3Bkb3duXG4gICAqIHN0YXlzIGNsYXNzLWxlc3MgYW5kIGluaGVyaXRzIGZyb20gYSBgLm1hZ2ljeC1haWFgIGFuY2VzdG9yKS4gYFwiYXV0b1wiYCByZWFkc1xuICAgKiBgcHJlZmVycy1jb2xvci1zY2hlbWVgIGFuZCB0cmFja3MgaXQgbGl2ZSB2aWEgYSBtZWRpYS1xdWVyeSBsaXN0ZW5lci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlNb2RlKCk6IHZvaWQge1xuICAgIHRoaXMudGVhcmRvd25Nb2RlTGlzdGVuZXIoKTtcbiAgICBpZiAodGhpcy5tb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gXCJsaWdodFwiIHx8IHRoaXMubW9kZSA9PT0gXCJkYXJrXCIpIHtcbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gdGhpcy5tb2RlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBcImF1dG9cIlxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiB3aW5kb3cubWF0Y2hNZWRpYSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLnJlc29sdmVkTW9kZSA9IFwibGlnaHRcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb2RlTXFsID0gd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpO1xuICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gdGhpcy5tb2RlTXFsLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbiAgICB0aGlzLm1vZGVMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gdGhpcy5tb2RlTXFsPy5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCI7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9O1xuICAgIHRoaXMubW9kZU1xbC5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMubW9kZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgdGVhcmRvd25Nb2RlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZU1xbCAmJiB0aGlzLm1vZGVMaXN0ZW5lcikge1xuICAgICAgdGhpcy5tb2RlTXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5tb2RlTGlzdGVuZXIpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVNcWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tb2RlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIHZpZXctbW9kZWwgc3RyZWFtIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbGxlciArIHNob3dQaWxscyQuICovXG4gIHByaXZhdGUgaW5pdFZtKCk6IHZvaWQge1xuICAgIHRoaXMudm0kID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmNvbnRyb2xsZXIuZHJvcGRvd24kLFxuICAgICAgdGhpcy5zaG93UGlsbHMkLFxuICAgICAgdGhpcy5zaG93U2tpcEJ1dHRvbiQsXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2RkLCBzaG93UGlsbHMsIHNob3dTa2lwQnV0dG9uXSkgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gZGQuc3VnZ2VzdGlvbnNbMF07XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhY3RpdmVTdWdnZXN0aW9uPy5vcHRpb25zID8/IFtdO1xuICAgICAgICBjb25zdCBzaG93c1BpbGxzID0gc2hvd1BpbGxzICYmIChkZC5waWxscy5sZW5ndGggPiAwIHx8IGRkLmlzTG9hZGluZyk7XG4gICAgICAgIC8vIFRoZSB0cmFpbGluZyBcInNraXBcIiBidXR0b24gb25seSBtYWtlcyBzZW5zZSBuZXh0IHRvIGEgcmVhbCxcbiAgICAgICAgLy8gc2tpcHBhYmxlIHBpbGwg4oCUIG5ldmVyIG9uIHRoZSBmYWxsYmFjayBza2VsZXRvbiBiYXIsIGFuZCBuZXZlclxuICAgICAgICAvLyBkdXJpbmcgcmUtZWRpdCAodGhlIGJhciB0aGVuIHNob3dzIGFuIGFscmVhZHkgYW5zd2VyZWQgcGFyYW0pLlxuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGdhdGVkIG9uIHNob3dzUGlsbHM6IHdpdGggcGlsbHMgcmVuZGVyZWQgZWxzZXdoZXJlXG4gICAgICAgIC8vIChwaWxsUGxhY2VtZW50IFwiaW5saW5lXCIvXCJoaWRkZW5cIikgdGhlIGJhciByZW5kZXJzIGFzIGEgc2tpcC1vbmx5XG4gICAgICAgIC8vIHJvdyBob2xkaW5nIGp1c3QgdGhlIGJ1dHRvbi4gSGlkZGVuIHdoaWxlIHRoZSBpbnB1dCBpcyBlbXB0eSDigJQgdGhlXG4gICAgICAgIC8vIGZvb3RlciBoaW50IGRvZXNuJ3QgYWR2ZXJ0aXNlIFwi4oaSIHRvIHNraXBcIiB1bnRpbCB0aGUgdXNlciBoYXMgdHlwZWQsXG4gICAgICAgIC8vIHNvIHRoZSBwcmlzdGluZSBzdGFydGluZyBzdGF0ZSBzdGF5cyBmcmVlIG9mIHRoZSBhZmZvcmRhbmNlIHRvby5cbiAgICAgICAgY29uc3Qgc2hvd3NTa2lwID1cbiAgICAgICAgICBkZC5waWxscy5sZW5ndGggPiAwICYmIHNob3dTa2lwQnV0dG9uICYmICFkZC5pc0VkaXRpbmcgJiYgIWRkLmlzSW5wdXRFbXB0eTtcbiAgICAgICAgLy8gRXhhY3RseSBvbmUgYm9keSByZW5kZXJzLiBgb3B0aW9uc2AgYWJvdmUgYWxyZWFkeSBob2xkcyB0aGUgdmlzaWJsZVxuICAgICAgICAvLyBtb250aCdzIGNlbGxzIHdoZW4gdGhpcyBpcyBhIGRhdGUg4oCUIHRoZSBjb3JlIHN3YXBwZWQgdGhlbSBpbiBpdHNcbiAgICAgICAgLy8gZGVyaXZlIGxheWVyIOKAlCBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBsaXN0IGRyYXduIHR3byBkaWZmZXJlbnRcbiAgICAgICAgLy8gd2F5cywgYW5kIG5ldmVyIGJvdGggYXQgb25jZSAodHdvIGVsZW1lbnRzIGFuc3dlcmluZyB0byB0aGUgc2FtZVxuICAgICAgICAvLyBvcHRpb24gaWQgd291bGQgYnJlYWsga2V5Ym9hcmQgY29tbWl0KS5cbiAgICAgICAgY29uc3QgaXNEYXRlID0gZGQuZm9ybWF0VHlwZSA9PT0gXCJkYXRlXCIgJiYgZGQuZGF0ZVZpZXcgIT0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2hvd3NPcHRpb25zID0gb3B0aW9ucy5sZW5ndGggPiAwICYmICFpc0RhdGU7XG4gICAgICAgIGNvbnN0IHNob3dzRGF0ZUdyaWQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgaXNEYXRlO1xuICAgICAgICBjb25zdCBzaG93c0ZhbGxiYWNrU2tlbGV0b24gPSBkZC5pc0xvYWRpbmcgJiYgIXNob3dzT3B0aW9ucyAmJiAhc2hvd3NEYXRlR3JpZDtcbiAgICAgICAgLy8gRWl0aGVyIGhhbGYgaXMgZW5vdWdoIHRvIGtlZXAgdGhlIHBhbmVsIHVwOiBwcm9kdWN0cyByZW5kZXIgd2l0aCBub1xuICAgICAgICAvLyBzdWdnZXN0aW9ucywgc3VnZ2VzdGlvbnMgcmVuZGVyIHdpdGggbm8gcHJvZHVjdHMuXG4gICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9XG4gICAgICAgICAgZGQuaXNPcGVuICYmXG4gICAgICAgICAgKHNob3dzT3B0aW9ucyB8fCBzaG93c0RhdGVHcmlkIHx8IHNob3dzUGlsbHMgfHwgZGQuaXNMb2FkaW5nIHx8IGRkLnByb2R1Y3RzLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIC8vIFdoaWxlIGNsb3NpbmcsIHJldXNlIHRoZSBsYXN0IHZpc2libGUgY29udGVudCBzbyB0aGUgcG9wdWxhdGVkXG4gICAgICAgIC8vIGRyb3Bkb3duIGZhZGVzIG91dCBhcyBvbmUuIE90aGVyd2lzZSB0aGUgcGlsbHMvb3B0aW9ucyB2YW5pc2ggdGhlXG4gICAgICAgIC8vIGluc3RhbnQgdGhlIHN0YXRlIGVtcHRpZXMgKGUuZy4gc2tpcHBpbmcgdGhlIGxhc3QgcGlsbCB3aXRoIOKGkiksXG4gICAgICAgIC8vIGxlYXZpbmcgdGhlIGFsd2F5cy1wcmVzZW50IGZvb3RlciBhbG9uZSBmb3IgYSBmbGFzaCBvZiBhIGZvb3Rlci1vbmx5XG4gICAgICAgIC8vIFwibm8gb3B0aW9uc1wiIGJveCBtaWQtZmFkZS4gT25seSBgaXNWaXNpYmxlYCB0cmFja3MgbGl2ZSBzdGF0ZSB0b1xuICAgICAgICAvLyBkcml2ZSB0aGUgb3BhY2l0eSB0cmFuc2l0aW9uLlxuICAgICAgICBpZiAoIWlzVmlzaWJsZSAmJiB0aGlzLmxhc3RWaXNpYmxlQ29udGVudCkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnRoaXMubGFzdFZpc2libGVDb250ZW50LCBpc1Zpc2libGU6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25IaWdobGlnaHRlZCA9XG4gICAgICAgICAgZGQuYWN0aXZlSW5kZXggPj0gMCAmJiBCb29sZWFuKG9wdGlvbnNbZGQuYWN0aXZlSW5kZXhdPy5pc190YXBwYWJsZSk7XG4gICAgICAgIGNvbnN0IHsga2V5OiBmb290ZXJLZXksIGhpbnQ6IGZvb3RlckhpbnQgfSA9IGdldEZvb3RlckhpbnQoXG4gICAgICAgICAgb3B0aW9uSGlnaGxpZ2h0ZWQsXG4gICAgICAgICAgZGQuaXNJbnB1dEVtcHR5LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb250ZW50OiBEcm9wZG93bkNvbnRlbnQgPSB7XG4gICAgICAgICAgcGlsbHM6IGRkLnBpbGxzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgYWN0aXZlSW5kZXg6IGRkLmFjdGl2ZUluZGV4LFxuICAgICAgICAgIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBkZC5pc0FjdGl2ZVBpbGxTZWxlY3RlZCxcbiAgICAgICAgICBpc0xvYWRpbmc6IGRkLmlzTG9hZGluZyxcbiAgICAgICAgICBzaG93c1BpbGxzLFxuICAgICAgICAgIHNob3dzU2tpcCxcbiAgICAgICAgICBza2lwRGlzYWJsZWQ6IGRkLmlzTG9hZGluZyB8fCBCb29sZWFuKGRkLmluU2VsZWN0aW9uQW5pbWF0aW9uKSxcbiAgICAgICAgICBhY3RpdmVQaWxsTGFiZWw6IGRkLnBpbGxzWzBdPy50ZXh0ID8/IFwiXCIsXG4gICAgICAgICAgc2hvd3NPcHRpb25zLFxuICAgICAgICAgIHNob3dzRGF0ZUdyaWQsXG4gICAgICAgICAgZGF0ZVZpZXc6IGRkLmRhdGVWaWV3ID8/IG51bGwsXG4gICAgICAgICAgc2VsZWN0ZWREYXRlSXNvOiBkZC5zZWxlY3RlZERhdGVJc28gPz8gbnVsbCxcbiAgICAgICAgICBzaG93c0ZhbGxiYWNrU2tlbGV0b24sXG4gICAgICAgICAgcHJvZHVjdHM6IGRkLnByb2R1Y3RzLFxuICAgICAgICAgIGdyb3VwS2V5OiBhY3RpdmVTdWdnZXN0aW9uID8gYCR7YWN0aXZlU3VnZ2VzdGlvbi50eXBlfSAke2FjdGl2ZVN1Z2dlc3Rpb24udGV4dH1gIDogXCJcIixcbiAgICAgICAgICBmb290ZXJLZXksXG4gICAgICAgICAgZm9vdGVySGludCxcbiAgICAgICAgICBvcHRpb25zUG9zaXRpb246IGRkLm9wdGlvbnNQb3NpdGlvbixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlzVmlzaWJsZSkgdGhpcy5sYXN0VmlzaWJsZUNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICByZXR1cm4geyAuLi5jb250ZW50LCBpc1Zpc2libGUgfTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICB0cmFja0J5V2lkdGggPSAoXzogbnVtYmVyLCB3OiBudW1iZXIpOiBudW1iZXIgPT4gdztcblxuICBvblBpbGxDbGljayhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZVBpbGwoaW5kZXgpO1xuICB9XG5cbiAgb25Ta2lwKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5za2lwQWN0aXZlUGlsbCgpO1xuICB9XG5cbiAgb25TZWxlY3Qob3B0aW9uOiBTdWdnZXN0aW9uT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNlbGVjdE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgb25QcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zaG93UHJldmlvdXNNb250aCgpO1xuICB9XG5cbiAgb25OZXh0TW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNob3dOZXh0TW9udGgoKTtcbiAgfVxuXG4gIG9uSGlnaGxpZ2h0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlRHJvcGRvd25JbmRleChpbmRleCk7XG4gIH1cblxuICBvblByb2R1Y3RTZWxlY3QocHJvZHVjdDogUHJvZHVjdCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZWxlY3RQcm9kdWN0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FyZCB0YWtpbmcgZm9jdXMgYmx1cnMgdGhlIGVkaXRvciwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNsb3NlIHRoZVxuICAgKiBwYW5lbCBvdXQgZnJvbSB1bmRlciB0aGUgY2FyZCB0aGUgdXNlciBqdXN0IHRhYmJlZCB0by5cbiAgICovXG4gIG9uUHJvZHVjdEZvY3VzQ2hhbmdlKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0Rm9jdXNlZChmb2N1c2VkKTtcbiAgfVxuXG4gIHByZXZlbnRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGxvc2luZyBmb2N1cyB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGRyb3Bkb3duLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJ2bSQgfCBhc3luYyBhcyB2bVwiXG4gICNkcm9wZG93blJvb3RcbiAgW2lkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgcm9sZT1cImxpc3Rib3hcIlxuICBkYXRhLWFpYS1kcm9wZG93bj1cIlwiXG4gIFthdHRyLmRhdGEtYWlhLWxvYWRpbmddPVwidm0uaXNMb2FkaW5nID8gJycgOiBudWxsXCJcbiAgW2F0dHIuZGF0YS1tb2RlXT1cInJlc29sdmVkTW9kZVwiXG4gIFthdHRyLmRhdGEtb3B0aW9ucy1wb3NpdGlvbl09XCJ2bS5vcHRpb25zUG9zaXRpb25cIlxuICBbYXR0ci5kYXRhLWFpYS1oYXMtcHJvZHVjdHNdPVwidm0ucHJvZHVjdHMubGVuZ3RoID4gMCA/ICcnIDogbnVsbFwiXG4gIFtjbGFzc109XCJyb290Q2xhc3NcIlxuICBbY2xhc3MubWFnaWN4LWFpYS1kcm9wZG93bi12aXNpYmxlXT1cInZtLmlzVmlzaWJsZVwiXG4gIChtb3VzZWRvd24pPVwicHJldmVudEJsdXIoJGV2ZW50KVwiXG4+XG4gIDxhaWEtc3RhY2sgc3BhY2U9XCI4cHhcIj5cbiAgICA8YWlhLWNsdXN0ZXJcbiAgICAgICpuZ0lmPVwidm0uc2hvd3NQaWxscyB8fCB2bS5zaG93c1NraXBcIlxuICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLWRyb3Bkb3duLXBpbGxiYXJcIlxuICAgICAgZGF0YS1haWEtcGlsbGJhcj1cIlwiXG4gICAgICBbbm9XcmFwXT1cInRydWVcIlxuICAgID5cbiAgICAgIDwhLS0gVGhlIHNjcm9sbCArIHJpZ2h0LWVkZ2UgZmFkZSBsaXZlIG9uIHRoaXMgd3JhcHBlciAobm90IHRoZSBiYXIpIHNvXG4gICAgICAgICAgIHRoZSBza2lwIGJ1dHRvbiBzdGF5cyBvdXRzaWRlIHRoZSBtYXNrZWQgcmVnaW9uIOKAlCBwaW5uZWQgYW5kIGZ1bGx5XG4gICAgICAgICAgIG9wYXF1ZSB3aGlsZSBvdmVyZmxvd2luZyBwaWxscyBmYWRlIHVuZGVyIGl0LiBBYnNlbnQgaW4gYSBza2lwLW9ubHlcbiAgICAgICAgICAgcm93IChwaWxscyByZW5kZXJlZCBlbHNld2hlcmUgdmlhIHBpbGxQbGFjZW1lbnQgaW5saW5lL2hpZGRlbikuIC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCJ2bS5zaG93c1BpbGxzXCIgY2xhc3M9XCJtYWdpY3gtYWlhLXBpbGwtc2Nyb2xsXCIgZGF0YS1haWEtcGlsbC1zY3JvbGw9XCJcIj5cbiAgICAgICAgPGFpYS1waWxsLWxpc3RcbiAgICAgICAgICBbcGlsbHNdPVwidm0ucGlsbHNcIlxuICAgICAgICAgIFthY3RpdmVQaWxsSW5kZXhdPVwiMFwiXG4gICAgICAgICAgW2FjdGl2ZVNlbGVjdGVkXT1cInZtLmlzQWN0aXZlUGlsbFNlbGVjdGVkXCJcbiAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICBbbG9hZGluZ109XCJ2bS5pc0xvYWRpbmdcIlxuICAgICAgICAgIChzZWxlY3RQaWxsKT1cIm9uUGlsbENsaWNrKCRldmVudClcIlxuICAgICAgICA+PC9haWEtcGlsbC1saXN0PlxuICAgICAgPC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cInZtLnNob3dzU2tpcFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXNraXBcIlxuICAgICAgICBkYXRhLWFpYS1za2lwPVwiXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInZtLnNraXBEaXNhYmxlZFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidm0uYWN0aXZlUGlsbExhYmVsID8gJ1NraXAgJyArIHZtLmFjdGl2ZVBpbGxMYWJlbCA6ICdTa2lwJ1wiXG4gICAgICAgIChjbGljayk9XCJvblNraXAoKVwiXG4gICAgICA+XG4gICAgICAgIHNraXBcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYWlhLWNsdXN0ZXI+XG5cbiAgICA8YWlhLXN1Z2dlc3Rpb24tZ3JpZFxuICAgICAgKm5nSWY9XCJ2bS5zaG93c09wdGlvbnNcIlxuICAgICAgW29wdGlvbnNdPVwidm0ub3B0aW9uc1wiXG4gICAgICBbYWN0aXZlSW5kZXhdPVwidm0uYWN0aXZlSW5kZXhcIlxuICAgICAgW2xpc3Rib3hJZF09XCJjb250cm9sbGVyLmxpc3Rib3hJZFwiXG4gICAgICBbbG9hZGluZ109XCJ2bS5pc0xvYWRpbmdcIlxuICAgICAgW2dyb3VwS2V5XT1cInZtLmdyb3VwS2V5XCJcbiAgICAgIFtvcHRpb25zUG9zaXRpb25dPVwidm0ub3B0aW9uc1Bvc2l0aW9uXCJcbiAgICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoaGlnaGxpZ2h0KT1cIm9uSGlnaGxpZ2h0KCRldmVudClcIlxuICAgID48L2FpYS1zdWdnZXN0aW9uLWdyaWQ+XG5cbiAgICA8YWlhLWRhdGUtZ3JpZFxuICAgICAgKm5nSWY9XCJ2bS5zaG93c0RhdGVHcmlkXCJcbiAgICAgIFtvcHRpb25zXT1cInZtLm9wdGlvbnNcIlxuICAgICAgW2FjdGl2ZUluZGV4XT1cInZtLmFjdGl2ZUluZGV4XCJcbiAgICAgIFtsaXN0Ym94SWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICAgICAgW3ZpZXddPVwidm0uZGF0ZVZpZXdcIlxuICAgICAgW3NlbGVjdGVkSXNvXT1cInZtLnNlbGVjdGVkRGF0ZUlzb1wiXG4gICAgICAoc2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgICAgKGhpZ2hsaWdodCk9XCJvbkhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgICAgIChwcmV2aW91c01vbnRoKT1cIm9uUHJldmlvdXNNb250aCgpXCJcbiAgICAgIChuZXh0TW9udGgpPVwib25OZXh0TW9udGgoKVwiXG4gICAgPjwvYWlhLWRhdGUtZ3JpZD5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidm0uc2hvd3NGYWxsYmFja1NrZWxldG9uXCJcbiAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJzXCJcbiAgICAgIGRhdGEtYWlhLXNrZWxldG9uLWJhcnM9XCJcIlxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0Zvcj1cImxldCB3IG9mIGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHM7IHRyYWNrQnk6IHRyYWNrQnlXaWR0aFwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwid1wiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSAqbmdJZiwgbm90IGp1c3QgdGhlIHNlY3Rpb24ncyBvd24gZ3VhcmQgaW5zaWRlIHRoZSBjb21wb25lbnQ6IHRoZSBob3N0XG4gICAgICAgICBlbGVtZW50IGlzIGFuIGluLWZsb3cgY2hpbGQgb2YgLmFpYS1zdGFjayAoZGlzcGxheTpmbGV4OyBnYXA6OHB4KSwgc29cbiAgICAgICAgIGFuIGFsd2F5cy1pbnN0YW50aWF0ZWQgemVyby1oZWlnaHQgaG9zdCB3b3VsZCBhZGQgYSBTRUNPTkQgOHB4IGdhcFxuICAgICAgICAgYmV0d2VlbiB0aGUgZ3JpZCBhbmQgdGhlIGZvb3RlciDigJQgaW4gZXZlcnkgZHJvcGRvd24sIHByb2R1Y3RzIG9yIG5vdC5cbiAgICAgICAgIFRoZSBncmlkJ3MgLS1haWEtZ3JpZC1vdmVybGFwLWJvdHRvbSBpcyB0dW5lZCBmb3IgZXhhY3RseSBvbmUgZ2FwLCBzb1xuICAgICAgICAgdGhlIGZvb3RlciB3b3VsZCBsYW5kIDhweCBiZWxvdyB0aGUgYmFuZCBpdCBpcyBtZWFudCB0byBjb3Zlci4gLS0+XG4gICAgPGFpYS1wcm9kdWN0LXN0cmlwXG4gICAgICAqbmdJZj1cInZtLnByb2R1Y3RzLmxlbmd0aCA+IDBcIlxuICAgICAgW3Byb2R1Y3RzXT1cInZtLnByb2R1Y3RzXCJcbiAgICAgIFtsaXN0Ym94SWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICAgICAgW2ZvY3VzYWJsZV09XCJ2bS5pc1Zpc2libGVcIlxuICAgICAgKHNlbGVjdCk9XCJvblByb2R1Y3RTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoZm9jdXNDaGFuZ2UpPVwib25Qcm9kdWN0Rm9jdXNDaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvYWlhLXByb2R1Y3Qtc3RyaXA+XG5cbiAgICA8Zm9vdGVyIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXJcIiBkYXRhLWFpYS1mb290ZXI9XCJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1yb3dcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1oaW50LWdyb3VwXCI+XG4gICAgICAgICAgPGtiZCBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWtleVwiPnt7IHZtLmZvb3RlcktleSB9fTwva2JkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItaGludFwiPnt7IHZtLmZvb3RlckhpbnQgfX08L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGFcbiAgICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWJyYW5kLWxpbmtcIlxuICAgICAgICAgIFtocmVmXT1cImJyYW5kSHJlZlwiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYnJhbmRcIj5BSTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWJhZGdlXCI+QXV0b2NvbXBsZXRlPC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvb3Rlcj5cbiAgPC9haWEtc3RhY2s+XG4gIDwhLS0gXCJNb3JlIGJlbG93XCIgYXJyb3cg4oCUIGFuIG92ZXJsYXkgb24gdGhlIHBhbmVsLCBub3QgYSBzZWN0aW9uIG9mIHRoZVxuICAgICAgIHN0YWNrLiBTaG93bi9wb3NpdGlvbmVkIGJ5IHRoZSBjb3JlJ3Mgc2Nyb2xsLWFycm93IGNvbnRyb2xsZXIgKHNlZVxuICAgICAgIHN5bmNTY3JvbGxBcnJvdyk7IG1hcmt1cCBtaXJyb3JzIHZhbmlsbGEncyBjcmVhdGVTY3JvbGxBcnJvd0J1dHRvbi4gLS0+XG4gIDxidXR0b25cbiAgICAjc2Nyb2xsQXJyb3dcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICB0YWJpbmRleD1cIi0xXCJcbiAgICBjbGFzcz1cIm1hZ2ljeC1haWEtc2Nyb2xsLWFycm93XCJcbiAgICBkYXRhLWFpYS1zY3JvbGwtYXJyb3c9XCJcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2Nyb2xsQXJyb3dMYWJlbFwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgPlxuICAgIDxzdmdcbiAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxuICAgICAgd2lkdGg9XCIxNFwiXG4gICAgICBoZWlnaHQ9XCIxNFwiXG4gICAgICBmaWxsPVwibm9uZVwiXG4gICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMS43NVwiXG4gICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICBmb2N1c2FibGU9XCJmYWxzZVwiXG4gICAgPlxuICAgICAgPHBhdGggZD1cIk00IDYuNSA4IDEwLjVsNC00XCIgLz5cbiAgICA8L3N2Zz5cbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==