UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

294 lines 44.9 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ApplicationRef, ChangeDetectorRef, Component, ComponentFactoryResolver, ContentChild, ElementRef, EventEmitter, Injector, Input, Optional, Output, ViewChild, ViewEncapsulation, } from "@angular/core"; import _isUndefined from "lodash/isUndefined"; import { filter, Subject } from "rxjs"; import { PopupContainerComponent } from "./popup-container.component"; import { PopupContainerService } from "./popup-container.service"; import { PopupToggleDirective } from "./popup-toggle.directive"; import { DOCUMENT_CLICK_EVENT } from "../../constants/event.constants"; import { EdgeDetectionService } from "../../services/edge-detection.service"; import { EventBusService } from "../../services/event-bus.service"; import { LoggerService } from "../../services/log-service"; import * as i0 from "@angular/core"; import * as i1 from "../../services/edge-detection.service"; import * as i2 from "../../services/event-bus.service"; import * as i3 from "../../services/log-service"; import * as i4 from "./popup-container.service"; import * as i5 from "../../common/directives/click-interceptor/click-interceptor.directive"; const isMouseEvent = (event) => event instanceof MouseEvent; // <example-url>./../examples/index.html#/popup</example-url> /** * @deprecated in v11 - Use PopupComponent instead - Removal: NUI-5796 */ /** * __Name :__ * NUI Pop-up component. * * __Usage :__ * Component represents basic functionality for dropdowns, popups, etc. * May be used directly. Use "nuiPopupToggle" attribute inside any layer of content * to define element that will toggle popover. Use "popupAreaContent" attribute inside * 1st layer of content to define "popup area". DO NOT USE "opened" WITH "nuiPopupToggle". * IT IS NEEDED TO CHOOSE ONE. */ export class PopupDeprecatedComponent { get popupInstance() { return this._popupInstance; } constructor(elementRef, edgeDetector, changeDetectorRef, eventBusService, componentFactoryResolver, injector, appRef, logger, popupContainer) { this.elementRef = elementRef; this.edgeDetector = edgeDetector; this.changeDetectorRef = changeDetectorRef; this.eventBusService = eventBusService; this.componentFactoryResolver = componentFactoryResolver; this.injector = injector; this.appRef = appRef; this.logger = logger; this.popupContainer = popupContainer; this.isOpen = false; this.ariaLabel = "Popup"; this.opened = new EventEmitter(); this.popupSubscriptions = []; /** * switches visibility of popup area */ this.visible = false; this.logger.warn("<nui-popup-deprecated> is deprecated as of Nova v11. Please use <nui-popup> instead."); } ngOnInit() { if (this.manualOpenControl) { this.popupSubscriptions.push(this.manualOpenControl.subscribe((event) => { this.toggleOpened(event); })); } this.popupSubscriptions.push(this.eventBusService .getStream(DOCUMENT_CLICK_EVENT) .pipe(filter(isMouseEvent)) .subscribe((event) => { if (this.isOpen) { this.closePopup(event); } })); // This is needed to make the isOpen @Input work. this.visible = this.isOpen; } ngAfterContentInit() { this.setPopupPosition(); if (!this.popupToggle) { return; } this.popupSubscriptions.push(this.popupToggle.toggle.subscribe((event) => { this.toggleOpened(event); })); } toggleOpened(event) { this.visible = false; let emit = true; if (event) { // since click triggers focusin event, we need to prevent popup from closing // when focus on the input is gained via click if (this.lastEventType === "focusin" && event.type === "click") { emit = false; } // if popup is already closed, prevent it from opening on focusout if (event.type === "focusout" && !this.isOpen) { emit = false; } this.lastEventType = event.type; } if (emit) { this.isOpen = !this.isOpen; this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detach(); if (this.isOpen) { if (!this._popupInstance && this.appendToBody) { const popupContainerFactory = this.componentFactoryResolver.resolveComponentFactory(PopupContainerComponent); this._popupInstance = popupContainerFactory.create(this.injector, [[this.popupAreaContent.nativeElement]]); this._popupInstance.instance.hostElement = this.popupToggle.host.nativeElement; this.appRef.attachView(this._popupInstance.hostView); const hostElement = this._popupInstance.hostView.rootNodes[0]; if (this.popupContainer?.parent) { hostElement.setAttribute("parent", this.popupContainer.parent.constructor.name); } document.body.appendChild(hostElement); } else { this.setPopupPosition(); } this.visible = true; this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detach(); // If closed, remove popup instance from DOM if there's one } else if (this._popupInstance && this.appendToBody) { this.deletePopupInstance(); } this.opened.emit(this.isOpen); } } closePopup(event) { const isToggle = this.popupToggle && event ? this.popupToggle.host.nativeElement.contains(event.target) : false; if (!isToggle) { this.deletePopupInstance(); this.isOpen = false; this.visible = false; this.opened.emit(this.isOpen); this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detach(); } } setPopupPosition() { let parentEl; if (!this.baseElementSelector && !this.popupToggle) { return; } if (this.popupToggle) { parentEl = this.popupToggle.host.nativeElement; } else { parentEl = document.querySelector(this.baseElementSelector) ?? undefined; } if (!parentEl) { return; } const canBe = this.edgeDetector.canBe(parentEl, this.popupAreaContent.nativeElement); this._directionTop = _isUndefined(this.directionTop) ? !canBe?.placed.bottom : this.directionTop; this._directionRight = _isUndefined(this.directionRight) ? !canBe?.aligned.left : this.directionRight; } deletePopupInstance() { if (this._popupInstance) { this.appRef.detachView(this._popupInstance.hostView); this._popupInstance.destroy(); this._popupInstance = undefined; } } ngOnDestroy() { this.popupSubscriptions.forEach((subscription) => subscription.unsubscribe()); this.deletePopupInstance(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopupDeprecatedComponent, deps: [{ token: i0.ElementRef }, { token: i1.EdgeDetectionService }, { token: i0.ChangeDetectorRef }, { token: i2.EventBusService }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: i3.LoggerService }, { token: i4.PopupContainerService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PopupDeprecatedComponent, selector: "nui-popup-deprecated", inputs: { width: "width", contextClass: "contextClass", appendToBody: "appendToBody", isOpen: "isOpen", manualOpenControl: "manualOpenControl", directionTop: "directionTop", directionRight: "directionRight", baseElementSelector: "baseElementSelector", ariaLabel: "ariaLabel" }, outputs: { opened: "opened" }, host: { attributes: { "role": "dialog" }, properties: { "attr.aria-label": "ariaLabel" }, classAttribute: "nui-popup" }, queries: [{ propertyName: "popupToggle", first: true, predicate: PopupToggleDirective, descendants: true }], viewQueries: [{ propertyName: "popupAreaContainer", first: true, predicate: ["popupAreaContainer"], descendants: true }, { propertyName: "popupAreaContent", first: true, predicate: ["popupArea"], descendants: true, static: true }], ngImport: i0, template: ` <div class="nui-popup-container" [class.nui-popup--opened]="isOpen" nuiClickInterceptor > <div class="nui-popup__content"> <ng-content></ng-content> </div> <div #popupArea class="nui-popup__area {{ contextClass }}" [style.width]="width" [class.nui-popup__area--visible]="visible" [class.nui-popup__area--top]="_directionTop && !appendToBody" [class.nui-popup__area--right]=" _directionRight && !appendToBody " > <div #popupAreaContainer tabindex="-1" class="nui-popup__area--container" > <ng-content select="[popupAreaContent]"></ng-content> </div> </div> </div> `, isInline: true, styles: [".nui-menu-popup-host.nui-popup__area{min-width:150px;max-width:450px;max-height:300px}.nui-menu-popup-host.nui-popup__area .nui-popup__area--container{overflow-x:hidden;overflow-y:auto;max-height:290px;margin:5px 0}.nui-select-popup-host.nui-popup__area{width:auto}.nui-select-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-select-popup-host.nui-select--justified.nui-popup__area{max-width:none}.nui-select-popup-host.nui-select--justified .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}.nui-combobox-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-combobox-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-combobox-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-combobox-popup-host .nui-combobox__menu{max-height:300px;overflow-y:auto;max-width:400px}.nui-combobox-popup-host.nui-combobox--justified .nui-combobox__menu{max-width:none}.nui-selector-append-to-body-host.nui-popup__area{left:-35px;min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-append-to-body-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-host.nui-popup__area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-popup-area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-popup-area .nui-repeat .nui-repeat-item{border:0}.nui-popup{display:inline-flex;position:relative;font-size:13px;line-height:1.66666667;border-radius:0}.nui-popup-container{pointer-events:all;flex-direction:column}.nui-popup-container.nui-popup--opened .nui-popup__area{display:block}.nui-popup-container.nui-popup--opened .nui-popup__area.nui-popup__area--visible{visibility:visible}.nui-popup__content{display:inline-flex;flex-direction:row}.nui-popup--detached{position:absolute}.nui-popup__area{display:none;visibility:hidden;position:absolute;top:100%;margin:0;z-index:1050;box-shadow:var(--nui-shadow-default,0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3)));background-color:var(--nui-color-bg-content_popover,#fff)}.nui-popup__area.nui-popup__area--top{top:0;transform:translateY(-100%)}.nui-popup__area.nui-popup__area--right{right:0;left:auto}.nui-popup:not(.nui-popup--opened){background:none}\n"], dependencies: [{ kind: "directive", type: i5.ClickInterceptorDirective, selector: "[nuiClickInterceptor]" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PopupDeprecatedComponent, decorators: [{ type: Component, args: [{ selector: "nui-popup-deprecated", host: { class: "nui-popup", role: "dialog", "[attr.aria-label]": "ariaLabel", }, template: ` <div class="nui-popup-container" [class.nui-popup--opened]="isOpen" nuiClickInterceptor > <div class="nui-popup__content"> <ng-content></ng-content> </div> <div #popupArea class="nui-popup__area {{ contextClass }}" [style.width]="width" [class.nui-popup__area--visible]="visible" [class.nui-popup__area--top]="_directionTop && !appendToBody" [class.nui-popup__area--right]=" _directionRight && !appendToBody " > <div #popupAreaContainer tabindex="-1" class="nui-popup__area--container" > <ng-content select="[popupAreaContent]"></ng-content> </div> </div> </div> `, encapsulation: ViewEncapsulation.None, styles: [".nui-menu-popup-host.nui-popup__area{min-width:150px;max-width:450px;max-height:300px}.nui-menu-popup-host.nui-popup__area .nui-popup__area--container{overflow-x:hidden;overflow-y:auto;max-height:290px;margin:5px 0}.nui-select-popup-host.nui-popup__area{width:auto}.nui-select-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-select-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-select-popup-host.nui-select--justified.nui-popup__area{max-width:none}.nui-select-popup-host.nui-select--justified .nui-popup__content .menu-button{display:flex;flex-grow:1;max-width:none}.nui-combobox-popup-host.nui-popup__area .nui-menu-item .nui-menu-item__action{color:var(--nui-color-text-default,#111)}.nui-combobox-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action{background-color:var(--nui-color-selected,rgba(0, 196, 210, .1));color:var(--nui-color-text-default,#111);font-weight:600}.nui-combobox-popup-host.nui-popup__area .nui-menu-item.item-selected .nui-menu-item__action:hover{background-color:var(--nui-color-selected-hover,rgba(0, 196, 210, .2))}.nui-combobox-popup-host .nui-combobox__menu{max-height:300px;overflow-y:auto;max-width:400px}.nui-combobox-popup-host.nui-combobox--justified .nui-combobox__menu{max-width:none}.nui-selector-append-to-body-host.nui-popup__area{left:-35px;min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-append-to-body-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-host.nui-popup__area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-host.nui-popup__area .nui-repeat .nui-repeat-item{border:0}.nui-selector-popup-area{min-width:100px;border:none;color:var(--nui-color-text-link,#0079aa)}.nui-selector-popup-area .nui-repeat .nui-repeat-item{border:0}.nui-popup{display:inline-flex;position:relative;font-size:13px;line-height:1.66666667;border-radius:0}.nui-popup-container{pointer-events:all;flex-direction:column}.nui-popup-container.nui-popup--opened .nui-popup__area{display:block}.nui-popup-container.nui-popup--opened .nui-popup__area.nui-popup__area--visible{visibility:visible}.nui-popup__content{display:inline-flex;flex-direction:row}.nui-popup--detached{position:absolute}.nui-popup__area{display:none;visibility:hidden;position:absolute;top:100%;margin:0;z-index:1050;box-shadow:var(--nui-shadow-default,0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3)));background-color:var(--nui-color-bg-content_popover,#fff)}.nui-popup__area.nui-popup__area--top{top:0;transform:translateY(-100%)}.nui-popup__area.nui-popup__area--right{right:0;left:auto}.nui-popup:not(.nui-popup--opened){background:none}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.EdgeDetectionService }, { type: i0.ChangeDetectorRef }, { type: i2.EventBusService }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: i3.LoggerService }, { type: i4.PopupContainerService, decorators: [{ type: Optional }] }], propDecorators: { width: [{ type: Input }], contextClass: [{ type: Input }], appendToBody: [{ type: Input }], isOpen: [{ type: Input }], manualOpenControl: [{ type: Input }], directionTop: [{ type: Input }], directionRight: [{ type: Input }], baseElementSelector: [{ type: Input }], ariaLabel: [{ type: Input }], opened: [{ type: Output }], popupToggle: [{ type: ContentChild, args: [PopupToggleDirective] }], popupAreaContainer: [{ type: ViewChild, args: ["popupAreaContainer"] }], popupAreaContent: [{ type: ViewChild, args: ["popupArea", { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wb3B1cC9wb3B1cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFFSCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsWUFBWSxFQUNaLFVBQVUsRUFFVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFFM0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFZLEVBQXVCLEVBQUUsQ0FDdkQsS0FBSyxZQUFZLFVBQVUsQ0FBQztBQUVoQyw2REFBNkQ7QUFDN0Q7O0dBRUc7QUFDSDs7Ozs7Ozs7OztHQVVHO0FBd0NILE1BQU0sT0FBTyx3QkFBd0I7SUFtRGpDLElBQVcsYUFBYTtRQUdwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQVVELFlBQ1ksVUFBc0IsRUFDdEIsWUFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLGVBQWdDLEVBQ2hDLHdCQUFrRCxFQUNsRCxRQUFrQixFQUNsQixNQUFzQixFQUN0QixNQUFxQixFQUNULGNBQXFDO1FBUmpELGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQXNCO1FBQ2xDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ1QsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBNUR0RCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBb0JmLGNBQVMsR0FBVyxPQUFPLENBQUM7UUFHNUIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFVcEMsdUJBQWtCLEdBQW1CLEVBQUUsQ0FBQztRQWFoRDs7V0FFRztRQUNJLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFhbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ1osc0ZBQXNGLENBQ3pGLENBQUM7SUFDTixDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0w7UUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUN4QixJQUFJLENBQUMsZUFBZTthQUNmLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQzthQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtRQUNMLENBQUMsQ0FBQyxDQUNULENBQUM7UUFFRixpREFBaUQ7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFTSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbkIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFZO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLEtBQUssRUFBRTtZQUNQLDRFQUE0RTtZQUM1RSw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDNUQsSUFBSSxHQUFHLEtBQUssQ0FBQzthQUNoQjtZQUVELGtFQUFrRTtZQUNsRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDM0MsSUFBSSxHQUFHLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztTQUNuQztRQUNELElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDM0MsTUFBTSxxQkFBcUIsR0FDdkIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUNqRCx1QkFBdUIsQ0FDMUIsQ0FBQztvQkFDTixJQUFJLENBQUMsY0FBYyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FDOUMsSUFBSSxDQUFDLFFBQVEsRUFDYixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQzFDLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVzt3QkFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNyRCxNQUFNLFdBQVcsR0FDYixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQ3ZCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQztvQkFDOUIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRTt3QkFDN0IsV0FBVyxDQUFDLFlBQVksQ0FDcEIsUUFBUSxFQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQzlDLENBQUM7cUJBQ0w7b0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzFDO3FCQUFNO29CQUNILElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2lCQUMzQjtnQkFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hDLDJEQUEyRDthQUM5RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDOUI7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQWtCO1FBQ2hDLE1BQU0sUUFBUSxHQUNWLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSztZQUNyQixDQUFDLENBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBNkIsQ0FBQyxRQUFRLENBQ3pELEtBQUssQ0FBQyxNQUFxQixDQUM5QjtZQUNILENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFaEIsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLFFBQWlDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEQsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7U0FDbEQ7YUFBTTtZQUNILFFBQVE7Z0JBQ0osUUFBUSxDQUFDLGFBQWEsQ0FBYyxJQUFJLENBQUMsbUJBQW1CLENBQUM7b0JBQzdELFNBQVMsQ0FBQztTQUNqQjtRQUVELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FDcEIsUUFBUSxFQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUN0QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDOUIsQ0FBQztJQUVPLG1CQUFtQjtRQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDN0MsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUM3QixDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQzsrR0EvT1Esd0JBQXdCO21HQUF4Qix3QkFBd0IsbWhCQXVDbkIsb0JBQW9CLHdSQXZFeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E0QlQ7OzRGQUlRLHdCQUF3QjtrQkF2Q3BDLFNBQVM7K0JBQ0ksc0JBQXNCLFFBQzFCO3dCQUNGLEtBQUssRUFBRSxXQUFXO3dCQUNsQixJQUFJLEVBQUUsUUFBUTt3QkFDZCxtQkFBbUIsRUFBRSxXQUFXO3FCQUNuQyxZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNEJULGlCQUVjLGlCQUFpQixDQUFDLElBQUk7OzBCQTRFaEMsUUFBUTt5Q0F2RUosS0FBSztzQkFBYixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxNQUFNO3NCQURaLEtBQUs7Z0JBR0MsaUJBQWlCO3NCQUR2QixLQUFLO2dCQU1DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBTUMsY0FBYztzQkFEcEIsS0FBSztnQkFNQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLE1BQU07c0JBRFosTUFBTTtnQkFJQSxXQUFXO3NCQURqQixZQUFZO3VCQUFDLG9CQUFvQjtnQkFHM0Isa0JBQWtCO3NCQUR4QixTQUFTO3VCQUFDLG9CQUFvQjtnQkFJeEIsZ0JBQWdCO3NCQUR0QixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEVtYmVkZGVkVmlld1JlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IF9pc1VuZGVmaW5lZCBmcm9tIFwibG9kYXNoL2lzVW5kZWZpbmVkXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IFBvcHVwQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSBcIi4vcG9wdXAtY29udGFpbmVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgUG9wdXBDb250YWluZXJTZXJ2aWNlIH0gZnJvbSBcIi4vcG9wdXAtY29udGFpbmVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBvcHVwVG9nZ2xlRGlyZWN0aXZlIH0gZnJvbSBcIi4vcG9wdXAtdG9nZ2xlLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRE9DVU1FTlRfQ0xJQ0tfRVZFTlQgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2V2ZW50LmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgRWRnZURldGVjdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvZWRnZS1kZXRlY3Rpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgRXZlbnRCdXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2V2ZW50LWJ1cy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2xvZy1zZXJ2aWNlXCI7XG5cbmNvbnN0IGlzTW91c2VFdmVudCA9IChldmVudDogRXZlbnQpOiBldmVudCBpcyBNb3VzZUV2ZW50ID0+XG4gICAgZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50O1xuXG4vLyA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9wb3B1cDwvZXhhbXBsZS11cmw+XG4vKipcbiAqIEBkZXByZWNhdGVkIGluIHYxMSAtIFVzZSBQb3B1cENvbXBvbmVudCBpbnN0ZWFkIC0gUmVtb3ZhbDogTlVJLTU3OTZcbiAqL1xuLyoqXG4gKiBfX05hbWUgOl9fXG4gKiBOVUkgUG9wLXVwIGNvbXBvbmVudC5cbiAqXG4gKiBfX1VzYWdlIDpfX1xuICogQ29tcG9uZW50IHJlcHJlc2VudHMgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3IgZHJvcGRvd25zLCBwb3B1cHMsIGV0Yy5cbiAqIE1heSBiZSB1c2VkIGRpcmVjdGx5LiBVc2UgXCJudWlQb3B1cFRvZ2dsZVwiIGF0dHJpYnV0ZSBpbnNpZGUgYW55IGxheWVyIG9mIGNvbnRlbnRcbiAqIHRvIGRlZmluZSBlbGVtZW50IHRoYXQgd2lsbCB0b2dnbGUgcG9wb3Zlci4gVXNlIFwicG9wdXBBcmVhQ29udGVudFwiIGF0dHJpYnV0ZSBpbnNpZGVcbiAqIDFzdCBsYXllciBvZiBjb250ZW50IHRvIGRlZmluZSBcInBvcHVwIGFyZWFcIi4gRE8gTk9UIFVTRSBcIm9wZW5lZFwiIFdJVEggXCJudWlQb3B1cFRvZ2dsZVwiLlxuICogSVQgSVMgTkVFREVEIFRPIENIT09TRSBPTkUuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1wb3B1cC1kZXByZWNhdGVkXCIsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogXCJudWktcG9wdXBcIixcbiAgICAgICAgcm9sZTogXCJkaWFsb2dcIixcbiAgICAgICAgXCJbYXR0ci5hcmlhLWxhYmVsXVwiOiBcImFyaWFMYWJlbFwiLFxuICAgIH0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJudWktcG9wdXAtY29udGFpbmVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5udWktcG9wdXAtLW9wZW5lZF09XCJpc09wZW5cIlxuICAgICAgICAgICAgbnVpQ2xpY2tJbnRlcmNlcHRvclxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVpLXBvcHVwX19jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgI3BvcHVwQXJlYVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibnVpLXBvcHVwX19hcmVhIHt7IGNvbnRleHRDbGFzcyB9fVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubnVpLXBvcHVwX19hcmVhLS12aXNpYmxlXT1cInZpc2libGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5udWktcG9wdXBfX2FyZWEtLXRvcF09XCJfZGlyZWN0aW9uVG9wICYmICFhcHBlbmRUb0JvZHlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5udWktcG9wdXBfX2FyZWEtLXJpZ2h0XT1cIlxuICAgICAgICAgICAgICAgICAgICBfZGlyZWN0aW9uUmlnaHQgJiYgIWFwcGVuZFRvQm9keVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAjcG9wdXBBcmVhQ29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm51aS1wb3B1cF9fYXJlYS0tY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwb3B1cEFyZWFDb250ZW50XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIHN0eWxlVXJsczogW1wiLi9wb3B1cC5jb21wb25lbnQubGVzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQb3B1cERlcHJlY2F0ZWRDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgT25Jbml0XG57XG4gICAgQElucHV0KCkgd2lkdGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBhZGRpdGlvbmFsIHN0eWxlcyBzaG91bGQgYmUgYXBwbGllZCB0byBwb3B1cFxuICAgICAqL1xuICAgIEBJbnB1dCgpIGNvbnRleHRDbGFzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBwb3B1cCBib3ggdG8gYmUgYXR0YWNoZWQgdG8gZG9jdW1lbnQuYm9keVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFwcGVuZFRvQm9keTogYm9vbGVhbjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYW51YWxPcGVuQ29udHJvbDogU3ViamVjdDxNb3VzZUV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIGluIHdoaWNoIGRpcmVjdGlvbiBwb3B1cCBhcmVhIHdpbGwgYmUgb3BlbmVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpcmVjdGlvblRvcDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQYXJlbnQgY3NzIGVsZW1lbnQgY2xhc3MgdXNlZCBkZXRlcm1pbmluZyBvZiBwb3B1cCBkaXJlY3Rpb24gdG8gdG9wLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRpcmVjdGlvblJpZ2h0OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBhcmVudCBjc3MgZWxlbWVudCBjbGFzcyB1c2VkIGRldGVybWluaW5nIG9mIHBvcHVwIGRpcmVjdGlvbiB0byByaWdodC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBiYXNlRWxlbWVudFNlbGVjdG9yOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyA9IFwiUG9wdXBcIjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBAQ29udGVudENoaWxkKFBvcHVwVG9nZ2xlRGlyZWN0aXZlKVxuICAgIHB1YmxpYyBwb3B1cFRvZ2dsZTogUG9wdXBUb2dnbGVEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZChcInBvcHVwQXJlYUNvbnRhaW5lclwiKVxuICAgIHB1YmxpYyBwb3B1cEFyZWFDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKFwicG9wdXBBcmVhXCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHBvcHVwQXJlYUNvbnRlbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBwcml2YXRlIHBvcHVwU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgICBwcml2YXRlIGxhc3RFdmVudFR5cGU6IHN0cmluZztcbiAgICBwcml2YXRlIF9wb3B1cEluc3RhbmNlPzogQ29tcG9uZW50UmVmPFBvcHVwQ29udGFpbmVyQ29tcG9uZW50PjtcblxuICAgIHB1YmxpYyBnZXQgcG9wdXBJbnN0YW5jZSgpOlxuICAgICAgICB8IENvbXBvbmVudFJlZjxQb3B1cENvbnRhaW5lckNvbXBvbmVudD5cbiAgICAgICAgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9wdXBJbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqIEBpZ25vcmUgKi9cbiAgICBwdWJsaWMgX2RpcmVjdGlvblJpZ2h0OiBib29sZWFuO1xuICAgIC8qKiBAaWdub3JlICovXG4gICAgcHVibGljIF9kaXJlY3Rpb25Ub3A6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogc3dpdGNoZXMgdmlzaWJpbGl0eSBvZiBwb3B1cCBhcmVhXG4gICAgICovXG4gICAgcHVibGljIHZpc2libGUgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgZWRnZURldGVjdG9yOiBFZGdlRGV0ZWN0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZXZlbnRCdXNTZXJ2aWNlOiBFdmVudEJ1c1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHBvcHVwQ29udGFpbmVyOiBQb3B1cENvbnRhaW5lclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIFwiPG51aS1wb3B1cC1kZXByZWNhdGVkPiBpcyBkZXByZWNhdGVkIGFzIG9mIE5vdmEgdjExLiBQbGVhc2UgdXNlIDxudWktcG9wdXA+IGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1hbnVhbE9wZW5Db250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubWFudWFsT3BlbkNvbnRyb2wuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5lZChldmVudCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuZXZlbnRCdXNTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldFN0cmVhbShET0NVTUVOVF9DTElDS19FVkVOVClcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoaXNNb3VzZUV2ZW50KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQb3B1cChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGlzT3BlbiBASW5wdXQgd29yay5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gdGhpcy5pc09wZW47XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRQb3B1cFBvc2l0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwVG9nZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcHVwU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5wb3B1cFRvZ2dsZS50b2dnbGUuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5lZChldmVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVPcGVuZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICBsZXQgZW1pdCA9IHRydWU7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgLy8gc2luY2UgY2xpY2sgdHJpZ2dlcnMgZm9jdXNpbiBldmVudCwgd2UgbmVlZCB0byBwcmV2ZW50IHBvcHVwIGZyb20gY2xvc2luZ1xuICAgICAgICAgICAgLy8gd2hlbiBmb2N1cyBvbiB0aGUgaW5wdXQgaXMgZ2FpbmVkIHZpYSBjbGlja1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdEV2ZW50VHlwZSA9PT0gXCJmb2N1c2luXCIgJiYgZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiKSB7XG4gICAgICAgICAgICAgICAgZW1pdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBwb3B1cCBpcyBhbHJlYWR5IGNsb3NlZCwgcHJldmVudCBpdCBmcm9tIG9wZW5pbmcgb24gZm9jdXNvdXRcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBcImZvY3Vzb3V0XCIgJiYgIXRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgZW1pdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxhc3RFdmVudFR5cGUgPSBldmVudC50eXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRhY2goKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcG9wdXBJbnN0YW5jZSAmJiB0aGlzLmFwcGVuZFRvQm9keSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3B1cENvbnRhaW5lckZhY3RvcnkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9wdXBDb250YWluZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwSW5zdGFuY2UgPSBwb3B1cENvbnRhaW5lckZhY3RvcnkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFtbdGhpcy5wb3B1cEFyZWFDb250ZW50Lm5hdGl2ZUVsZW1lbnRdXVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3B1cEluc3RhbmNlLmluc3RhbmNlLmhvc3RFbGVtZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdXBUb2dnbGUuaG9zdC5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KHRoaXMuX3BvcHVwSW5zdGFuY2UuaG9zdFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0RWxlbWVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcHVwSW5zdGFuY2UuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT5cbiAgICAgICAgICAgICAgICAgICAgKS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcHVwQ29udGFpbmVyPy5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhcmVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9wdXBDb250YWluZXIucGFyZW50LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQb3B1cFBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGFjaCgpO1xuICAgICAgICAgICAgICAgIC8vIElmIGNsb3NlZCwgcmVtb3ZlIHBvcHVwIGluc3RhbmNlIGZyb20gRE9NIGlmIHRoZXJlJ3Mgb25lXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BvcHVwSW5zdGFuY2UgJiYgdGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZVBvcHVwSW5zdGFuY2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VQb3B1cChldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNUb2dnbGUgPVxuICAgICAgICAgICAgdGhpcy5wb3B1cFRvZ2dsZSAmJiBldmVudFxuICAgICAgICAgICAgICAgID8gKHRoaXMucG9wdXBUb2dnbGUuaG9zdC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jb250YWlucyhcbiAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmICghaXNUb2dnbGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlUG9wdXBJbnN0YW5jZSgpO1xuICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWQuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFBvcHVwUG9zaXRpb24oKSB7XG4gICAgICAgIGxldCBwYXJlbnRFbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghdGhpcy5iYXNlRWxlbWVudFNlbGVjdG9yICYmICF0aGlzLnBvcHVwVG9nZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wb3B1cFRvZ2dsZSkge1xuICAgICAgICAgICAgcGFyZW50RWwgPSB0aGlzLnBvcHVwVG9nZ2xlLmhvc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudEVsID1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pih0aGlzLmJhc2VFbGVtZW50U2VsZWN0b3IpID8/XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXJlbnRFbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FuQmUgPSB0aGlzLmVkZ2VEZXRlY3Rvci5jYW5CZShcbiAgICAgICAgICAgIDxIVE1MRWxlbWVudD5wYXJlbnRFbCxcbiAgICAgICAgICAgIHRoaXMucG9wdXBBcmVhQ29udGVudC5uYXRpdmVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX2RpcmVjdGlvblRvcCA9IF9pc1VuZGVmaW5lZCh0aGlzLmRpcmVjdGlvblRvcClcbiAgICAgICAgICAgID8gIWNhbkJlPy5wbGFjZWQuYm90dG9tXG4gICAgICAgICAgICA6IHRoaXMuZGlyZWN0aW9uVG9wO1xuICAgICAgICB0aGlzLl9kaXJlY3Rpb25SaWdodCA9IF9pc1VuZGVmaW5lZCh0aGlzLmRpcmVjdGlvblJpZ2h0KVxuICAgICAgICAgICAgPyAhY2FuQmU/LmFsaWduZWQubGVmdFxuICAgICAgICAgICAgOiB0aGlzLmRpcmVjdGlvblJpZ2h0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVsZXRlUG9wdXBJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5fcG9wdXBJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cEluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMucG9wdXBTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGVsZXRlUG9wdXBJbnN0YW5jZSgpO1xuICAgIH1cbn1cbiJdfQ==