@magicx-eng/ai-autocomplete-angular 0.28.1 → 0.28.2

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.
@@ -1,6 +1,6 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject, ViewChild, ViewEncapsulation, } from "@angular/core";
3
- import { attachScrollArrow, buildAttributionUrl, getFooterHint, isCalendarFormat, SCROLL_ARROW_LABEL, } from "@magicx-eng/ai-autocomplete-vanilla";
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, inject, NgZone, ViewChild, ViewEncapsulation, } from "@angular/core";
3
+ import { attachScrollArrow, buildAttributionUrl, containScroll, getFooterHint, isCalendarFormat, 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";
@@ -65,6 +65,8 @@ export class AIAutocompleteDropdownComponent {
65
65
  /** Concrete resolved mode, or null when `mode` is unset (inherit from ancestor). */
66
66
  this.resolvedMode = null;
67
67
  this.cdr = inject(ChangeDetectorRef);
68
+ this.host = inject(ElementRef);
69
+ this.zone = inject(NgZone);
68
70
  /** Fallback skeleton-bar widths used when loading with zero cached options. */
69
71
  this.fallbackSkeletonBarWidths = [159, 119, 164];
70
72
  /** Accessible name of the "more below" scroll arrow. */
@@ -111,6 +113,12 @@ export class AIAutocompleteDropdownComponent {
111
113
  this.showOptionCounts$.next(this.showOptionCounts);
112
114
  this.applyMode();
113
115
  this.initVm();
116
+ // Wheel/touch over the dropdown never scrolls the page behind it. On the
117
+ // host, so it survives the *ngIf root coming and going; outside the zone,
118
+ // so a wheel gesture doesn't run change detection on every event.
119
+ this.zone.runOutsideAngular(() => {
120
+ this.releaseScroll = containScroll(this.host.nativeElement);
121
+ });
114
122
  }
115
123
  ngOnChanges(changes) {
116
124
  if (changes["showPills"]) {
@@ -170,6 +178,7 @@ export class AIAutocompleteDropdownComponent {
170
178
  }
171
179
  ngOnDestroy() {
172
180
  this.teardownModeListener();
181
+ this.releaseScroll?.();
173
182
  this.scrollArrowBinding?.controller.destroy();
174
183
  this.scrollArrowBinding = null;
175
184
  }
@@ -372,4 +381,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
372
381
  type: ViewChild,
373
382
  args: ["scrollArrow", { static: false }]
374
383
  }] } });
375
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUtOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixtQkFBbUIsRUFHbkIsYUFBYSxFQUNiLGdCQUFnQixFQUloQixrQkFBa0IsR0FJbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBbUIsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQzs7O0FBK0No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QTJKQSw2K2NEakRJLFlBQVkscVRBQ1osaUJBQWlCLGlLQUNqQixxQkFBcUIsNktBQ3JCLHVCQUF1QixxUEFDdkIsaUJBQWlCLCtNQUNqQixjQUFjLGtGQUNkLGdCQUFnQjs0RkFVUCwrQkFBK0I7a0JBcEIzQyxTQUFTOytCQUNFLDBCQUEwQixjQUN4QixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3dCQUN2QixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsZ0JBQWdCO3FCQUNqQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSTs4QkFXNUIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQVNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csZUFBZTtzQkFBdkIsS0FBSztnQkFNRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUtHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csSUFBSTtzQkFBWixLQUFLO2dCQXdCZ0QsZUFBZTtzQkFBcEUsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVwQyxjQUFjO3NCQURyQixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICB0eXBlIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIHR5cGUgT25DaGFuZ2VzLFxuICB0eXBlIE9uRGVzdHJveSxcbiAgdHlwZSBPbkluaXQsXG4gIHR5cGUgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXBwZWFyYW5jZU1vZGUsXG4gIGF0dGFjaFNjcm9sbEFycm93LFxuICBidWlsZEF0dHJpYnV0aW9uVXJsLFxuICB0eXBlIERhdGVNb250aFZpZXcsXG4gIHR5cGUgRGF0ZVNlbGVjdGlvbixcbiAgZ2V0Rm9vdGVySGludCxcbiAgaXNDYWxlbmRhckZvcm1hdCxcbiAgdHlwZSBQcm9kdWN0LFxuICB0eXBlIFByb2R1Y3RJbWFnZUZhbGxiYWNrLFxuICB0eXBlIFByb2R1Y3RzTGF5b3V0LFxuICBTQ1JPTExfQVJST1dfTEFCRUwsXG4gIHR5cGUgU2Nyb2xsQXJyb3dDb250cm9sbGVyLFxuICB0eXBlIFN1Z2dlc3Rpb24sXG4gIHR5cGUgU3VnZ2VzdGlvbk9wdGlvbixcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIHR5cGUgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBtYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IERhdGVHcmlkQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL2RhdGUtZ3JpZC9kYXRlLWdyaWQuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBDbHVzdGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL2xheW91dC9jbHVzdGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgU3RhY2tDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvbGF5b3V0L3N0YWNrLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFByb2R1Y3RTdHJpcENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9wcm9kdWN0LXN0cmlwL3Byb2R1Y3Qtc3RyaXAuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdWdnZXN0aW9uR3JpZENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWdnZXN0aW9uLWdyaWQvc3VnZ2VzdGlvbi1ncmlkLmNvbXBvbmVudFwiO1xuXG5pbnRlcmZhY2UgRHJvcGRvd25WbSB7XG4gIHBpbGxzOiBTdWdnZXN0aW9uW107XG4gIG9wdGlvbnM6IFN1Z2dlc3Rpb25PcHRpb25bXTtcbiAgYWN0aXZlSW5kZXg6IG51bWJlcjtcbiAgaXNBY3RpdmVQaWxsU2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgLyoqIFRoZSBsb2FkaW5nIHNrZWxldG9uIGlzIGZhZGluZyBvdXQgYmVmb3JlIHRoZSByZXNwb25zZSdzIG9wdGlvbnMgcmVwbGFjZSBpdC4gKi9cbiAgc2tlbGV0b25FeGl0aW5nOiBib29sZWFuO1xuICBzaG93c1BpbGxzOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgcGlsbGJhciBlbmRzIGluIHRoZSB0cmFpbGluZyBcInNraXBcIiBidXR0b24uICovXG4gIHNob3dzU2tpcDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERpc2FibGVkIHN0YXRlIGZvciB0aGUgc2tpcCBidXR0b246IGxvYWRpbmcsIG9yIHRoZSBwb3N0LXNlbGVjdGlvbiB3aW5kb3dcbiAgICogd2hlcmUgaXNMb2FkaW5nIGlzIHN1cHByZXNzZWQgYnV0IHRoZSBjb3JlJ3Mgc2tpcEFjdGl2ZVBpbGwoKSBuby1vcHMuXG4gICAqL1xuICBza2lwRGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKiBBY3RpdmUgcGlsbCdzIGxhYmVsLCBmb3IgdGhlIHNraXAgYnV0dG9uJ3MgYXJpYS1sYWJlbC4gKi9cbiAgYWN0aXZlUGlsbExhYmVsOiBzdHJpbmc7XG4gIHNob3dzT3B0aW9uczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGJvZHkgcmVuZGVycyBpbiBwbGFjZSBvZiB0aGUgb3B0aW9ucyBncmlkLiAqL1xuICBzaG93c0RhdGVHcmlkOiBib29sZWFuO1xuICAvKiogVGhlIG1vbnRoIHRoZSBjYWxlbmRhciBzaG93cy4gTnVsbCB1bmxlc3MgYHNob3dzRGF0ZUdyaWRgLiAqL1xuICBkYXRlVmlldzogRGF0ZU1vbnRoVmlldyB8IG51bGw7XG4gIC8qKiBXaGF0IHRoZSBjYWxlbmRhciBwYWludHMgYXMgYW5zd2VyZWQg4oCUIHNlZSB0aGUgY29yZSdzIGBkYXRlU2VsZWN0aW9uRm9yYC4gKi9cbiAgZGF0ZVNlbGVjdGlvbjogRGF0ZVNlbGVjdGlvbjtcbiAgc2hvd3NGYWxsYmFja1NrZWxldG9uOiBib29sZWFuO1xuICBpc1Zpc2libGU6IGJvb2xlYW47XG4gIC8qKiBQcm9kdWN0IGNhcmRzIGZvciB0aGUgc3RyaXAuIEVtcHR5IHVubGVzcyBgcHJvZHVjdHNgIGlzIGNvbmZpZ3VyZWQuICovXG4gIHByb2R1Y3RzOiBQcm9kdWN0W107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGUgc3VnZ2VzdGlvbiB0aGUgb3B0aW9ucyBiZWxvbmcgdG8g4oCUIGRyaXZlcyB0aGUgZ3JpZCdzIHNjcm9sbCByZXNldC4gKi9cbiAgZ3JvdXBLZXk6IHN0cmluZztcbiAgZm9vdGVyS2V5OiBzdHJpbmc7XG4gIGZvb3RlckhpbnQ6IHN0cmluZztcbiAgb3B0aW9uc1Bvc2l0aW9uOiBcImFib3ZlXCIgfCBcImJlbG93XCI7XG4gIC8qKiBXaGV0aGVyIG9wdGlvbiByb3dzIGRyYXcgdGhlaXIgYGljb25fc3ZnYCBiZWZvcmUgdGhlIHRleHQuICovXG4gIHNob3dPcHRpb25JY29uczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgb3B0aW9uIHJvd3MgZHJhdyB0aGVpciBgaW1hZ2VfdXJsYCBhcyBhIHRodW1ibmFpbCBiZWZvcmUgdGhlIHRleHQuICovXG4gIHNob3dPcHRpb25JbWFnZXM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIG9wdGlvbiByb3dzIHNob3cgdGhlaXIgYGl0ZW1fY291bnRgIGF0IHRoZSB0cmFpbGluZyBlZGdlLiAqL1xuICBzaG93T3B0aW9uQ291bnRzOiBib29sZWFuO1xufVxuXG4vKiogVGhlIGNvbnRlbnQtYmVhcmluZyBmaWVsZHMgb2YgdGhlIHZpZXctbW9kZWwgKGV2ZXJ5dGhpbmcgYnV0IGBpc1Zpc2libGVgKS4gKi9cbnR5cGUgRHJvcGRvd25Db250ZW50ID0gT21pdDxEcm9wZG93blZtLCBcImlzVmlzaWJsZVwiPjtcblxuLyoqXG4gKiBUaWVyIDIgZHJvcGRvd24gY29tcG9uZW50IOKAlCB0aGUgQW5ndWxhciBlcXVpdmFsZW50IG9mIFJlYWN0J3NcbiAqIGA8QUlBdXRvY29tcGxldGVEcm9wZG93biAvPmAuIFJlbmRlcnMgdGhlIHBpbGxiYXIsIG9wdGlvbnMgZ3JpZCwgYW5kXG4gKiBsb2FkaW5nIHNrZWxldG9uIGJhc2VkIG9uIHRoZSBzdXBwbGllZCBjb250cm9sbGVyJ3MgYGRyb3Bkb3duJGAgc25hcHNob3QuXG4gKlxuICogYGBgaHRtbFxuICogPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93biBbY29udHJvbGxlcl09XCJhY1wiPjwvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPlxuICogYGBgXG4gKlxuICogQWxsIGFjdGlvbnMgKHBpbGwgY2xpY2ssIG9wdGlvbiBzZWxlY3QsIG9wdGlvbiBoaWdobGlnaHQpIGFyZSBmb3J3YXJkZWQgdG9cbiAqIHRoZSBjb250cm9sbGVyLiBDb25zdW1lcnMgd2hvIG5lZWQgdG8gb2JzZXJ2ZSB0aGVzZSBldmVudHMgY2FuIHN1YnNjcmliZVxuICogdG8gdGhlIGNvbnRyb2xsZXIncyBwZXItZmllbGQgb2JzZXJ2YWJsZXMuXG4gKlxuICogQHB1YmxpY1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUGlsbExpc3RDb21wb25lbnQsXG4gICAgUHJvZHVjdFN0cmlwQ29tcG9uZW50LFxuICAgIFN1Z2dlc3Rpb25HcmlkQ29tcG9uZW50LFxuICAgIERhdGVHcmlkQ29tcG9uZW50LFxuICAgIFN0YWNrQ29tcG9uZW50LFxuICAgIENsdXN0ZXJDb21wb25lbnQsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogXCIuL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQuaHRtbFwiLFxuICAvLyBUaGUgc2hhcmVkIGFwcGVhcmFuY2UgbGF5ZXIgY2FycmllcyB0aGUgZGVzaWduIHRva2VucyArIGJveC1zaXppbmcgcmVzZXQgK1xuICAvLyBvcHRpb25zUG9zaXRpb24gcmV2ZXJzYWwsIHNvIGEgc3RhbmRhbG9uZSBkcm9wZG93biAobm8gVGllciAxIGNvbXBvbmVudCBvblxuICAvLyB0aGUgcGFnZSkgaXMgZnVsbHkgc3R5bGVkIG9uY2UgYG1vZGVgIGlzIHNldC5cbiAgc3R5bGVVcmxzOiBbXCIuLi9zaGFyZWQvYXBwZWFyYW5jZS5jc3NcIiwgXCIuL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQuY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveVxue1xuICAvKiogVGhlIGNvbnRyb2xsZXIgdGhhdCBvd25zIHRoZSBhdXRvY29tcGxldGUgc3RhdGUuIFJlcXVpcmVkLiAqL1xuICBASW5wdXQoKSBjb250cm9sbGVyITogQUlBdXRvY29tcGxldGVDb250cm9sbGVyO1xuICAvKiogV2hldGhlciB0byByZW5kZXIgdGhlIHBpbGxiYXIgYWJvdmUgdGhlIG9wdGlvbnMgZ3JpZC4gRGVmYXVsdDogdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2hvd1BpbGxzID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBpbGxiYXIgZW5kcyBpbiBhIHNtYWxsIFwic2tpcFwiIGJ1dHRvbiB0aGF0IGRpc21pc3NlcyB0aGVcbiAgICogYWN0aXZlIHBpbGwg4oCUIHNhbWUgYWN0aW9uIGFzIHByZXNzaW5nIOKGkiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gSXQgc2l0c1xuICAgKiBhdCB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYmFyOiB2aXN1YWxseSB0b3AtcmlnaHQgd2hlbiB0aGUgZHJvcGRvd25cbiAgICogb3BlbnMgYmVsb3cgdGhlIGlucHV0LCBib3R0b20tcmlnaHQgd2hlbiBgb3B0aW9uc1Bvc2l0aW9uYCBpcyBcImFib3ZlXCIuXG4gICAqIERlZmF1bHQ6IHRydWUuIEhpZGRlbiBhdXRvbWF0aWNhbGx5IGR1cmluZyByZS1lZGl0IGFuZCB3aGlsZSB0aGUgZmFsbGJhY2tcbiAgICogc2tlbGV0b24gcmVuZGVycy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dTa2lwQnV0dG9uID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3B0aW9uIHJvd3MgZHJhdyB0aGVpciBgaWNvbl9zdmdgIGJlZm9yZSB0aGUgdGV4dC4gRGVmYXVsdDogdHJ1ZS5cbiAgICogU2V0IHRvIGZhbHNlIHRvIHJlbmRlciBvcHRpb24gcm93cyBhcyB0ZXh0IG9ubHkuXG4gICAqL1xuICBASW5wdXQoKSBzaG93T3B0aW9uSWNvbnMgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciBvcHRpb24gcm93cyBkcmF3IHRoZWlyIGBpbWFnZV91cmxgIGFzIGEgc3F1YXJlIHRodW1ibmFpbCBiZWZvcmVcbiAgICogdGhlIHRleHQsIGluIHBsYWNlIG9mIHRoZSBpY29uLiBEZWZhdWx0OiB0cnVlLiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyXG4gICAqIG9wdGlvbiByb3dzIHdpdGhvdXQgcGljdHVyZXMuXG4gICAqL1xuICBASW5wdXQoKSBzaG93T3B0aW9uSW1hZ2VzID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3B0aW9uIHJvd3Mgc2hvdyB0aGVpciBgaXRlbV9jb3VudGAgYXMgYSBtdXRlZCBsYWJlbCBhdCB0aGVcbiAgICogdHJhaWxpbmcgZWRnZSAoXCIxMiBpdGVtc1wiKS4gRGVmYXVsdDogdHJ1ZS4gU2V0IHRvIGZhbHNlIHRvIGhpZGUgdGhlIGNvdW50cy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dPcHRpb25Db3VudHMgPSB0cnVlO1xuICAvKipcbiAgICogSG93IHRoZSBwcm9kdWN0IHN0cmlwIGxheXMgaXRzIGNhcmRzIG91dDogYSBob3Jpem9udGFsbHkgc2Nyb2xsaW5nIHJvd1xuICAgKiAodGhlIGRlZmF1bHQpLCBvciB0aGUgc2FtZSBjYXJkcyBzdGFja2VkIGFzIGZ1bGwtd2lkdGggcm93cy5cbiAgICovXG4gIEBJbnB1dCgpIHByb2R1Y3RzTGF5b3V0OiBQcm9kdWN0c0xheW91dCA9IFwicm93XCI7XG4gIC8qKiBNaXNzaW5nL2ZhaWxlZCBpbWFnZSBmYWxsYmFjay4gU3R5bGUgaW5pdGlhbHMgd2l0aCBgW2RhdGEtYWlhLXByb2R1Y3QtaW5pdGlhbF1gLiAqL1xuICBASW5wdXQoKSBwcm9kdWN0SW1hZ2VGYWxsYmFjazogUHJvZHVjdEltYWdlRmFsbGJhY2sgPSBcImltYWdlXCI7XG4gIC8qKiBPcHRpb25hbCBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgZHJvcGRvd24gcm9vdC4gKi9cbiAgQElucHV0KCkgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQ29sb3IgbW9kZSBmb3IgYSBzdGFuZGFsb25lIGRyb3Bkb3duLiBXaGVuIHNldCwgdGhlIGRyb3Bkb3duIHNlbGYtc2NvcGVzIHRoZVxuICAgKiBkZXNpZ24gdG9rZW5zIHRvIGl0cyBvd24gcm9vdCAoYWRkcyBgbWFnaWN4LWFpYWAgKyBgZGF0YS1tb2RlYCksIHNvIGl0IG5lZWRzXG4gICAqIG5vIGAubWFnaWN4LWFpYWAgd3JhcHBlci4gYFwiYXV0b1wiYCBmb2xsb3dzIGBwcmVmZXJzLWNvbG9yLXNjaGVtZWAuIExlYXZlIGl0XG4gICAqIHVuc2V0IHdoZW4gdGhlIGRyb3Bkb3duIHNpdHMgaW5zaWRlIGEgYC5tYWdpY3gtYWlhYCBhbmNlc3RvciAoZS5nLiBUaWVyIDEpLlxuICAgKi9cbiAgQElucHV0KCkgbW9kZT86IEFwcGVhcmFuY2VNb2RlO1xuXG4gIC8qKiBDb25jcmV0ZSByZXNvbHZlZCBtb2RlLCBvciBudWxsIHdoZW4gYG1vZGVgIGlzIHVuc2V0IChpbmhlcml0IGZyb20gYW5jZXN0b3IpLiAqL1xuICByZXNvbHZlZE1vZGU6IFwibGlnaHRcIiB8IFwiZGFya1wiIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kZU1xbD86IE1lZGlhUXVlcnlMaXN0O1xuICBwcml2YXRlIG1vZGVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAvKiogUm9vdCBjbGFzcyBsaXN0IOKAlCBhZGRzIGBtYWdpY3gtYWlhYCBvbmx5IHdoZW4gc2VsZi1zY29waW5nIHZpYSBgbW9kZWAuICovXG4gIGdldCByb290Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBsZXQgY2xzID0gXCJtYWdpY3gtYWlhLWRyb3Bkb3duXCI7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWRNb2RlKSBjbHMgKz0gXCIgbWFnaWN4LWFpYVwiO1xuICAgIGlmICh0aGlzLmNsYXNzTmFtZSkgY2xzICs9IGAgJHt0aGlzLmNsYXNzTmFtZX1gO1xuICAgIHJldHVybiBjbHM7XG4gIH1cblxuICAvKiogRmFsbGJhY2sgc2tlbGV0b24tYmFyIHdpZHRocyB1c2VkIHdoZW4gbG9hZGluZyB3aXRoIHplcm8gY2FjaGVkIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHMgPSBbMTU5LCAxMTksIDE2NF07XG5cbiAgLyoqIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgXCJtb3JlIGJlbG93XCIgc2Nyb2xsIGFycm93LiAqL1xuICByZWFkb25seSBzY3JvbGxBcnJvd0xhYmVsID0gU0NST0xMX0FSUk9XX0xBQkVMO1xuXG4gIC8vIFRoZSBkcm9wZG93biByb290IGFuZCB0aGUgYXJyb3cgYnV0dG9uIGxpdmUgdW5kZXIgdGhlIGAqbmdJZmAgb24gdm0kLCBzb1xuICAvLyB0aGV5IGNvbWUgYW5kIGdvIHdpdGggaXQg4oCUIGhlbmNlIG5vbi1zdGF0aWMgcXVlcmllcywgcmUtcmVhZCBldmVyeSBjaGVjay5cbiAgQFZpZXdDaGlsZChcImRyb3Bkb3duUm9vdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBkcm9wZG93blJvb3RSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInNjcm9sbEFycm93XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIHNjcm9sbEFycm93UmVmPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIC8qKiBUaGUgZ3JpZCB0aGUgc2Nyb2xsLWFycm93IGNvbnRyb2xsZXIgaXMgY3VycmVudGx5IGJvdW5kIHRvLiAqL1xuICBwcml2YXRlIHNjcm9sbEFycm93QmluZGluZzogeyBncmlkOiBIVE1MRWxlbWVudDsgY29udHJvbGxlcjogU2Nyb2xsQXJyb3dDb250cm9sbGVyIH0gfCBudWxsID1cbiAgICBudWxsO1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGlvbi9icmFuZGluZyBsaW5rIFVSTCBmb3IgdGhlIGZvb3Rlciwgd2l0aCBhIGB1dG1fc291cmNlYCBkZXJpdmVkXG4gICAqIGZyb20gdGhlIGVtYmVkZGluZyBwYWdlJ3MgaG9zdG5hbWUgKHNlZSB7QGxpbmsgYnVpbGRBdHRyaWJ1dGlvblVybH0pLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmRIcmVmID0gYnVpbGRBdHRyaWJ1dGlvblVybCgpO1xuXG4gIC8qKlxuICAgKiBWaWV3LW1vZGVsIGRlcml2ZWQgZnJvbSB0aGUgY29udHJvbGxlcidzIGBkcm9wZG93biRgLiBBZGRzIHRocmVlIGJvb2xlYW5zXG4gICAqIChgc2hvd3NQaWxsc2AsIGBzaG93c09wdGlvbnNgLCBgc2hvd3NGYWxsYmFja1NrZWxldG9uYCwgYGlzVmlzaWJsZWApIHRoYXRcbiAgICoga2VlcCB0ZW1wbGF0ZS1sZXZlbCBsb2dpYyB0byBhIHByb3BlcnR5IHJlYWQgcGVyIMKnMTkuNi5cbiAgICpcbiAgICogSW5pdGlhbGl6ZWQgb25jZSBpbiBgbmdPbkluaXRgIOKAlCBtdXN0IE5PVCBiZSBhIGdldHRlci4gQSBnZXR0ZXIgcmV0dXJucyBhXG4gICAqIGZyZXNoIGBPYnNlcnZhYmxlYCBpbnN0YW5jZSBvbiBldmVyeSBwcm9wZXJ0eSByZWFkOyB3aXRoIE9uUHVzaCArIGBhc3luY2BcbiAgICogcGlwZSB0aGF0IG1lYW5zIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBjeWNsZSB1bnN1YnNjcmliZXMvcmVzdWJzY3JpYmVzLFxuICAgKiBjYXVzaW5nIHRoZSBgKm5nSWY9XCJ2bSQgfCBhc3luYyBhcyB2bVwiYCByb290IHRvIGJyaWVmbHkgcmVzb2x2ZSBgbnVsbGBcbiAgICogYW5kIGZsaWNrZXIgdGhlIGVudGlyZSBkcm9wZG93biBET00uXG4gICAqL1xuICB2bSQhOiBPYnNlcnZhYmxlPERyb3Bkb3duVm0+O1xuXG4gIC8vIEJyaWRnZSBmb3IgdGhlIEBJbnB1dCBgc2hvd1BpbGxzYCBpbnRvIHRoZSByZWFjdGl2ZSBwaXBlbGluZS4gV2l0aG91dCB0aGlzLFxuICAvLyBjaGFuZ2luZyB0aGUgaW5wdXQgYWZ0ZXIgaW5pdCB3b3VsZG4ndCB0cmlnZ2VyIGEgbmV3IHZtIGVtaXNzaW9uIHVudGlsIHRoZVxuICAvLyBuZXh0IGNvbnRyb2xsZXIuZHJvcGRvd24kIHRpY2sg4oCUIGFuZCB3ZSdkIGxvc2UgdGhlIHNob3dQaWxscyB1cGRhdGUgZW50aXJlbHlcbiAgLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgaWRsZS4gVXBkYXRlZCBmcm9tIG5nT25DaGFuZ2VzIGJlbG93LlxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dQaWxscyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAvLyBTYW1lIGJyaWRnZSwgZm9yIGBzaG93U2tpcEJ1dHRvbmAuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1NraXBCdXR0b24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd09wdGlvbkljb25zYC5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3B0aW9uSWNvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd09wdGlvbkltYWdlc2AgYW5kIGBzaG93T3B0aW9uQ291bnRzYC5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3B0aW9uSW1hZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd09wdGlvbkNvdW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8vIExhc3QgY29udGVudCBlbWl0dGVkIHdoaWxlIHRoZSBkcm9wZG93biB3YXMgdmlzaWJsZS4gUmV1c2VkIGR1cmluZyB0aGVcbiAgLy8gY2xvc2UgZmFkZSBzbyB0aGUgcG9wdWxhdGVkIGRyb3Bkb3duIGZhZGVzIG91dCBhcyBvbmUg4oCUIHNlZSBpbml0Vm0uXG4gIHByaXZhdGUgbGFzdFZpc2libGVDb250ZW50OiBEcm9wZG93bkNvbnRlbnQgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIHRoZSBpbnB1dCBicmlkZ2VzIGZyb20gdGhlaXIgcmVzb2x2ZWQgdmFsdWVzIGF0IGluaXQgdGltZS5cbiAgICB0aGlzLnNob3dQaWxscyQubmV4dCh0aGlzLnNob3dQaWxscyk7XG4gICAgdGhpcy5zaG93U2tpcEJ1dHRvbiQubmV4dCh0aGlzLnNob3dTa2lwQnV0dG9uKTtcbiAgICB0aGlzLnNob3dPcHRpb25JY29ucyQubmV4dCh0aGlzLnNob3dPcHRpb25JY29ucyk7XG4gICAgdGhpcy5zaG93T3B0aW9uSW1hZ2VzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkltYWdlcyk7XG4gICAgdGhpcy5zaG93T3B0aW9uQ291bnRzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkNvdW50cyk7XG4gICAgdGhpcy5hcHBseU1vZGUoKTtcbiAgICB0aGlzLmluaXRWbSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW1wic2hvd1BpbGxzXCJdKSB7XG4gICAgICB0aGlzLnNob3dQaWxscyQubmV4dCh0aGlzLnNob3dQaWxscyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wic2hvd1NraXBCdXR0b25cIl0pIHtcbiAgICAgIHRoaXMuc2hvd1NraXBCdXR0b24kLm5leHQodGhpcy5zaG93U2tpcEJ1dHRvbik7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wic2hvd09wdGlvbkljb25zXCJdKSB7XG4gICAgICB0aGlzLnNob3dPcHRpb25JY29ucyQubmV4dCh0aGlzLnNob3dPcHRpb25JY29ucyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wic2hvd09wdGlvbkltYWdlc1wiXSkge1xuICAgICAgdGhpcy5zaG93T3B0aW9uSW1hZ2VzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkltYWdlcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wic2hvd09wdGlvbkNvdW50c1wiXSkge1xuICAgICAgdGhpcy5zaG93T3B0aW9uQ291bnRzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkNvdW50cyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wibW9kZVwiXSAmJiAhY2hhbmdlc1tcIm1vZGVcIl0uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMuYXBwbHlNb2RlKCk7XG4gICAgfVxuICAgIC8vIFJlLWJpbmQgdm0kIHdoZW4gdGhlIGNvbnRyb2xsZXIgQElucHV0IGlzIHN3YXBwZWQgKGUuZy4gYSBtdWx0aS1zdGVwIGZvcm1cbiAgICAvLyB0b2dnbGluZyBiZXR3ZWVuIGNvbnRyb2xsZXJzKS4gV2l0aG91dCB0aGlzLCB2bSQgc3RheXMgc3Vic2NyaWJlZCB0byB0aGVcbiAgICAvLyBwcmV2aW91cyBjb250cm9sbGVyJ3MgZHJvcGRvd24kIOKAlCByZW5kZXJpbmcgc3RhbGUgb3B0aW9ucywgb3IsIGlmIHRoYXRcbiAgICAvLyBjb250cm9sbGVyIHdhcyBkZXN0cm95KCktZWQsIHJlY2VpdmluZyBhIGNvbXBsZXRpb24gdGhhdCBjb2xsYXBzZXMgdGhlXG4gICAgLy8gZHJvcGRvd24gcGVybWFuZW50bHkuIFNraXAgdGhlIGZpcnN0IGNoYW5nZTogbmdPbkNoYW5nZXMgZmlyZXMgYmVmb3JlXG4gICAgLy8gbmdPbkluaXQsIHdoaWNoIG93bnMgdGhlIGluaXRpYWwgY3JlYXRpb24uXG4gICAgaWYgKGNoYW5nZXNbXCJjb250cm9sbGVyXCJdICYmICFjaGFuZ2VzW1wiY29udHJvbGxlclwiXS5maXJzdENoYW5nZSAmJiB0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuaW5pdFZtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGNvcmUncyBcIm1vcmUgYmVsb3dcIiBhcnJvdyBjb250cm9sbGVyIGJvdW5kIHRvIHdoaWNoZXZlciBvcHRpb25zXG4gICAqIGdyaWQgaXMgY3VycmVudGx5IHJlbmRlcmVkIOKAlCB0aGUgQW5ndWxhciBhbmFsb2d1ZSBvZiBSZWFjdCdzXG4gICAqIHVzZVNjcm9sbEFycm93LiBUaGUgY29udHJvbGxlciBvd25zIHRoZSBiZWhhdmlvdXIgKG1lYXN1cmluZywgdmlzaWJpbGl0eSxcbiAgICogdGhlIHBhZ2Utc2Nyb2xsIG9uIGNsaWNrIOKAlCBzZWUgdGhlIGNvcmUncyBzY3JvbGxBcnJvdy50cyk7IHRoaXMgb25seSBoYW5kc1xuICAgKiBpdCB0aGUgbGl2ZSBlbGVtZW50cyBhZnRlciBlYWNoIHZpZXcgY2hlY2ssIHJlLWF0dGFjaGluZyB3aGVuIHRoZSBncmlkXG4gICAqIGVsZW1lbnQgaXMgcmVwbGFjZWQgYW5kIHRlYXJpbmcgZG93biB3aGVuIHRoZXJlIGlzIG5vIGdyaWQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZHJvcGRvd25Sb290UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuc2Nyb2xsQXJyb3dSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZ3JpZCA9IHJvb3Q/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLmFpYS1ncmlkW2RhdGEtc2Nyb2xsXVwiKSA/PyBudWxsO1xuICAgIGlmICh0aGlzLnNjcm9sbEFycm93QmluZGluZyAmJiB0aGlzLnNjcm9sbEFycm93QmluZGluZy5ncmlkICE9PSBncmlkKSB7XG4gICAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZy5jb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2Nyb2xsQXJyb3dCaW5kaW5nID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFyb290IHx8ICFidXR0b24gfHwgIWdyaWQpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsQXJyb3dCaW5kaW5nKSB7XG4gICAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZyA9IHtcbiAgICAgICAgZ3JpZCxcbiAgICAgICAgY29udHJvbGxlcjogYXR0YWNoU2Nyb2xsQXJyb3coeyBkcm9wZG93bjogcm9vdCwgZ3JpZCwgYnV0dG9uIH0pLFxuICAgICAgfTtcbiAgICAgIHJldHVybjsgLy8gYXR0YWNoKCkgcnVucyB0aGUgZmlyc3QgdXBkYXRlIGl0c2VsZlxuICAgIH1cbiAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZy5jb250cm9sbGVyLnVwZGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50ZWFyZG93bk1vZGVMaXN0ZW5lcigpO1xuICAgIHRoaXMuc2Nyb2xsQXJyb3dCaW5kaW5nPy5jb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZyA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYG1vZGVgIGlucHV0IGludG8gYHJlc29sdmVkTW9kZWAuIFVuc2V0IOKGkiBudWxsICh0aGUgZHJvcGRvd25cbiAgICogc3RheXMgY2xhc3MtbGVzcyBhbmQgaW5oZXJpdHMgZnJvbSBhIGAubWFnaWN4LWFpYWAgYW5jZXN0b3IpLiBgXCJhdXRvXCJgIHJlYWRzXG4gICAqIGBwcmVmZXJzLWNvbG9yLXNjaGVtZWAgYW5kIHRyYWNrcyBpdCBsaXZlIHZpYSBhIG1lZGlhLXF1ZXJ5IGxpc3RlbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy50ZWFyZG93bk1vZGVMaXN0ZW5lcigpO1xuICAgIGlmICh0aGlzLm1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSBcImxpZ2h0XCIgfHwgdGhpcy5tb2RlID09PSBcImRhcmtcIikge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFwiYXV0b1wiXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gXCJsaWdodFwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vZGVNcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIik7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGVNcWwubWF0Y2hlcyA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuICAgIHRoaXMubW9kZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGVNcWw/Lm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH07XG4gICAgdGhpcy5tb2RlTXFsLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5tb2RlTGlzdGVuZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZWFyZG93bk1vZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlTXFsICYmIHRoaXMubW9kZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLm1vZGVNcWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm1vZGVMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMubW9kZU1xbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1vZGVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgdmlldy1tb2RlbCBzdHJlYW0gZnJvbSB0aGUgY3VycmVudCBjb250cm9sbGVyICsgc2hvd1BpbGxzJC4gKi9cbiAgcHJpdmF0ZSBpbml0Vm0oKTogdm9pZCB7XG4gICAgdGhpcy52bSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY29udHJvbGxlci5kcm9wZG93biQsXG4gICAgICB0aGlzLnNob3dQaWxscyQsXG4gICAgICB0aGlzLnNob3dTa2lwQnV0dG9uJCxcbiAgICAgIHRoaXMuc2hvd09wdGlvbkljb25zJCxcbiAgICAgIHRoaXMuc2hvd09wdGlvbkltYWdlcyQsXG4gICAgICB0aGlzLnNob3dPcHRpb25Db3VudHMkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbZGQsIHNob3dQaWxscywgc2hvd1NraXBCdXR0b24sIHNob3dPcHRpb25JY29ucywgc2hvd09wdGlvbkltYWdlcywgc2hvd09wdGlvbkNvdW50c10pID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gZGQuc3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGl2ZVN1Z2dlc3Rpb24/Lm9wdGlvbnMgPz8gW107XG4gICAgICAgICAgY29uc3Qgc2hvd3NQaWxscyA9IHNob3dQaWxscyAmJiAoZGQucGlsbHMubGVuZ3RoID4gMCB8fCBkZC5pc0xvYWRpbmcpO1xuICAgICAgICAgIC8vIFRoZSB0cmFpbGluZyBcInNraXBcIiBidXR0b24gb25seSBtYWtlcyBzZW5zZSBuZXh0IHRvIGEgcmVhbCxcbiAgICAgICAgICAvLyBza2lwcGFibGUgcGlsbCDigJQgbmV2ZXIgb24gdGhlIGZhbGxiYWNrIHNrZWxldG9uIGJhciwgYW5kIG5ldmVyXG4gICAgICAgICAgLy8gZHVyaW5nIHJlLWVkaXQgKHRoZSBiYXIgdGhlbiBzaG93cyBhbiBhbHJlYWR5IGFuc3dlcmVkIHBhcmFtKS5cbiAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGdhdGVkIG9uIHNob3dzUGlsbHM6IHdpdGggcGlsbHMgcmVuZGVyZWQgZWxzZXdoZXJlXG4gICAgICAgICAgLy8gKHBpbGxQbGFjZW1lbnQgXCJpbmxpbmVcIi9cImhpZGRlblwiKSB0aGUgYmFyIHJlbmRlcnMgYXMgYSBza2lwLW9ubHlcbiAgICAgICAgICAvLyByb3cgaG9sZGluZyBqdXN0IHRoZSBidXR0b24uIEhpZGRlbiB3aGlsZSB0aGUgaW5wdXQgaXMgZW1wdHkg4oCUIHRoZVxuICAgICAgICAgIC8vIGZvb3RlciBoaW50IGRvZXNuJ3QgYWR2ZXJ0aXNlIFwi4oaSIHRvIHNraXBcIiB1bnRpbCB0aGUgdXNlciBoYXMgdHlwZWQsXG4gICAgICAgICAgLy8gc28gdGhlIHByaXN0aW5lIHN0YXJ0aW5nIHN0YXRlIHN0YXlzIGZyZWUgb2YgdGhlIGFmZm9yZGFuY2UgdG9vLlxuICAgICAgICAgIGNvbnN0IHNob3dzU2tpcCA9XG4gICAgICAgICAgICBkZC5waWxscy5sZW5ndGggPiAwICYmIHNob3dTa2lwQnV0dG9uICYmICFkZC5pc0VkaXRpbmcgJiYgIWRkLmlzSW5wdXRFbXB0eTtcbiAgICAgICAgICAvLyBFeGFjdGx5IG9uZSBib2R5IHJlbmRlcnMuIGBvcHRpb25zYCBhYm92ZSBhbHJlYWR5IGhvbGRzIHRoZSB2aXNpYmxlXG4gICAgICAgICAgLy8gbW9udGgncyBjZWxscyB3aGVuIHRoaXMgaXMgYSBkYXRlIOKAlCB0aGUgY29yZSBzd2FwcGVkIHRoZW0gaW4gaXRzXG4gICAgICAgICAgLy8gZGVyaXZlIGxheWVyIOKAlCBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBsaXN0IGRyYXduIHR3byBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB3YXlzLCBhbmQgbmV2ZXIgYm90aCBhdCBvbmNlICh0d28gZWxlbWVudHMgYW5zd2VyaW5nIHRvIHRoZSBzYW1lXG4gICAgICAgICAgLy8gb3B0aW9uIGlkIHdvdWxkIGJyZWFrIGtleWJvYXJkIGNvbW1pdCkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBBIGNhbGVuZGFyIGlzIHdpdGhoZWxkIHdoaWxlIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuIFRoZSBvcHRpb25zXG4gICAgICAgICAgLy8gZ3JpZCBkcmF3cyBpdHMgY2FjaGVkIG9wdGlvbnMgYXMgc2tlbGV0b24gcm93cyBmb3IgdGhhdCB3aW5kb3csIGJ1dFxuICAgICAgICAgIC8vIGEgbW9udGggb2YgZGF5IGNlbGxzIGhhcyBubyBza2VsZXRvbiBmb3JtIHdvcnRoIGRyYXdpbmcg4oCUIGFuZCBhIGxpdmVcbiAgICAgICAgICAvLyBjYWxlbmRhciBvdmVyIGEgbG9hZGluZyBwaWxsIGJhciBpbnZpdGVzIGFuIGFuc3dlciBhZ2FpbnN0XG4gICAgICAgICAgLy8gc3VnZ2VzdGlvbnMgdGhlIHJlc3BvbnNlIGlzIGFib3V0IHRvIHJlcGxhY2UuIFRoZSBmYWxsYmFjayBiYXJzXG4gICAgICAgICAgLy8gc3RhbmQgaW4gdW50aWwgaXQgbGFuZHMuXG4gICAgICAgICAgY29uc3QgaXNEYXRlID0gaXNDYWxlbmRhckZvcm1hdChkZC5mb3JtYXRUeXBlID8/IFwib3B0aW9uc1wiKSAmJiBkZC5kYXRlVmlldyAhPSBudWxsO1xuICAgICAgICAgIGNvbnN0IHNob3dzT3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiAhaXNEYXRlO1xuICAgICAgICAgIGNvbnN0IHNob3dzRGF0ZUdyaWQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgaXNEYXRlICYmICFkZC5pc0xvYWRpbmc7XG4gICAgICAgICAgY29uc3Qgc2hvd3NGYWxsYmFja1NrZWxldG9uID0gZGQuaXNMb2FkaW5nICYmICFzaG93c09wdGlvbnMgJiYgIXNob3dzRGF0ZUdyaWQ7XG4gICAgICAgICAgLy8gRWl0aGVyIGhhbGYgaXMgZW5vdWdoIHRvIGtlZXAgdGhlIHBhbmVsIHVwOiBwcm9kdWN0cyByZW5kZXIgd2l0aCBub1xuICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zLCBzdWdnZXN0aW9ucyByZW5kZXIgd2l0aCBubyBwcm9kdWN0cy5cbiAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPVxuICAgICAgICAgICAgZGQuaXNPcGVuICYmXG4gICAgICAgICAgICAoc2hvd3NPcHRpb25zIHx8IHNob3dzRGF0ZUdyaWQgfHwgc2hvd3NQaWxscyB8fCBkZC5pc0xvYWRpbmcgfHwgZGQucHJvZHVjdHMubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgICAvLyBXaGlsZSBjbG9zaW5nLCByZXVzZSB0aGUgbGFzdCB2aXNpYmxlIGNvbnRlbnQgc28gdGhlIHBvcHVsYXRlZFxuICAgICAgICAgIC8vIGRyb3Bkb3duIGZhZGVzIG91dCBhcyBvbmUuIE90aGVyd2lzZSB0aGUgcGlsbHMvb3B0aW9ucyB2YW5pc2ggdGhlXG4gICAgICAgICAgLy8gaW5zdGFudCB0aGUgc3RhdGUgZW1wdGllcyAoZS5nLiBza2lwcGluZyB0aGUgbGFzdCBwaWxsIHdpdGgg4oaSKSxcbiAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhbHdheXMtcHJlc2VudCBmb290ZXIgYWxvbmUgZm9yIGEgZmxhc2ggb2YgYSBmb290ZXItb25seVxuICAgICAgICAgIC8vIFwibm8gb3B0aW9uc1wiIGJveCBtaWQtZmFkZS4gT25seSBgaXNWaXNpYmxlYCB0cmFja3MgbGl2ZSBzdGF0ZSB0b1xuICAgICAgICAgIC8vIGRyaXZlIHRoZSBvcGFjaXR5IHRyYW5zaXRpb24uXG4gICAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgdGhpcy5sYXN0VmlzaWJsZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRoaXMubGFzdFZpc2libGVDb250ZW50LCBpc1Zpc2libGU6IGZhbHNlIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb3B0aW9uSGlnaGxpZ2h0ZWQgPVxuICAgICAgICAgICAgZGQuYWN0aXZlSW5kZXggPj0gMCAmJiBCb29sZWFuKG9wdGlvbnNbZGQuYWN0aXZlSW5kZXhdPy5pc190YXBwYWJsZSk7XG4gICAgICAgICAgY29uc3QgeyBrZXk6IGZvb3RlcktleSwgaGludDogZm9vdGVySGludCB9ID0gZ2V0Rm9vdGVySGludChcbiAgICAgICAgICAgIG9wdGlvbkhpZ2hsaWdodGVkLFxuICAgICAgICAgICAgZGQuaXNJbnB1dEVtcHR5LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29udGVudDogRHJvcGRvd25Db250ZW50ID0ge1xuICAgICAgICAgICAgcGlsbHM6IGRkLnBpbGxzLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGFjdGl2ZUluZGV4OiBkZC5hY3RpdmVJbmRleCxcbiAgICAgICAgICAgIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBkZC5pc0FjdGl2ZVBpbGxTZWxlY3RlZCxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZGQuaXNMb2FkaW5nLFxuICAgICAgICAgICAgc2tlbGV0b25FeGl0aW5nOiBCb29sZWFuKGRkLnNrZWxldG9uRXhpdGluZyksXG4gICAgICAgICAgICBzaG93c1BpbGxzLFxuICAgICAgICAgICAgc2hvd3NTa2lwLFxuICAgICAgICAgICAgc2tpcERpc2FibGVkOiBkZC5pc0xvYWRpbmcgfHwgQm9vbGVhbihkZC5pblNlbGVjdGlvbkFuaW1hdGlvbiksXG4gICAgICAgICAgICBhY3RpdmVQaWxsTGFiZWw6IGRkLnBpbGxzWzBdPy50ZXh0ID8/IFwiXCIsXG4gICAgICAgICAgICBzaG93c09wdGlvbnMsXG4gICAgICAgICAgICBzaG93c0RhdGVHcmlkLFxuICAgICAgICAgICAgZGF0ZVZpZXc6IGRkLmRhdGVWaWV3ID8/IG51bGwsXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkSXNvOiBkZC5zZWxlY3RlZERhdGVJc28gPz8gbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZTogZGQuc2VsZWN0ZWREYXRlUmFuZ2UgPz8gbnVsbCxcbiAgICAgICAgICAgICAgcmFuZ2VTdGFydDogZGQuZGF0ZVJhbmdlU3RhcnQgPz8gbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaG93c0ZhbGxiYWNrU2tlbGV0b24sXG4gICAgICAgICAgICBwcm9kdWN0czogZGQucHJvZHVjdHMsXG4gICAgICAgICAgICBncm91cEtleTogYWN0aXZlU3VnZ2VzdGlvbiA/IGAke2FjdGl2ZVN1Z2dlc3Rpb24udHlwZX0gJHthY3RpdmVTdWdnZXN0aW9uLnRleHR9YCA6IFwiXCIsXG4gICAgICAgICAgICBmb290ZXJLZXksXG4gICAgICAgICAgICBmb290ZXJIaW50LFxuICAgICAgICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBkZC5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgICAgICBzaG93T3B0aW9uSWNvbnMsXG4gICAgICAgICAgICBzaG93T3B0aW9uSW1hZ2VzLFxuICAgICAgICAgICAgc2hvd09wdGlvbkNvdW50cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc1Zpc2libGUpIHRoaXMubGFzdFZpc2libGVDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICByZXR1cm4geyAuLi5jb250ZW50LCBpc1Zpc2libGUgfTtcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHRyYWNrQnlXaWR0aCA9IChfOiBudW1iZXIsIHc6IG51bWJlcik6IG51bWJlciA9PiB3O1xuXG4gIG9uUGlsbENsaWNrKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlUGlsbChpbmRleCk7XG4gIH1cblxuICBvblNraXAoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNraXBBY3RpdmVQaWxsKCk7XG4gIH1cblxuICBvblNlbGVjdChvcHRpb246IFN1Z2dlc3Rpb25PcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICBvblByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNob3dQcmV2aW91c01vbnRoKCk7XG4gIH1cblxuICBvbk5leHRNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2hvd05leHRNb250aCgpO1xuICB9XG5cbiAgb25IaWdobGlnaHQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8vIEEgaG92ZXIgaGlnaGxpZ2h0IGVuZHMgd2l0aCB0aGUgaG92ZXIg4oCUIHNlZSB0aGUgY29yZSdzIGBjbGVhckhpZ2hsaWdodGAuXG4gIG9uVW5oaWdobGlnaHQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5jbGVhckhpZ2hsaWdodChpbmRleCk7XG4gIH1cblxuICBvblByb2R1Y3RTZWxlY3QocHJvZHVjdDogUHJvZHVjdCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZWxlY3RQcm9kdWN0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FyZCB0YWtpbmcgZm9jdXMgYmx1cnMgdGhlIGVkaXRvciwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNsb3NlIHRoZVxuICAgKiBwYW5lbCBvdXQgZnJvbSB1bmRlciB0aGUgY2FyZCB0aGUgdXNlciBqdXN0IHRhYmJlZCB0by5cbiAgICovXG4gIG9uUHJvZHVjdEZvY3VzQ2hhbmdlKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0Rm9jdXNlZChmb2N1c2VkKTtcbiAgfVxuXG4gIHByZXZlbnRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGxvc2luZyBmb2N1cyB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGRyb3Bkb3duLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJ2bSQgfCBhc3luYyBhcyB2bVwiXG4gICNkcm9wZG93blJvb3RcbiAgW2lkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgcm9sZT1cImxpc3Rib3hcIlxuICBkYXRhLWFpYS1kcm9wZG93bj1cIlwiXG4gIFthdHRyLmRhdGEtYWlhLWxvYWRpbmddPVwidm0uaXNMb2FkaW5nID8gJycgOiBudWxsXCJcbiAgW2F0dHIuZGF0YS1haWEtc2tlbGV0b24tZXhpdGluZ109XCJ2bS5za2VsZXRvbkV4aXRpbmcgPyAnJyA6IG51bGxcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cInZtLm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYWlhLWhhcy1wcm9kdWN0c109XCJ2bS5wcm9kdWN0cy5sZW5ndGggPiAwID8gJycgOiBudWxsXCJcbiAgW2NsYXNzXT1cInJvb3RDbGFzc1wiXG4gIFtjbGFzcy5tYWdpY3gtYWlhLWRyb3Bkb3duLXZpc2libGVdPVwidm0uaXNWaXNpYmxlXCJcbiAgKG1vdXNlZG93bik9XCJwcmV2ZW50Qmx1cigkZXZlbnQpXCJcbj5cbiAgPGFpYS1zdGFjayBzcGFjZT1cIjhweFwiPlxuICAgIDxhaWEtY2x1c3RlclxuICAgICAgKm5nSWY9XCJ2bS5zaG93c1BpbGxzIHx8IHZtLnNob3dzU2tpcFwiXG4gICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtZHJvcGRvd24tcGlsbGJhclwiXG4gICAgICBkYXRhLWFpYS1waWxsYmFyPVwiXCJcbiAgICAgIFtub1dyYXBdPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPCEtLSBUaGUgc2Nyb2xsICsgcmlnaHQtZWRnZSBmYWRlIGxpdmUgb24gdGhpcyB3cmFwcGVyIChub3QgdGhlIGJhcikgc29cbiAgICAgICAgICAgdGhlIHNraXAgYnV0dG9uIHN0YXlzIG91dHNpZGUgdGhlIG1hc2tlZCByZWdpb24g4oCUIHBpbm5lZCBhbmQgZnVsbHlcbiAgICAgICAgICAgb3BhcXVlIHdoaWxlIG92ZXJmbG93aW5nIHBpbGxzIGZhZGUgdW5kZXIgaXQuIEFic2VudCBpbiBhIHNraXAtb25seVxuICAgICAgICAgICByb3cgKHBpbGxzIHJlbmRlcmVkIGVsc2V3aGVyZSB2aWEgcGlsbFBsYWNlbWVudCBpbmxpbmUvaGlkZGVuKS4gLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cInZtLnNob3dzUGlsbHNcIiBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1zY3JvbGxcIiBkYXRhLWFpYS1waWxsLXNjcm9sbD1cIlwiPlxuICAgICAgICA8YWlhLXBpbGwtbGlzdFxuICAgICAgICAgIFtwaWxsc109XCJ2bS5waWxsc1wiXG4gICAgICAgICAgW2FjdGl2ZVBpbGxJbmRleF09XCIwXCJcbiAgICAgICAgICBbYWN0aXZlU2VsZWN0ZWRdPVwidm0uaXNBY3RpdmVQaWxsU2VsZWN0ZWRcIlxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICAgICAgKHNlbGVjdFBpbGwpPVwib25QaWxsQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgID48L2FpYS1waWxsLWxpc3Q+XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwidm0uc2hvd3NTa2lwXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtc2tpcFwiXG4gICAgICAgIGRhdGEtYWlhLXNraXA9XCJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwidm0uc2tpcERpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ2bS5hY3RpdmVQaWxsTGFiZWwgPyAnU2tpcCAnICsgdm0uYWN0aXZlUGlsbExhYmVsIDogJ1NraXAnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU2tpcCgpXCJcbiAgICAgID5cbiAgICAgICAgc2tpcFxuICAgICAgPC9idXR0b24+XG4gICAgPC9haWEtY2x1c3Rlcj5cblxuICAgIDxhaWEtc3VnZ2VzdGlvbi1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzT3B0aW9uc1wiXG4gICAgICBbb3B0aW9uc109XCJ2bS5vcHRpb25zXCJcbiAgICAgIFthY3RpdmVJbmRleF09XCJ2bS5hY3RpdmVJbmRleFwiXG4gICAgICBbbGlzdGJveElkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICBbZ3JvdXBLZXldPVwidm0uZ3JvdXBLZXlcIlxuICAgICAgW29wdGlvbnNQb3NpdGlvbl09XCJ2bS5vcHRpb25zUG9zaXRpb25cIlxuICAgICAgW3Nob3dJY29uc109XCJ2bS5zaG93T3B0aW9uSWNvbnNcIlxuICAgICAgW3Nob3dJbWFnZXNdPVwidm0uc2hvd09wdGlvbkltYWdlc1wiXG4gICAgICBbc2hvd0NvdW50c109XCJ2bS5zaG93T3B0aW9uQ291bnRzXCJcbiAgICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoaGlnaGxpZ2h0KT1cIm9uSGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAgKHVuaGlnaGxpZ2h0KT1cIm9uVW5oaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgPjwvYWlhLXN1Z2dlc3Rpb24tZ3JpZD5cblxuICAgIDxhaWEtZGF0ZS1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzRGF0ZUdyaWRcIlxuICAgICAgW29wdGlvbnNdPVwidm0ub3B0aW9uc1wiXG4gICAgICBbYWN0aXZlSW5kZXhdPVwidm0uYWN0aXZlSW5kZXhcIlxuICAgICAgW2xpc3Rib3hJZF09XCJjb250cm9sbGVyLmxpc3Rib3hJZFwiXG4gICAgICBbdmlld109XCJ2bS5kYXRlVmlld1wiXG4gICAgICBbc2VsZWN0aW9uXT1cInZtLmRhdGVTZWxlY3Rpb25cIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChoaWdobGlnaHQpPVwib25IaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgICAodW5oaWdobGlnaHQpPVwib25VbmhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgICAgIChwcmV2aW91c01vbnRoKT1cIm9uUHJldmlvdXNNb250aCgpXCJcbiAgICAgIChuZXh0TW9udGgpPVwib25OZXh0TW9udGgoKVwiXG4gICAgPjwvYWlhLWRhdGUtZ3JpZD5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidm0uc2hvd3NGYWxsYmFja1NrZWxldG9uXCJcbiAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJzXCJcbiAgICAgIGRhdGEtYWlhLXNrZWxldG9uLWJhcnM9XCJcIlxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0Zvcj1cImxldCB3IG9mIGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHM7IHRyYWNrQnk6IHRyYWNrQnlXaWR0aFwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwid1wiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSAqbmdJZiwgbm90IGp1c3QgdGhlIHNlY3Rpb24ncyBvd24gZ3VhcmQgaW5zaWRlIHRoZSBjb21wb25lbnQ6IHRoZSBob3N0XG4gICAgICAgICBlbGVtZW50IGlzIGFuIGluLWZsb3cgY2hpbGQgb2YgLmFpYS1zdGFjayAoZGlzcGxheTpmbGV4OyBnYXA6OHB4KSwgc29cbiAgICAgICAgIGFuIGFsd2F5cy1pbnN0YW50aWF0ZWQgemVyby1oZWlnaHQgaG9zdCB3b3VsZCBhZGQgYSBTRUNPTkQgOHB4IGdhcFxuICAgICAgICAgYmV0d2VlbiB0aGUgZ3JpZCBhbmQgdGhlIGZvb3RlciDigJQgaW4gZXZlcnkgZHJvcGRvd24sIHByb2R1Y3RzIG9yIG5vdC5cbiAgICAgICAgIFRoZSBncmlkJ3MgLS1haWEtZ3JpZC1vdmVybGFwLWJvdHRvbSBpcyB0dW5lZCBmb3IgZXhhY3RseSBvbmUgZ2FwLCBzb1xuICAgICAgICAgdGhlIGZvb3RlciB3b3VsZCBsYW5kIDhweCBiZWxvdyB0aGUgYmFuZCBpdCBpcyBtZWFudCB0byBjb3Zlci4gLS0+XG4gICAgPGFpYS1wcm9kdWN0LXN0cmlwXG4gICAgICAqbmdJZj1cInZtLnByb2R1Y3RzLmxlbmd0aCA+IDBcIlxuICAgICAgW3Byb2R1Y3RzXT1cInZtLnByb2R1Y3RzXCJcbiAgICAgIFtsaXN0Ym94SWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICAgICAgW2ZvY3VzYWJsZV09XCJ2bS5pc1Zpc2libGVcIlxuICAgICAgW2xheW91dF09XCJwcm9kdWN0c0xheW91dFwiXG4gICAgICBbaW1hZ2VGYWxsYmFja109XCJwcm9kdWN0SW1hZ2VGYWxsYmFja1wiXG4gICAgICAoc2VsZWN0KT1cIm9uUHJvZHVjdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChmb2N1c0NoYW5nZSk9XCJvblByb2R1Y3RGb2N1c0NoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9haWEtcHJvZHVjdC1zdHJpcD5cblxuICAgIDxmb290ZXIgY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3RlclwiIGRhdGEtYWlhLWZvb3Rlcj1cIlwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWhpbnQtZ3JvdXBcIj5cbiAgICAgICAgICA8a2JkIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXIta2V5XCI+e3sgdm0uZm9vdGVyS2V5IH19PC9rYmQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1oaW50XCI+e3sgdm0uZm9vdGVySGludCB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYnJhbmQtbGlua1wiXG4gICAgICAgICAgW2hyZWZdPVwiYnJhbmRIcmVmXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1icmFuZFwiPkFJPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYmFkZ2VcIj5BdXRvY29tcGxldGU8L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9vdGVyPlxuICA8L2FpYS1zdGFjaz5cbiAgPCEtLSBcIk1vcmUgYmVsb3dcIiBhcnJvdyDigJQgYW4gb3ZlcmxheSBvbiB0aGUgcGFuZWwsIG5vdCBhIHNlY3Rpb24gb2YgdGhlXG4gICAgICAgc3RhY2suIFNob3duL3Bvc2l0aW9uZWQgYnkgdGhlIGNvcmUncyBzY3JvbGwtYXJyb3cgY29udHJvbGxlciAoc2VlXG4gICAgICAgc3luY1Njcm9sbEFycm93KTsgbWFya3VwIG1pcnJvcnMgdmFuaWxsYSdzIGNyZWF0ZVNjcm9sbEFycm93QnV0dG9uLiAtLT5cbiAgPGJ1dHRvblxuICAgICNzY3JvbGxBcnJvd1xuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1zY3JvbGwtYXJyb3dcIlxuICAgIGRhdGEtYWlhLXNjcm9sbC1hcnJvdz1cIlwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JvbGxBcnJvd0xhYmVsXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICA+XG4gICAgPHN2Z1xuICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICB3aWR0aD1cIjE4XCJcbiAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIxLjc1XCJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICA+XG4gICAgICA8cGF0aCBkPVwiTTQgNi41IDggMTAuNWw0LTRcIiAvPlxuICAgIDwvc3ZnPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBS04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixhQUFhLEVBR2IsYUFBYSxFQUNiLGdCQUFnQixFQUloQixrQkFBa0IsR0FJbkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBbUIsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMxRixPQUFPLEVBQUUsdUJBQXVC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RSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRXBDLGNBQWM7c0JBRHJCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBcHBlYXJhbmNlTW9kZSxcbiAgYXR0YWNoU2Nyb2xsQXJyb3csXG4gIGJ1aWxkQXR0cmlidXRpb25VcmwsXG4gIGNvbnRhaW5TY3JvbGwsXG4gIHR5cGUgRGF0ZU1vbnRoVmlldyxcbiAgdHlwZSBEYXRlU2VsZWN0aW9uLFxuICBnZXRGb290ZXJIaW50LFxuICBpc0NhbGVuZGFyRm9ybWF0LFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgUHJvZHVjdEltYWdlRmFsbGJhY2ssXG4gIHR5cGUgUHJvZHVjdHNMYXlvdXQsXG4gIFNDUk9MTF9BUlJPV19MQUJFTCxcbiAgdHlwZSBTY3JvbGxBcnJvd0NvbnRyb2xsZXIsXG4gIHR5cGUgU3VnZ2VzdGlvbixcbiAgdHlwZSBTdWdnZXN0aW9uT3B0aW9uLFxufSBmcm9tIFwiQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLXZhbmlsbGFcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgdHlwZSBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGF0ZUdyaWRDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvZGF0ZS1ncmlkL2RhdGUtZ3JpZC5jb21wb25lbnRcIjtcbmltcG9ydCB7IENsdXN0ZXJDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvbGF5b3V0L2NsdXN0ZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBTdGFja0NvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9sYXlvdXQvc3RhY2suY29tcG9uZW50XCI7XG5pbXBvcnQgeyBQaWxsTGlzdENvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9waWxsLWxpc3QvcGlsbC1saXN0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUHJvZHVjdFN0cmlwQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3Byb2R1Y3Qtc3RyaXAvcHJvZHVjdC1zdHJpcC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN1Z2dlc3Rpb25HcmlkQ29tcG9uZW50IH0gZnJvbSBcIi4uL2ludGVybmFsL3N1Z2dlc3Rpb24tZ3JpZC9zdWdnZXN0aW9uLWdyaWQuY29tcG9uZW50XCI7XG5cbmludGVyZmFjZSBEcm9wZG93blZtIHtcbiAgcGlsbHM6IFN1Z2dlc3Rpb25bXTtcbiAgb3B0aW9uczogU3VnZ2VzdGlvbk9wdGlvbltdO1xuICBhY3RpdmVJbmRleDogbnVtYmVyO1xuICBpc0FjdGl2ZVBpbGxTZWxlY3RlZDogYm9vbGVhbjtcbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICAvKiogVGhlIGxvYWRpbmcgc2tlbGV0b24gaXMgZmFkaW5nIG91dCBiZWZvcmUgdGhlIHJlc3BvbnNlJ3Mgb3B0aW9ucyByZXBsYWNlIGl0LiAqL1xuICBza2VsZXRvbkV4aXRpbmc6IGJvb2xlYW47XG4gIHNob3dzUGlsbHM6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBwaWxsYmFyIGVuZHMgaW4gdGhlIHRyYWlsaW5nIFwic2tpcFwiIGJ1dHRvbi4gKi9cbiAgc2hvd3NTa2lwOiBib29sZWFuO1xuICAvKipcbiAgICogRGlzYWJsZWQgc3RhdGUgZm9yIHRoZSBza2lwIGJ1dHRvbjogbG9hZGluZywgb3IgdGhlIHBvc3Qtc2VsZWN0aW9uIHdpbmRvd1xuICAgKiB3aGVyZSBpc0xvYWRpbmcgaXMgc3VwcHJlc3NlZCBidXQgdGhlIGNvcmUncyBza2lwQWN0aXZlUGlsbCgpIG5vLW9wcy5cbiAgICovXG4gIHNraXBEaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqIEFjdGl2ZSBwaWxsJ3MgbGFiZWwsIGZvciB0aGUgc2tpcCBidXR0b24ncyBhcmlhLWxhYmVsLiAqL1xuICBhY3RpdmVQaWxsTGFiZWw6IHN0cmluZztcbiAgc2hvd3NPcHRpb25zOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgY2FsZW5kYXIgYm9keSByZW5kZXJzIGluIHBsYWNlIG9mIHRoZSBvcHRpb25zIGdyaWQuICovXG4gIHNob3dzRGF0ZUdyaWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgbW9udGggdGhlIGNhbGVuZGFyIHNob3dzLiBOdWxsIHVubGVzcyBgc2hvd3NEYXRlR3JpZGAuICovXG4gIGRhdGVWaWV3OiBEYXRlTW9udGhWaWV3IHwgbnVsbDtcbiAgLyoqIFdoYXQgdGhlIGNhbGVuZGFyIHBhaW50cyBhcyBhbnN3ZXJlZCDigJQgc2VlIHRoZSBjb3JlJ3MgYGRhdGVTZWxlY3Rpb25Gb3JgLiAqL1xuICBkYXRlU2VsZWN0aW9uOiBEYXRlU2VsZWN0aW9uO1xuICBzaG93c0ZhbGxiYWNrU2tlbGV0b246IGJvb2xlYW47XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqIFByb2R1Y3QgY2FyZHMgZm9yIHRoZSBzdHJpcC4gRW1wdHkgdW5sZXNzIGBwcm9kdWN0c2AgaXMgY29uZmlndXJlZC4gKi9cbiAgcHJvZHVjdHM6IFByb2R1Y3RbXTtcbiAgLyoqIElkZW50aXR5IG9mIHRoZSBzdWdnZXN0aW9uIHRoZSBvcHRpb25zIGJlbG9uZyB0byDigJQgZHJpdmVzIHRoZSBncmlkJ3Mgc2Nyb2xsIHJlc2V0LiAqL1xuICBncm91cEtleTogc3RyaW5nO1xuICBmb290ZXJLZXk6IHN0cmluZztcbiAgZm9vdGVySGludDogc3RyaW5nO1xuICBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIjtcbiAgLyoqIFdoZXRoZXIgb3B0aW9uIHJvd3MgZHJhdyB0aGVpciBgaWNvbl9zdmdgIGJlZm9yZSB0aGUgdGV4dC4gKi9cbiAgc2hvd09wdGlvbkljb25zOiBib29sZWFuO1xuICAvKiogV2hldGhlciBvcHRpb24gcm93cyBkcmF3IHRoZWlyIGBpbWFnZV91cmxgIGFzIGEgdGh1bWJuYWlsIGJlZm9yZSB0aGUgdGV4dC4gKi9cbiAgc2hvd09wdGlvbkltYWdlczogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgb3B0aW9uIHJvd3Mgc2hvdyB0aGVpciBgaXRlbV9jb3VudGAgYXQgdGhlIHRyYWlsaW5nIGVkZ2UuICovXG4gIHNob3dPcHRpb25Db3VudHM6IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgY29udGVudC1iZWFyaW5nIGZpZWxkcyBvZiB0aGUgdmlldy1tb2RlbCAoZXZlcnl0aGluZyBidXQgYGlzVmlzaWJsZWApLiAqL1xudHlwZSBEcm9wZG93bkNvbnRlbnQgPSBPbWl0PERyb3Bkb3duVm0sIFwiaXNWaXNpYmxlXCI+O1xuXG4vKipcbiAqIFRpZXIgMiBkcm9wZG93biBjb21wb25lbnQg4oCUIHRoZSBBbmd1bGFyIGVxdWl2YWxlbnQgb2YgUmVhY3Qnc1xuICogYDxBSUF1dG9jb21wbGV0ZURyb3Bkb3duIC8+YC4gUmVuZGVycyB0aGUgcGlsbGJhciwgb3B0aW9ucyBncmlkLCBhbmRcbiAqIGxvYWRpbmcgc2tlbGV0b24gYmFzZWQgb24gdGhlIHN1cHBsaWVkIGNvbnRyb2xsZXIncyBgZHJvcGRvd24kYCBzbmFwc2hvdC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8YWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duIFtjb250cm9sbGVyXT1cImFjXCI+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG4gKiBgYGBcbiAqXG4gKiBBbGwgYWN0aW9ucyAocGlsbCBjbGljaywgb3B0aW9uIHNlbGVjdCwgb3B0aW9uIGhpZ2hsaWdodCkgYXJlIGZvcndhcmRlZCB0b1xuICogdGhlIGNvbnRyb2xsZXIuIENvbnN1bWVycyB3aG8gbmVlZCB0byBvYnNlcnZlIHRoZXNlIGV2ZW50cyBjYW4gc3Vic2NyaWJlXG4gKiB0byB0aGUgY29udHJvbGxlcidzIHBlci1maWVsZCBvYnNlcnZhYmxlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBQaWxsTGlzdENvbXBvbmVudCxcbiAgICBQcm9kdWN0U3RyaXBDb21wb25lbnQsXG4gICAgU3VnZ2VzdGlvbkdyaWRDb21wb25lbnQsXG4gICAgRGF0ZUdyaWRDb21wb25lbnQsXG4gICAgU3RhY2tDb21wb25lbnQsXG4gICAgQ2x1c3RlckNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sXCIsXG4gIC8vIFRoZSBzaGFyZWQgYXBwZWFyYW5jZSBsYXllciBjYXJyaWVzIHRoZSBkZXNpZ24gdG9rZW5zICsgYm94LXNpemluZyByZXNldCArXG4gIC8vIG9wdGlvbnNQb3NpdGlvbiByZXZlcnNhbCwgc28gYSBzdGFuZGFsb25lIGRyb3Bkb3duIChubyBUaWVyIDEgY29tcG9uZW50IG9uXG4gIC8vIHRoZSBwYWdlKSBpcyBmdWxseSBzdHlsZWQgb25jZSBgbW9kZWAgaXMgc2V0LlxuICBzdHlsZVVybHM6IFtcIi4uL3NoYXJlZC9hcHBlYXJhbmNlLmNzc1wiLCBcIi4vYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duLmNvbXBvbmVudC5jc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95XG57XG4gIC8qKiBUaGUgY29udHJvbGxlciB0aGF0IG93bnMgdGhlIGF1dG9jb21wbGV0ZSBzdGF0ZS4gUmVxdWlyZWQuICovXG4gIEBJbnB1dCgpIGNvbnRyb2xsZXIhOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXI7XG4gIC8qKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgcGlsbGJhciBhYm92ZSB0aGUgb3B0aW9ucyBncmlkLiBEZWZhdWx0OiB0cnVlLiAqL1xuICBASW5wdXQoKSBzaG93UGlsbHMgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlsbGJhciBlbmRzIGluIGEgc21hbGwgXCJza2lwXCIgYnV0dG9uIHRoYXQgZGlzbWlzc2VzIHRoZVxuICAgKiBhY3RpdmUgcGlsbCDigJQgc2FtZSBhY3Rpb24gYXMgcHJlc3Npbmcg4oaSIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LiBJdCBzaXRzXG4gICAqIGF0IHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSBiYXI6IHZpc3VhbGx5IHRvcC1yaWdodCB3aGVuIHRoZSBkcm9wZG93blxuICAgKiBvcGVucyBiZWxvdyB0aGUgaW5wdXQsIGJvdHRvbS1yaWdodCB3aGVuIGBvcHRpb25zUG9zaXRpb25gIGlzIFwiYWJvdmVcIi5cbiAgICogRGVmYXVsdDogdHJ1ZS4gSGlkZGVuIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHJlLWVkaXQgYW5kIHdoaWxlIHRoZSBmYWxsYmFja1xuICAgKiBza2VsZXRvbiByZW5kZXJzLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciBvcHRpb24gcm93cyBkcmF3IHRoZWlyIGBpY29uX3N2Z2AgYmVmb3JlIHRoZSB0ZXh0LiBEZWZhdWx0OiB0cnVlLlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyIG9wdGlvbiByb3dzIGFzIHRleHQgb25seS5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dPcHRpb25JY29ucyA9IHRydWU7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9wdGlvbiByb3dzIGRyYXcgdGhlaXIgYGltYWdlX3VybGAgYXMgYSBzcXVhcmUgdGh1bWJuYWlsIGJlZm9yZVxuICAgKiB0aGUgdGV4dCwgaW4gcGxhY2Ugb2YgdGhlIGljb24uIERlZmF1bHQ6IHRydWUuIFNldCB0byBmYWxzZSB0byByZW5kZXJcbiAgICogb3B0aW9uIHJvd3Mgd2l0aG91dCBwaWN0dXJlcy5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dPcHRpb25JbWFnZXMgPSB0cnVlO1xuICAvKipcbiAgICogV2hldGhlciBvcHRpb24gcm93cyBzaG93IHRoZWlyIGBpdGVtX2NvdW50YCBhcyBhIG11dGVkIGxhYmVsIGF0IHRoZVxuICAgKiB0cmFpbGluZyBlZGdlIChcIjEyIGl0ZW1zXCIpLiBEZWZhdWx0OiB0cnVlLiBTZXQgdG8gZmFsc2UgdG8gaGlkZSB0aGUgY291bnRzLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd09wdGlvbkNvdW50cyA9IHRydWU7XG4gIC8qKlxuICAgKiBIb3cgdGhlIHByb2R1Y3Qgc3RyaXAgbGF5cyBpdHMgY2FyZHMgb3V0OiBhIGhvcml6b250YWxseSBzY3JvbGxpbmcgcm93XG4gICAqICh0aGUgZGVmYXVsdCksIG9yIHRoZSBzYW1lIGNhcmRzIHN0YWNrZWQgYXMgZnVsbC13aWR0aCByb3dzLlxuICAgKi9cbiAgQElucHV0KCkgcHJvZHVjdHNMYXlvdXQ6IFByb2R1Y3RzTGF5b3V0ID0gXCJyb3dcIjtcbiAgLyoqIE1pc3NpbmcvZmFpbGVkIGltYWdlIGZhbGxiYWNrLiBTdHlsZSBpbml0aWFscyB3aXRoIGBbZGF0YS1haWEtcHJvZHVjdC1pbml0aWFsXWAuICovXG4gIEBJbnB1dCgpIHByb2R1Y3RJbWFnZUZhbGxiYWNrOiBQcm9kdWN0SW1hZ2VGYWxsYmFjayA9IFwiaW1hZ2VcIjtcbiAgLyoqIE9wdGlvbmFsIENTUyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBkcm9wZG93biByb290LiAqL1xuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb2xvciBtb2RlIGZvciBhIHN0YW5kYWxvbmUgZHJvcGRvd24uIFdoZW4gc2V0LCB0aGUgZHJvcGRvd24gc2VsZi1zY29wZXMgdGhlXG4gICAqIGRlc2lnbiB0b2tlbnMgdG8gaXRzIG93biByb290IChhZGRzIGBtYWdpY3gtYWlhYCArIGBkYXRhLW1vZGVgKSwgc28gaXQgbmVlZHNcbiAgICogbm8gYC5tYWdpY3gtYWlhYCB3cmFwcGVyLiBgXCJhdXRvXCJgIGZvbGxvd3MgYHByZWZlcnMtY29sb3Itc2NoZW1lYC4gTGVhdmUgaXRcbiAgICogdW5zZXQgd2hlbiB0aGUgZHJvcGRvd24gc2l0cyBpbnNpZGUgYSBgLm1hZ2ljeC1haWFgIGFuY2VzdG9yIChlLmcuIFRpZXIgMSkuXG4gICAqL1xuICBASW5wdXQoKSBtb2RlPzogQXBwZWFyYW5jZU1vZGU7XG5cbiAgLyoqIENvbmNyZXRlIHJlc29sdmVkIG1vZGUsIG9yIG51bGwgd2hlbiBgbW9kZWAgaXMgdW5zZXQgKGluaGVyaXQgZnJvbSBhbmNlc3RvcikuICovXG4gIHJlc29sdmVkTW9kZTogXCJsaWdodFwiIHwgXCJkYXJrXCIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtb2RlTXFsPzogTWVkaWFRdWVyeUxpc3Q7XG4gIHByaXZhdGUgbW9kZUxpc3RlbmVyPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGhvc3QgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWxlYXNlU2Nyb2xsPzogKCkgPT4gdm9pZDtcblxuICAvKiogUm9vdCBjbGFzcyBsaXN0IOKAlCBhZGRzIGBtYWdpY3gtYWlhYCBvbmx5IHdoZW4gc2VsZi1zY29waW5nIHZpYSBgbW9kZWAuICovXG4gIGdldCByb290Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBsZXQgY2xzID0gXCJtYWdpY3gtYWlhLWRyb3Bkb3duXCI7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWRNb2RlKSBjbHMgKz0gXCIgbWFnaWN4LWFpYVwiO1xuICAgIGlmICh0aGlzLmNsYXNzTmFtZSkgY2xzICs9IGAgJHt0aGlzLmNsYXNzTmFtZX1gO1xuICAgIHJldHVybiBjbHM7XG4gIH1cblxuICAvKiogRmFsbGJhY2sgc2tlbGV0b24tYmFyIHdpZHRocyB1c2VkIHdoZW4gbG9hZGluZyB3aXRoIHplcm8gY2FjaGVkIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHMgPSBbMTU5LCAxMTksIDE2NF07XG5cbiAgLyoqIEFjY2Vzc2libGUgbmFtZSBvZiB0aGUgXCJtb3JlIGJlbG93XCIgc2Nyb2xsIGFycm93LiAqL1xuICByZWFkb25seSBzY3JvbGxBcnJvd0xhYmVsID0gU0NST0xMX0FSUk9XX0xBQkVMO1xuXG4gIC8vIFRoZSBkcm9wZG93biByb290IGFuZCB0aGUgYXJyb3cgYnV0dG9uIGxpdmUgdW5kZXIgdGhlIGAqbmdJZmAgb24gdm0kLCBzb1xuICAvLyB0aGV5IGNvbWUgYW5kIGdvIHdpdGggaXQg4oCUIGhlbmNlIG5vbi1zdGF0aWMgcXVlcmllcywgcmUtcmVhZCBldmVyeSBjaGVjay5cbiAgQFZpZXdDaGlsZChcImRyb3Bkb3duUm9vdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgcHJpdmF0ZSBkcm9wZG93blJvb3RSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcInNjcm9sbEFycm93XCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwcml2YXRlIHNjcm9sbEFycm93UmVmPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIC8qKiBUaGUgZ3JpZCB0aGUgc2Nyb2xsLWFycm93IGNvbnRyb2xsZXIgaXMgY3VycmVudGx5IGJvdW5kIHRvLiAqL1xuICBwcml2YXRlIHNjcm9sbEFycm93QmluZGluZzogeyBncmlkOiBIVE1MRWxlbWVudDsgY29udHJvbGxlcjogU2Nyb2xsQXJyb3dDb250cm9sbGVyIH0gfCBudWxsID1cbiAgICBudWxsO1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGlvbi9icmFuZGluZyBsaW5rIFVSTCBmb3IgdGhlIGZvb3Rlciwgd2l0aCBhIGB1dG1fc291cmNlYCBkZXJpdmVkXG4gICAqIGZyb20gdGhlIGVtYmVkZGluZyBwYWdlJ3MgaG9zdG5hbWUgKHNlZSB7QGxpbmsgYnVpbGRBdHRyaWJ1dGlvblVybH0pLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmRIcmVmID0gYnVpbGRBdHRyaWJ1dGlvblVybCgpO1xuXG4gIC8qKlxuICAgKiBWaWV3LW1vZGVsIGRlcml2ZWQgZnJvbSB0aGUgY29udHJvbGxlcidzIGBkcm9wZG93biRgLiBBZGRzIHRocmVlIGJvb2xlYW5zXG4gICAqIChgc2hvd3NQaWxsc2AsIGBzaG93c09wdGlvbnNgLCBgc2hvd3NGYWxsYmFja1NrZWxldG9uYCwgYGlzVmlzaWJsZWApIHRoYXRcbiAgICoga2VlcCB0ZW1wbGF0ZS1sZXZlbCBsb2dpYyB0byBhIHByb3BlcnR5IHJlYWQgcGVyIMKnMTkuNi5cbiAgICpcbiAgICogSW5pdGlhbGl6ZWQgb25jZSBpbiBgbmdPbkluaXRgIOKAlCBtdXN0IE5PVCBiZSBhIGdldHRlci4gQSBnZXR0ZXIgcmV0dXJucyBhXG4gICAqIGZyZXNoIGBPYnNlcnZhYmxlYCBpbnN0YW5jZSBvbiBldmVyeSBwcm9wZXJ0eSByZWFkOyB3aXRoIE9uUHVzaCArIGBhc3luY2BcbiAgICogcGlwZSB0aGF0IG1lYW5zIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBjeWNsZSB1bnN1YnNjcmliZXMvcmVzdWJzY3JpYmVzLFxuICAgKiBjYXVzaW5nIHRoZSBgKm5nSWY9XCJ2bSQgfCBhc3luYyBhcyB2bVwiYCByb290IHRvIGJyaWVmbHkgcmVzb2x2ZSBgbnVsbGBcbiAgICogYW5kIGZsaWNrZXIgdGhlIGVudGlyZSBkcm9wZG93biBET00uXG4gICAqL1xuICB2bSQhOiBPYnNlcnZhYmxlPERyb3Bkb3duVm0+O1xuXG4gIC8vIEJyaWRnZSBmb3IgdGhlIEBJbnB1dCBgc2hvd1BpbGxzYCBpbnRvIHRoZSByZWFjdGl2ZSBwaXBlbGluZS4gV2l0aG91dCB0aGlzLFxuICAvLyBjaGFuZ2luZyB0aGUgaW5wdXQgYWZ0ZXIgaW5pdCB3b3VsZG4ndCB0cmlnZ2VyIGEgbmV3IHZtIGVtaXNzaW9uIHVudGlsIHRoZVxuICAvLyBuZXh0IGNvbnRyb2xsZXIuZHJvcGRvd24kIHRpY2sg4oCUIGFuZCB3ZSdkIGxvc2UgdGhlIHNob3dQaWxscyB1cGRhdGUgZW50aXJlbHlcbiAgLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgaWRsZS4gVXBkYXRlZCBmcm9tIG5nT25DaGFuZ2VzIGJlbG93LlxuICBwcml2YXRlIHJlYWRvbmx5IHNob3dQaWxscyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICAvLyBTYW1lIGJyaWRnZSwgZm9yIGBzaG93U2tpcEJ1dHRvbmAuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd1NraXBCdXR0b24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd09wdGlvbkljb25zYC5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3B0aW9uSWNvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgLy8gU2FtZSBicmlkZ2UsIGZvciBgc2hvd09wdGlvbkltYWdlc2AgYW5kIGBzaG93T3B0aW9uQ291bnRzYC5cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3B0aW9uSW1hZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvd09wdGlvbkNvdW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8vIExhc3QgY29udGVudCBlbWl0dGVkIHdoaWxlIHRoZSBkcm9wZG93biB3YXMgdmlzaWJsZS4gUmV1c2VkIGR1cmluZyB0aGVcbiAgLy8gY2xvc2UgZmFkZSBzbyB0aGUgcG9wdWxhdGVkIGRyb3Bkb3duIGZhZGVzIG91dCBhcyBvbmUg4oCUIHNlZSBpbml0Vm0uXG4gIHByaXZhdGUgbGFzdFZpc2libGVDb250ZW50OiBEcm9wZG93bkNvbnRlbnQgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZWVkIHRoZSBpbnB1dCBicmlkZ2VzIGZyb20gdGhlaXIgcmVzb2x2ZWQgdmFsdWVzIGF0IGluaXQgdGltZS5cbiAgICB0aGlzLnNob3dQaWxscyQubmV4dCh0aGlzLnNob3dQaWxscyk7XG4gICAgdGhpcy5zaG93U2tpcEJ1dHRvbiQubmV4dCh0aGlzLnNob3dTa2lwQnV0dG9uKTtcbiAgICB0aGlzLnNob3dPcHRpb25JY29ucyQubmV4dCh0aGlzLnNob3dPcHRpb25JY29ucyk7XG4gICAgdGhpcy5zaG93T3B0aW9uSW1hZ2VzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkltYWdlcyk7XG4gICAgdGhpcy5zaG93T3B0aW9uQ291bnRzJC5uZXh0KHRoaXMuc2hvd09wdGlvbkNvdW50cyk7XG4gICAgdGhpcy5hcHBseU1vZGUoKTtcbiAgICB0aGlzLmluaXRWbSgpO1xuICAgIC8vIFdoZWVsL3RvdWNoIG92ZXIgdGhlIGRyb3Bkb3duIG5ldmVyIHNjcm9sbHMgdGhlIHBhZ2UgYmVoaW5kIGl0LiBPbiB0aGVcbiAgICAvLyBob3N0LCBzbyBpdCBzdXJ2aXZlcyB0aGUgKm5nSWYgcm9vdCBjb21pbmcgYW5kIGdvaW5nOyBvdXRzaWRlIHRoZSB6b25lLFxuICAgIC8vIHNvIGEgd2hlZWwgZ2VzdHVyZSBkb2Vzbid0IHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIG9uIGV2ZXJ5IGV2ZW50LlxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLnJlbGVhc2VTY3JvbGwgPSBjb250YWluU2Nyb2xsKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInNob3dQaWxsc1wiXSkge1xuICAgICAgdGhpcy5zaG93UGlsbHMkLm5leHQodGhpcy5zaG93UGlsbHMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dTa2lwQnV0dG9uXCJdKSB7XG4gICAgICB0aGlzLnNob3dTa2lwQnV0dG9uJC5uZXh0KHRoaXMuc2hvd1NraXBCdXR0b24pO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dPcHRpb25JY29uc1wiXSkge1xuICAgICAgdGhpcy5zaG93T3B0aW9uSWNvbnMkLm5leHQodGhpcy5zaG93T3B0aW9uSWNvbnMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dPcHRpb25JbWFnZXNcIl0pIHtcbiAgICAgIHRoaXMuc2hvd09wdGlvbkltYWdlcyQubmV4dCh0aGlzLnNob3dPcHRpb25JbWFnZXMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcInNob3dPcHRpb25Db3VudHNcIl0pIHtcbiAgICAgIHRoaXMuc2hvd09wdGlvbkNvdW50cyQubmV4dCh0aGlzLnNob3dPcHRpb25Db3VudHMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1tcIm1vZGVcIl0gJiYgIWNoYW5nZXNbXCJtb2RlXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFwcGx5TW9kZSgpO1xuICAgIH1cbiAgICAvLyBSZS1iaW5kIHZtJCB3aGVuIHRoZSBjb250cm9sbGVyIEBJbnB1dCBpcyBzd2FwcGVkIChlLmcuIGEgbXVsdGktc3RlcCBmb3JtXG4gICAgLy8gdG9nZ2xpbmcgYmV0d2VlbiBjb250cm9sbGVycykuIFdpdGhvdXQgdGhpcywgdm0kIHN0YXlzIHN1YnNjcmliZWQgdG8gdGhlXG4gICAgLy8gcHJldmlvdXMgY29udHJvbGxlcidzIGRyb3Bkb3duJCDigJQgcmVuZGVyaW5nIHN0YWxlIG9wdGlvbnMsIG9yLCBpZiB0aGF0XG4gICAgLy8gY29udHJvbGxlciB3YXMgZGVzdHJveSgpLWVkLCByZWNlaXZpbmcgYSBjb21wbGV0aW9uIHRoYXQgY29sbGFwc2VzIHRoZVxuICAgIC8vIGRyb3Bkb3duIHBlcm1hbmVudGx5LiBTa2lwIHRoZSBmaXJzdCBjaGFuZ2U6IG5nT25DaGFuZ2VzIGZpcmVzIGJlZm9yZVxuICAgIC8vIG5nT25Jbml0LCB3aGljaCBvd25zIHRoZSBpbml0aWFsIGNyZWF0aW9uLlxuICAgIGlmIChjaGFuZ2VzW1wiY29udHJvbGxlclwiXSAmJiAhY2hhbmdlc1tcImNvbnRyb2xsZXJcIl0uZmlyc3RDaGFuZ2UgJiYgdGhpcy5jb250cm9sbGVyKSB7XG4gICAgICB0aGlzLmluaXRWbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBjb3JlJ3MgXCJtb3JlIGJlbG93XCIgYXJyb3cgY29udHJvbGxlciBib3VuZCB0byB3aGljaGV2ZXIgb3B0aW9uc1xuICAgKiBncmlkIGlzIGN1cnJlbnRseSByZW5kZXJlZCDigJQgdGhlIEFuZ3VsYXIgYW5hbG9ndWUgb2YgUmVhY3Qnc1xuICAgKiB1c2VTY3JvbGxBcnJvdy4gVGhlIGNvbnRyb2xsZXIgb3ducyB0aGUgYmVoYXZpb3VyIChtZWFzdXJpbmcsIHZpc2liaWxpdHksXG4gICAqIHRoZSBwYWdlLXNjcm9sbCBvbiBjbGljayDigJQgc2VlIHRoZSBjb3JlJ3Mgc2Nyb2xsQXJyb3cudHMpOyB0aGlzIG9ubHkgaGFuZHNcbiAgICogaXQgdGhlIGxpdmUgZWxlbWVudHMgYWZ0ZXIgZWFjaCB2aWV3IGNoZWNrLCByZS1hdHRhY2hpbmcgd2hlbiB0aGUgZ3JpZFxuICAgKiBlbGVtZW50IGlzIHJlcGxhY2VkIGFuZCB0ZWFyaW5nIGRvd24gd2hlbiB0aGVyZSBpcyBubyBncmlkLlxuICAgKi9cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmRyb3Bkb3duUm9vdFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLnNjcm9sbEFycm93UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGdyaWQgPSByb290Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIi5haWEtZ3JpZFtkYXRhLXNjcm9sbF1cIikgPz8gbnVsbDtcbiAgICBpZiAodGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcgJiYgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuZ3JpZCAhPT0gZ3JpZCkge1xuICAgICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuY29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZyA9IG51bGw7XG4gICAgfVxuICAgIGlmICghcm9vdCB8fCAhYnV0dG9uIHx8ICFncmlkKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLnNjcm9sbEFycm93QmluZGluZykge1xuICAgICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcgPSB7XG4gICAgICAgIGdyaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGF0dGFjaFNjcm9sbEFycm93KHsgZHJvcGRvd246IHJvb3QsIGdyaWQsIGJ1dHRvbiB9KSxcbiAgICAgIH07XG4gICAgICByZXR1cm47IC8vIGF0dGFjaCgpIHJ1bnMgdGhlIGZpcnN0IHVwZGF0ZSBpdHNlbGZcbiAgICB9XG4gICAgdGhpcy5zY3JvbGxBcnJvd0JpbmRpbmcuY29udHJvbGxlci51cGRhdGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudGVhcmRvd25Nb2RlTGlzdGVuZXIoKTtcbiAgICB0aGlzLnJlbGVhc2VTY3JvbGw/LigpO1xuICAgIHRoaXMuc2Nyb2xsQXJyb3dCaW5kaW5nPy5jb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLnNjcm9sbEFycm93QmluZGluZyA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYG1vZGVgIGlucHV0IGludG8gYHJlc29sdmVkTW9kZWAuIFVuc2V0IOKGkiBudWxsICh0aGUgZHJvcGRvd25cbiAgICogc3RheXMgY2xhc3MtbGVzcyBhbmQgaW5oZXJpdHMgZnJvbSBhIGAubWFnaWN4LWFpYWAgYW5jZXN0b3IpLiBgXCJhdXRvXCJgIHJlYWRzXG4gICAqIGBwcmVmZXJzLWNvbG9yLXNjaGVtZWAgYW5kIHRyYWNrcyBpdCBsaXZlIHZpYSBhIG1lZGlhLXF1ZXJ5IGxpc3RlbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy50ZWFyZG93bk1vZGVMaXN0ZW5lcigpO1xuICAgIGlmICh0aGlzLm1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlID09PSBcImxpZ2h0XCIgfHwgdGhpcy5tb2RlID09PSBcImRhcmtcIikge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFwiYXV0b1wiXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHwgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gXCJsaWdodFwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vZGVNcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaylcIik7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGVNcWwubWF0Y2hlcyA/IFwiZGFya1wiIDogXCJsaWdodFwiO1xuICAgIHRoaXMubW9kZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSB0aGlzLm1vZGVNcWw/Lm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH07XG4gICAgdGhpcy5tb2RlTXFsLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5tb2RlTGlzdGVuZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSB0ZWFyZG93bk1vZGVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlTXFsICYmIHRoaXMubW9kZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLm1vZGVNcWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLm1vZGVMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMubW9kZU1xbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1vZGVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgdmlldy1tb2RlbCBzdHJlYW0gZnJvbSB0aGUgY3VycmVudCBjb250cm9sbGVyICsgc2hvd1BpbGxzJC4gKi9cbiAgcHJpdmF0ZSBpbml0Vm0oKTogdm9pZCB7XG4gICAgdGhpcy52bSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY29udHJvbGxlci5kcm9wZG93biQsXG4gICAgICB0aGlzLnNob3dQaWxscyQsXG4gICAgICB0aGlzLnNob3dTa2lwQnV0dG9uJCxcbiAgICAgIHRoaXMuc2hvd09wdGlvbkljb25zJCxcbiAgICAgIHRoaXMuc2hvd09wdGlvbkltYWdlcyQsXG4gICAgICB0aGlzLnNob3dPcHRpb25Db3VudHMkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbZGQsIHNob3dQaWxscywgc2hvd1NraXBCdXR0b24sIHNob3dPcHRpb25JY29ucywgc2hvd09wdGlvbkltYWdlcywgc2hvd09wdGlvbkNvdW50c10pID0+IHtcbiAgICAgICAgICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gZGQuc3VnZ2VzdGlvbnNbMF07XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFjdGl2ZVN1Z2dlc3Rpb24/Lm9wdGlvbnMgPz8gW107XG4gICAgICAgICAgY29uc3Qgc2hvd3NQaWxscyA9IHNob3dQaWxscyAmJiAoZGQucGlsbHMubGVuZ3RoID4gMCB8fCBkZC5pc0xvYWRpbmcpO1xuICAgICAgICAgIC8vIFRoZSB0cmFpbGluZyBcInNraXBcIiBidXR0b24gb25seSBtYWtlcyBzZW5zZSBuZXh0IHRvIGEgcmVhbCxcbiAgICAgICAgICAvLyBza2lwcGFibGUgcGlsbCDigJQgbmV2ZXIgb24gdGhlIGZhbGxiYWNrIHNrZWxldG9uIGJhciwgYW5kIG5ldmVyXG4gICAgICAgICAgLy8gZHVyaW5nIHJlLWVkaXQgKHRoZSBiYXIgdGhlbiBzaG93cyBhbiBhbHJlYWR5IGFuc3dlcmVkIHBhcmFtKS5cbiAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGdhdGVkIG9uIHNob3dzUGlsbHM6IHdpdGggcGlsbHMgcmVuZGVyZWQgZWxzZXdoZXJlXG4gICAgICAgICAgLy8gKHBpbGxQbGFjZW1lbnQgXCJpbmxpbmVcIi9cImhpZGRlblwiKSB0aGUgYmFyIHJlbmRlcnMgYXMgYSBza2lwLW9ubHlcbiAgICAgICAgICAvLyByb3cgaG9sZGluZyBqdXN0IHRoZSBidXR0b24uIEhpZGRlbiB3aGlsZSB0aGUgaW5wdXQgaXMgZW1wdHkg4oCUIHRoZVxuICAgICAgICAgIC8vIGZvb3RlciBoaW50IGRvZXNuJ3QgYWR2ZXJ0aXNlIFwi4oaSIHRvIHNraXBcIiB1bnRpbCB0aGUgdXNlciBoYXMgdHlwZWQsXG4gICAgICAgICAgLy8gc28gdGhlIHByaXN0aW5lIHN0YXJ0aW5nIHN0YXRlIHN0YXlzIGZyZWUgb2YgdGhlIGFmZm9yZGFuY2UgdG9vLlxuICAgICAgICAgIGNvbnN0IHNob3dzU2tpcCA9XG4gICAgICAgICAgICBkZC5waWxscy5sZW5ndGggPiAwICYmIHNob3dTa2lwQnV0dG9uICYmICFkZC5pc0VkaXRpbmcgJiYgIWRkLmlzSW5wdXRFbXB0eTtcbiAgICAgICAgICAvLyBFeGFjdGx5IG9uZSBib2R5IHJlbmRlcnMuIGBvcHRpb25zYCBhYm92ZSBhbHJlYWR5IGhvbGRzIHRoZSB2aXNpYmxlXG4gICAgICAgICAgLy8gbW9udGgncyBjZWxscyB3aGVuIHRoaXMgaXMgYSBkYXRlIOKAlCB0aGUgY29yZSBzd2FwcGVkIHRoZW0gaW4gaXRzXG4gICAgICAgICAgLy8gZGVyaXZlIGxheWVyIOKAlCBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBsaXN0IGRyYXduIHR3byBkaWZmZXJlbnRcbiAgICAgICAgICAvLyB3YXlzLCBhbmQgbmV2ZXIgYm90aCBhdCBvbmNlICh0d28gZWxlbWVudHMgYW5zd2VyaW5nIHRvIHRoZSBzYW1lXG4gICAgICAgICAgLy8gb3B0aW9uIGlkIHdvdWxkIGJyZWFrIGtleWJvYXJkIGNvbW1pdCkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBBIGNhbGVuZGFyIGlzIHdpdGhoZWxkIHdoaWxlIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuIFRoZSBvcHRpb25zXG4gICAgICAgICAgLy8gZ3JpZCBkcmF3cyBpdHMgY2FjaGVkIG9wdGlvbnMgYXMgc2tlbGV0b24gcm93cyBmb3IgdGhhdCB3aW5kb3csIGJ1dFxuICAgICAgICAgIC8vIGEgbW9udGggb2YgZGF5IGNlbGxzIGhhcyBubyBza2VsZXRvbiBmb3JtIHdvcnRoIGRyYXdpbmcg4oCUIGFuZCBhIGxpdmVcbiAgICAgICAgICAvLyBjYWxlbmRhciBvdmVyIGEgbG9hZGluZyBwaWxsIGJhciBpbnZpdGVzIGFuIGFuc3dlciBhZ2FpbnN0XG4gICAgICAgICAgLy8gc3VnZ2VzdGlvbnMgdGhlIHJlc3BvbnNlIGlzIGFib3V0IHRvIHJlcGxhY2UuIFRoZSBmYWxsYmFjayBiYXJzXG4gICAgICAgICAgLy8gc3RhbmQgaW4gdW50aWwgaXQgbGFuZHMuXG4gICAgICAgICAgY29uc3QgaXNEYXRlID0gaXNDYWxlbmRhckZvcm1hdChkZC5mb3JtYXRUeXBlID8/IFwib3B0aW9uc1wiKSAmJiBkZC5kYXRlVmlldyAhPSBudWxsO1xuICAgICAgICAgIGNvbnN0IHNob3dzT3B0aW9ucyA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiAhaXNEYXRlO1xuICAgICAgICAgIGNvbnN0IHNob3dzRGF0ZUdyaWQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgaXNEYXRlICYmICFkZC5pc0xvYWRpbmc7XG4gICAgICAgICAgY29uc3Qgc2hvd3NGYWxsYmFja1NrZWxldG9uID0gZGQuaXNMb2FkaW5nICYmICFzaG93c09wdGlvbnMgJiYgIXNob3dzRGF0ZUdyaWQ7XG4gICAgICAgICAgLy8gRWl0aGVyIGhhbGYgaXMgZW5vdWdoIHRvIGtlZXAgdGhlIHBhbmVsIHVwOiBwcm9kdWN0cyByZW5kZXIgd2l0aCBub1xuICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zLCBzdWdnZXN0aW9ucyByZW5kZXIgd2l0aCBubyBwcm9kdWN0cy5cbiAgICAgICAgICBjb25zdCBpc1Zpc2libGUgPVxuICAgICAgICAgICAgZGQuaXNPcGVuICYmXG4gICAgICAgICAgICAoc2hvd3NPcHRpb25zIHx8IHNob3dzRGF0ZUdyaWQgfHwgc2hvd3NQaWxscyB8fCBkZC5pc0xvYWRpbmcgfHwgZGQucHJvZHVjdHMubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgICAvLyBXaGlsZSBjbG9zaW5nLCByZXVzZSB0aGUgbGFzdCB2aXNpYmxlIGNvbnRlbnQgc28gdGhlIHBvcHVsYXRlZFxuICAgICAgICAgIC8vIGRyb3Bkb3duIGZhZGVzIG91dCBhcyBvbmUuIE90aGVyd2lzZSB0aGUgcGlsbHMvb3B0aW9ucyB2YW5pc2ggdGhlXG4gICAgICAgICAgLy8gaW5zdGFudCB0aGUgc3RhdGUgZW1wdGllcyAoZS5nLiBza2lwcGluZyB0aGUgbGFzdCBwaWxsIHdpdGgg4oaSKSxcbiAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhbHdheXMtcHJlc2VudCBmb290ZXIgYWxvbmUgZm9yIGEgZmxhc2ggb2YgYSBmb290ZXItb25seVxuICAgICAgICAgIC8vIFwibm8gb3B0aW9uc1wiIGJveCBtaWQtZmFkZS4gT25seSBgaXNWaXNpYmxlYCB0cmFja3MgbGl2ZSBzdGF0ZSB0b1xuICAgICAgICAgIC8vIGRyaXZlIHRoZSBvcGFjaXR5IHRyYW5zaXRpb24uXG4gICAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgdGhpcy5sYXN0VmlzaWJsZUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnRoaXMubGFzdFZpc2libGVDb250ZW50LCBpc1Zpc2libGU6IGZhbHNlIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb3B0aW9uSGlnaGxpZ2h0ZWQgPVxuICAgICAgICAgICAgZGQuYWN0aXZlSW5kZXggPj0gMCAmJiBCb29sZWFuKG9wdGlvbnNbZGQuYWN0aXZlSW5kZXhdPy5pc190YXBwYWJsZSk7XG4gICAgICAgICAgY29uc3QgeyBrZXk6IGZvb3RlcktleSwgaGludDogZm9vdGVySGludCB9ID0gZ2V0Rm9vdGVySGludChcbiAgICAgICAgICAgIG9wdGlvbkhpZ2hsaWdodGVkLFxuICAgICAgICAgICAgZGQuaXNJbnB1dEVtcHR5LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29udGVudDogRHJvcGRvd25Db250ZW50ID0ge1xuICAgICAgICAgICAgcGlsbHM6IGRkLnBpbGxzLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGFjdGl2ZUluZGV4OiBkZC5hY3RpdmVJbmRleCxcbiAgICAgICAgICAgIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBkZC5pc0FjdGl2ZVBpbGxTZWxlY3RlZCxcbiAgICAgICAgICAgIGlzTG9hZGluZzogZGQuaXNMb2FkaW5nLFxuICAgICAgICAgICAgc2tlbGV0b25FeGl0aW5nOiBCb29sZWFuKGRkLnNrZWxldG9uRXhpdGluZyksXG4gICAgICAgICAgICBzaG93c1BpbGxzLFxuICAgICAgICAgICAgc2hvd3NTa2lwLFxuICAgICAgICAgICAgc2tpcERpc2FibGVkOiBkZC5pc0xvYWRpbmcgfHwgQm9vbGVhbihkZC5pblNlbGVjdGlvbkFuaW1hdGlvbiksXG4gICAgICAgICAgICBhY3RpdmVQaWxsTGFiZWw6IGRkLnBpbGxzWzBdPy50ZXh0ID8/IFwiXCIsXG4gICAgICAgICAgICBzaG93c09wdGlvbnMsXG4gICAgICAgICAgICBzaG93c0RhdGVHcmlkLFxuICAgICAgICAgICAgZGF0ZVZpZXc6IGRkLmRhdGVWaWV3ID8/IG51bGwsXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkSXNvOiBkZC5zZWxlY3RlZERhdGVJc28gPz8gbnVsbCxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRSYW5nZTogZGQuc2VsZWN0ZWREYXRlUmFuZ2UgPz8gbnVsbCxcbiAgICAgICAgICAgICAgcmFuZ2VTdGFydDogZGQuZGF0ZVJhbmdlU3RhcnQgPz8gbnVsbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaG93c0ZhbGxiYWNrU2tlbGV0b24sXG4gICAgICAgICAgICBwcm9kdWN0czogZGQucHJvZHVjdHMsXG4gICAgICAgICAgICBncm91cEtleTogYWN0aXZlU3VnZ2VzdGlvbiA/IGAke2FjdGl2ZVN1Z2dlc3Rpb24udHlwZX0gJHthY3RpdmVTdWdnZXN0aW9uLnRleHR9YCA6IFwiXCIsXG4gICAgICAgICAgICBmb290ZXJLZXksXG4gICAgICAgICAgICBmb290ZXJIaW50LFxuICAgICAgICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBkZC5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgICAgICBzaG93T3B0aW9uSWNvbnMsXG4gICAgICAgICAgICBzaG93T3B0aW9uSW1hZ2VzLFxuICAgICAgICAgICAgc2hvd09wdGlvbkNvdW50cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc1Zpc2libGUpIHRoaXMubGFzdFZpc2libGVDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICByZXR1cm4geyAuLi5jb250ZW50LCBpc1Zpc2libGUgfTtcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHRyYWNrQnlXaWR0aCA9IChfOiBudW1iZXIsIHc6IG51bWJlcik6IG51bWJlciA9PiB3O1xuXG4gIG9uUGlsbENsaWNrKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0QWN0aXZlUGlsbChpbmRleCk7XG4gIH1cblxuICBvblNraXAoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNraXBBY3RpdmVQaWxsKCk7XG4gIH1cblxuICBvblNlbGVjdChvcHRpb246IFN1Z2dlc3Rpb25PcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICBvblByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNob3dQcmV2aW91c01vbnRoKCk7XG4gIH1cblxuICBvbk5leHRNb250aCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2hvd05leHRNb250aCgpO1xuICB9XG5cbiAgb25IaWdobGlnaHQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8vIEEgaG92ZXIgaGlnaGxpZ2h0IGVuZHMgd2l0aCB0aGUgaG92ZXIg4oCUIHNlZSB0aGUgY29yZSdzIGBjbGVhckhpZ2hsaWdodGAuXG4gIG9uVW5oaWdobGlnaHQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5jbGVhckhpZ2hsaWdodChpbmRleCk7XG4gIH1cblxuICBvblByb2R1Y3RTZWxlY3QocHJvZHVjdDogUHJvZHVjdCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZWxlY3RQcm9kdWN0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FyZCB0YWtpbmcgZm9jdXMgYmx1cnMgdGhlIGVkaXRvciwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGNsb3NlIHRoZVxuICAgKiBwYW5lbCBvdXQgZnJvbSB1bmRlciB0aGUgY2FyZCB0aGUgdXNlciBqdXN0IHRhYmJlZCB0by5cbiAgICovXG4gIG9uUHJvZHVjdEZvY3VzQ2hhbmdlKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuc2V0Rm9jdXNlZChmb2N1c2VkKTtcbiAgfVxuXG4gIHByZXZlbnRCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGxvc2luZyBmb2N1cyB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGRyb3Bkb3duLlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCJ2bSQgfCBhc3luYyBhcyB2bVwiXG4gICNkcm9wZG93blJvb3RcbiAgW2lkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgcm9sZT1cImxpc3Rib3hcIlxuICBkYXRhLWFpYS1kcm9wZG93bj1cIlwiXG4gIFthdHRyLmRhdGEtYWlhLWxvYWRpbmddPVwidm0uaXNMb2FkaW5nID8gJycgOiBudWxsXCJcbiAgW2F0dHIuZGF0YS1haWEtc2tlbGV0b24tZXhpdGluZ109XCJ2bS5za2VsZXRvbkV4aXRpbmcgPyAnJyA6IG51bGxcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cInZtLm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYWlhLWhhcy1wcm9kdWN0c109XCJ2bS5wcm9kdWN0cy5sZW5ndGggPiAwID8gJycgOiBudWxsXCJcbiAgW2NsYXNzXT1cInJvb3RDbGFzc1wiXG4gIFtjbGFzcy5tYWdpY3gtYWlhLWRyb3Bkb3duLXZpc2libGVdPVwidm0uaXNWaXNpYmxlXCJcbiAgKG1vdXNlZG93bik9XCJwcmV2ZW50Qmx1cigkZXZlbnQpXCJcbj5cbiAgPGFpYS1zdGFjayBzcGFjZT1cIjhweFwiPlxuICAgIDxhaWEtY2x1c3RlclxuICAgICAgKm5nSWY9XCJ2bS5zaG93c1BpbGxzIHx8IHZtLnNob3dzU2tpcFwiXG4gICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtZHJvcGRvd24tcGlsbGJhclwiXG4gICAgICBkYXRhLWFpYS1waWxsYmFyPVwiXCJcbiAgICAgIFtub1dyYXBdPVwidHJ1ZVwiXG4gICAgPlxuICAgICAgPCEtLSBUaGUgc2Nyb2xsICsgcmlnaHQtZWRnZSBmYWRlIGxpdmUgb24gdGhpcyB3cmFwcGVyIChub3QgdGhlIGJhcikgc29cbiAgICAgICAgICAgdGhlIHNraXAgYnV0dG9uIHN0YXlzIG91dHNpZGUgdGhlIG1hc2tlZCByZWdpb24g4oCUIHBpbm5lZCBhbmQgZnVsbHlcbiAgICAgICAgICAgb3BhcXVlIHdoaWxlIG92ZXJmbG93aW5nIHBpbGxzIGZhZGUgdW5kZXIgaXQuIEFic2VudCBpbiBhIHNraXAtb25seVxuICAgICAgICAgICByb3cgKHBpbGxzIHJlbmRlcmVkIGVsc2V3aGVyZSB2aWEgcGlsbFBsYWNlbWVudCBpbmxpbmUvaGlkZGVuKS4gLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cInZtLnNob3dzUGlsbHNcIiBjbGFzcz1cIm1hZ2ljeC1haWEtcGlsbC1zY3JvbGxcIiBkYXRhLWFpYS1waWxsLXNjcm9sbD1cIlwiPlxuICAgICAgICA8YWlhLXBpbGwtbGlzdFxuICAgICAgICAgIFtwaWxsc109XCJ2bS5waWxsc1wiXG4gICAgICAgICAgW2FjdGl2ZVBpbGxJbmRleF09XCIwXCJcbiAgICAgICAgICBbYWN0aXZlU2VsZWN0ZWRdPVwidm0uaXNBY3RpdmVQaWxsU2VsZWN0ZWRcIlxuICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICAgICAgKHNlbGVjdFBpbGwpPVwib25QaWxsQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgID48L2FpYS1waWxsLWxpc3Q+XG4gICAgICA8L3NwYW4+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwidm0uc2hvd3NTa2lwXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtc2tpcFwiXG4gICAgICAgIGRhdGEtYWlhLXNraXA9XCJcIlxuICAgICAgICBbZGlzYWJsZWRdPVwidm0uc2tpcERpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ2bS5hY3RpdmVQaWxsTGFiZWwgPyAnU2tpcCAnICsgdm0uYWN0aXZlUGlsbExhYmVsIDogJ1NraXAnXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU2tpcCgpXCJcbiAgICAgID5cbiAgICAgICAgc2tpcFxuICAgICAgPC9idXR0b24+XG4gICAgPC9haWEtY2x1c3Rlcj5cblxuICAgIDxhaWEtc3VnZ2VzdGlvbi1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzT3B0aW9uc1wiXG4gICAgICBbb3B0aW9uc109XCJ2bS5vcHRpb25zXCJcbiAgICAgIFthY3RpdmVJbmRleF09XCJ2bS5hY3RpdmVJbmRleFwiXG4gICAgICBbbGlzdGJveElkXT1cImNvbnRyb2xsZXIubGlzdGJveElkXCJcbiAgICAgIFtsb2FkaW5nXT1cInZtLmlzTG9hZGluZ1wiXG4gICAgICBbZ3JvdXBLZXldPVwidm0uZ3JvdXBLZXlcIlxuICAgICAgW29wdGlvbnNQb3NpdGlvbl09XCJ2bS5vcHRpb25zUG9zaXRpb25cIlxuICAgICAgW3Nob3dJY29uc109XCJ2bS5zaG93T3B0aW9uSWNvbnNcIlxuICAgICAgW3Nob3dJbWFnZXNdPVwidm0uc2hvd09wdGlvbkltYWdlc1wiXG4gICAgICBbc2hvd0NvdW50c109XCJ2bS5zaG93T3B0aW9uQ291bnRzXCJcbiAgICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gICAgICAoaGlnaGxpZ2h0KT1cIm9uSGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAgKHVuaGlnaGxpZ2h0KT1cIm9uVW5oaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgPjwvYWlhLXN1Z2dlc3Rpb24tZ3JpZD5cblxuICAgIDxhaWEtZGF0ZS1ncmlkXG4gICAgICAqbmdJZj1cInZtLnNob3dzRGF0ZUdyaWRcIlxuICAgICAgW29wdGlvbnNdPVwidm0ub3B0aW9uc1wiXG4gICAgICBbYWN0aXZlSW5kZXhdPVwidm0uYWN0aXZlSW5kZXhcIlxuICAgICAgW2xpc3Rib3hJZF09XCJjb250cm9sbGVyLmxpc3Rib3hJZFwiXG4gICAgICBbdmlld109XCJ2bS5kYXRlVmlld1wiXG4gICAgICBbc2VsZWN0aW9uXT1cInZtLmRhdGVTZWxlY3Rpb25cIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChoaWdobGlnaHQpPVwib25IaWdobGlnaHQoJGV2ZW50KVwiXG4gICAgICAodW5oaWdobGlnaHQpPVwib25VbmhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgICAgIChwcmV2aW91c01vbnRoKT1cIm9uUHJldmlvdXNNb250aCgpXCJcbiAgICAgIChuZXh0TW9udGgpPVwib25OZXh0TW9udGgoKVwiXG4gICAgPjwvYWlhLWRhdGUtZ3JpZD5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwidm0uc2hvd3NGYWxsYmFja1NrZWxldG9uXCJcbiAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJzXCJcbiAgICAgIGRhdGEtYWlhLXNrZWxldG9uLWJhcnM9XCJcIlxuICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ0Zvcj1cImxldCB3IG9mIGZhbGxiYWNrU2tlbGV0b25CYXJXaWR0aHM7IHRyYWNrQnk6IHRyYWNrQnlXaWR0aFwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1kcm9wZG93bi1za2VsZXRvbi1iYXJcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwid1wiXG4gICAgICA+PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSAqbmdJZiwgbm90IGp1c3QgdGhlIHNlY3Rpb24ncyBvd24gZ3VhcmQgaW5zaWRlIHRoZSBjb21wb25lbnQ6IHRoZSBob3N0XG4gICAgICAgICBlbGVtZW50IGlzIGFuIGluLWZsb3cgY2hpbGQgb2YgLmFpYS1zdGFjayAoZGlzcGxheTpmbGV4OyBnYXA6OHB4KSwgc29cbiAgICAgICAgIGFuIGFsd2F5cy1pbnN0YW50aWF0ZWQgemVyby1oZWlnaHQgaG9zdCB3b3VsZCBhZGQgYSBTRUNPTkQgOHB4IGdhcFxuICAgICAgICAgYmV0d2VlbiB0aGUgZ3JpZCBhbmQgdGhlIGZvb3RlciDigJQgaW4gZXZlcnkgZHJvcGRvd24sIHByb2R1Y3RzIG9yIG5vdC5cbiAgICAgICAgIFRoZSBncmlkJ3MgLS1haWEtZ3JpZC1vdmVybGFwLWJvdHRvbSBpcyB0dW5lZCBmb3IgZXhhY3RseSBvbmUgZ2FwLCBzb1xuICAgICAgICAgdGhlIGZvb3RlciB3b3VsZCBsYW5kIDhweCBiZWxvdyB0aGUgYmFuZCBpdCBpcyBtZWFudCB0byBjb3Zlci4gLS0+XG4gICAgPGFpYS1wcm9kdWN0LXN0cmlwXG4gICAgICAqbmdJZj1cInZtLnByb2R1Y3RzLmxlbmd0aCA+IDBcIlxuICAgICAgW3Byb2R1Y3RzXT1cInZtLnByb2R1Y3RzXCJcbiAgICAgIFtsaXN0Ym94SWRdPVwiY29udHJvbGxlci5saXN0Ym94SWRcIlxuICAgICAgW2ZvY3VzYWJsZV09XCJ2bS5pc1Zpc2libGVcIlxuICAgICAgW2xheW91dF09XCJwcm9kdWN0c0xheW91dFwiXG4gICAgICBbaW1hZ2VGYWxsYmFja109XCJwcm9kdWN0SW1hZ2VGYWxsYmFja1wiXG4gICAgICAoc2VsZWN0KT1cIm9uUHJvZHVjdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChmb2N1c0NoYW5nZSk9XCJvblByb2R1Y3RGb2N1c0NoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9haWEtcHJvZHVjdC1zdHJpcD5cblxuICAgIDxmb290ZXIgY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3RlclwiIGRhdGEtYWlhLWZvb3Rlcj1cIlwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hZ2ljeC1haWEtZm9vdGVyLWhpbnQtZ3JvdXBcIj5cbiAgICAgICAgICA8a2JkIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXIta2V5XCI+e3sgdm0uZm9vdGVyS2V5IH19PC9rYmQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1oaW50XCI+e3sgdm0uZm9vdGVySGludCB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYnJhbmQtbGlua1wiXG4gICAgICAgICAgW2hyZWZdPVwiYnJhbmRIcmVmXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYWdpY3gtYWlhLWZvb3Rlci1icmFuZFwiPkFJPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFnaWN4LWFpYS1mb290ZXItYmFkZ2VcIj5BdXRvY29tcGxldGU8L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9vdGVyPlxuICA8L2FpYS1zdGFjaz5cbiAgPCEtLSBcIk1vcmUgYmVsb3dcIiBhcnJvdyDigJQgYW4gb3ZlcmxheSBvbiB0aGUgcGFuZWwsIG5vdCBhIHNlY3Rpb24gb2YgdGhlXG4gICAgICAgc3RhY2suIFNob3duL3Bvc2l0aW9uZWQgYnkgdGhlIGNvcmUncyBzY3JvbGwtYXJyb3cgY29udHJvbGxlciAoc2VlXG4gICAgICAgc3luY1Njcm9sbEFycm93KTsgbWFya3VwIG1pcnJvcnMgdmFuaWxsYSdzIGNyZWF0ZVNjcm9sbEFycm93QnV0dG9uLiAtLT5cbiAgPGJ1dHRvblxuICAgICNzY3JvbGxBcnJvd1xuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1zY3JvbGwtYXJyb3dcIlxuICAgIGRhdGEtYWlhLXNjcm9sbC1hcnJvdz1cIlwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzY3JvbGxBcnJvd0xhYmVsXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICA+XG4gICAgPHN2Z1xuICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICB3aWR0aD1cIjE4XCJcbiAgICAgIGhlaWdodD1cIjE4XCJcbiAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIxLjc1XCJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICA+XG4gICAgICA8cGF0aCBkPVwiTTQgNi41IDggMTAuNWw0LTRcIiAvPlxuICAgIDwvc3ZnPlxuICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19
@@ -1,8 +1,8 @@
1
- import { WEEKDAY_LABELS as WEEKDAY_LABELS$1, cellIso as cellIso$1, monthLabel as monthLabel$1, cellDay as cellDay$1, isoDate as isoDate$1, dateCellMarks as dateCellMarks$1, visibleDateRange as visibleDateRange$1, productInitial, attachProductRowWheel, optionsGridTemplateColumns, optionLabel as optionLabel$1, optionImageSrc as optionImageSrc$1, formatOptionCount as formatOptionCount$1, sanitizeOptionIconSvg as sanitizeOptionIconSvg$1, planOptionsGrid, sameOptionRows, isOptionsGridMobileViewport, needsOptionsGridMeasurement, measureOptionsGrid, optionEnterDelayMs, SCROLL_ARROW_LABEL, buildAttributionUrl, attachScrollArrow, isCalendarFormat, getFooterHint, AIAutocomplete, dateSelectionFor, identifiedParamLabel, renderEditableContent, getCursorOffset, extractPlainText, plainTextLength, setCursorOffset, ModeController, buildSubmitResult as buildSubmitResult$1, withSkippedParams as withSkippedParams$1, formatDate as formatDate$1, parseDate as parseDate$1, parseLooseDate as parseLooseDate$1, DATE_RANGE_META_END as DATE_RANGE_META_END$1, DATE_RANGE_META_START as DATE_RANGE_META_START$1, formatDateRange as formatDateRange$1, parseLooseDateRange as parseLooseDateRange$1, selectedRangeFor as selectedRangeFor$1, DEFAULT_OPTION_COUNT_UNIT as DEFAULT_OPTION_COUNT_UNIT$1, optionCountLabel as optionCountLabel$1, optionHasImage as optionHasImage$1, PRODUCT_PATH_PREFIX as PRODUCT_PATH_PREFIX$1, productFromMatchedItem as productFromMatchedItem$1, productsFromCustomFields as productsFromCustomFields$1 } from '@magicx-eng/ai-autocomplete-vanilla';
1
+ import { WEEKDAY_LABELS as WEEKDAY_LABELS$1, cellIso as cellIso$1, monthLabel as monthLabel$1, cellDay as cellDay$1, isoDate as isoDate$1, dateCellMarks as dateCellMarks$1, visibleDateRange as visibleDateRange$1, productInitial, attachProductRowWheel, optionsGridTemplateColumns, optionLabel as optionLabel$1, optionImageSrc as optionImageSrc$1, formatOptionCount as formatOptionCount$1, sanitizeOptionIconSvg as sanitizeOptionIconSvg$1, planOptionsGrid, sameOptionRows, isOptionsGridMobileViewport, needsOptionsGridMeasurement, measureOptionsGrid, optionEnterDelayMs, SCROLL_ARROW_LABEL, buildAttributionUrl, containScroll, attachScrollArrow, isCalendarFormat, getFooterHint, AIAutocomplete, dateSelectionFor, identifiedParamLabel, renderEditableContent, getCursorOffset, extractPlainText, plainTextLength, setCursorOffset, ModeController, buildSubmitResult as buildSubmitResult$1, withSkippedParams as withSkippedParams$1, formatDate as formatDate$1, parseDate as parseDate$1, parseLooseDate as parseLooseDate$1, DATE_RANGE_META_END as DATE_RANGE_META_END$1, DATE_RANGE_META_START as DATE_RANGE_META_START$1, formatDateRange as formatDateRange$1, parseLooseDateRange as parseLooseDateRange$1, selectedRangeFor as selectedRangeFor$1, DEFAULT_OPTION_COUNT_UNIT as DEFAULT_OPTION_COUNT_UNIT$1, optionCountLabel as optionCountLabel$1, optionHasImage as optionHasImage$1, PRODUCT_PATH_PREFIX as PRODUCT_PATH_PREFIX$1, productFromMatchedItem as productFromMatchedItem$1, productsFromCustomFields as productsFromCustomFields$1 } from '@magicx-eng/ai-autocomplete-vanilla';
2
2
  import * as i1 from '@angular/common';
3
3
  import { CommonModule, isPlatformBrowser } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, ViewChild, inject, ChangeDetectorRef, HostListener, ElementRef, Renderer2, NgZone, Directive, PLATFORM_ID, forwardRef, NgModule } from '@angular/core';
5
+ import { EventEmitter, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Output, ViewChild, inject, ChangeDetectorRef, HostListener, ElementRef, NgZone, Renderer2, Directive, PLATFORM_ID, forwardRef, NgModule } from '@angular/core';
6
6
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import { BehaviorSubject, combineLatest, map as map$1, distinctUntilChanged, shareReplay, Subject, takeUntil } from 'rxjs';
8
8
  import { map } from 'rxjs/operators';
@@ -877,6 +877,8 @@ class AIAutocompleteDropdownComponent {
877
877
  /** Concrete resolved mode, or null when `mode` is unset (inherit from ancestor). */
878
878
  this.resolvedMode = null;
879
879
  this.cdr = inject(ChangeDetectorRef);
880
+ this.host = inject(ElementRef);
881
+ this.zone = inject(NgZone);
880
882
  /** Fallback skeleton-bar widths used when loading with zero cached options. */
881
883
  this.fallbackSkeletonBarWidths = [159, 119, 164];
882
884
  /** Accessible name of the "more below" scroll arrow. */
@@ -923,6 +925,12 @@ class AIAutocompleteDropdownComponent {
923
925
  this.showOptionCounts$.next(this.showOptionCounts);
924
926
  this.applyMode();
925
927
  this.initVm();
928
+ // Wheel/touch over the dropdown never scrolls the page behind it. On the
929
+ // host, so it survives the *ngIf root coming and going; outside the zone,
930
+ // so a wheel gesture doesn't run change detection on every event.
931
+ this.zone.runOutsideAngular(() => {
932
+ this.releaseScroll = containScroll(this.host.nativeElement);
933
+ });
926
934
  }
927
935
  ngOnChanges(changes) {
928
936
  if (changes["showPills"]) {
@@ -982,9 +990,10 @@ class AIAutocompleteDropdownComponent {
982
990
  this.scrollArrowBinding.controller.update();
983
991
  }
984
992
  ngOnDestroy() {
985
- var _a;
993
+ var _a, _b;
986
994
  this.teardownModeListener();
987
- (_a = this.scrollArrowBinding) === null || _a === void 0 ? void 0 : _a.controller.destroy();
995
+ (_a = this.releaseScroll) === null || _a === void 0 ? void 0 : _a.call(this);
996
+ (_b = this.scrollArrowBinding) === null || _b === void 0 ? void 0 : _b.controller.destroy();
988
997
  this.scrollArrowBinding = null;
989
998
  }
990
999
  /**