@kirbydesign/designsystem 6.0.1 → 6.0.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.
@@ -455,10 +455,10 @@ export class ModalWrapperComponent {
455
455
  }
456
456
  ModalWrapperComponent.KEYBOARD_HIDE_DELAY_IN_MS = 100;
457
457
  /** @nocollapse */ ModalWrapperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: ModalWrapperComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i1.ResizeObserverService }, { token: i0.ComponentFactoryResolver }, { token: i2.WindowRef }, { token: i3.PlatformService }], target: i0.ɵɵFactoryTarget.Component });
458
- /** @nocollapse */ ModalWrapperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: ModalWrapperComponent, selector: "kirby-modal-wrapper", inputs: { config: "config" }, host: { listeners: { "window:focus": "onFocusChange()", "window:focusout": "onFocusChange()", "window:ionKeyboardDidShow": "_onKeyboardShow($event.detail.keyboardHeight)", "window:keyboardWillShow": "_onKeyboardShow($event.keyboardHeight)", "window:ionKeyboardDidHide": "_onKeyboardHide()", "window:keyboardWillHide": "_onKeyboardHide()", "window:resize": "_onWindowResize()" }, properties: { "class.collapsible-title": "this._hasCollapsibleTitle", "class.drawer": "this._isDrawer" } }, providers: [{ provide: Modal, useExisting: ModalWrapperComponent }], viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "ionContentElement", first: true, predicate: IonContent, descendants: true, read: ElementRef, static: true }, { propertyName: "ionHeaderElement", first: true, predicate: IonHeader, descendants: true, read: ElementRef, static: true }, { propertyName: "ionToolbarElement", first: true, predicate: IonToolbar, descendants: true, read: ElementRef, static: true }, { propertyName: "ionTitleElement", first: true, predicate: IonTitle, descendants: true, read: ElementRef, static: true }, { propertyName: "routerOutlet", first: true, predicate: RouterOutlet, descendants: true, static: true }, { propertyName: "contentTitle", first: true, predicate: ["contentTitle"], descendants: true, read: ElementRef }, { propertyName: "toolbarButtonsQuery", predicate: ButtonComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<ion-header (touchstart)=\"onHeaderTouchStart($event)\">\n <ion-toolbar>\n <ion-title></ion-title>\n <ion-buttons slot=\"start\" *ngIf=\"config.flavor === 'drawer'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'arrow-down' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'modal'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'close' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'drawer' && config.drawerSupplementaryAction\">\n <ng-container\n *ngTemplateOutlet=\"supplementaryButton; context: { btn: config.drawerSupplementaryAction }\"\n ></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content [scrollEvents]=\"true\">\n <ion-header *ngIf=\"_hasCollapsibleTitle\" collapse=\"condense\">\n <ion-toolbar>\n <span class=\"kirby-text-large\" #contentTitle></span>\n </ion-toolbar>\n </ion-header>\n <ng-container\n *ngComponentOutlet=\"config.component; injector: componentPropsInjector\"\n ></ng-container>\n <router-outlet\n name=\"kirbyModalWrapperOutlet\"\n [style.visibility]=\"config.modalRoute ? 'visible' : 'hidden'\"\n ></router-outlet>\n</ion-content>\n\n<ng-template #closeButton let-icon=\"icon\">\n <button kirby-button attentionLevel=\"4\" size=\"sm\" (click)=\"close()\">\n <kirby-icon [name]=\"icon\"></kirby-icon>\n </button>\n</ng-template>\n\n<ng-template #supplementaryButton let-btn=\"btn\">\n <button kirby-button attentionLevel=\"2\" size=\"sm\" (click)=\"btn.action($event)\">\n <kirby-icon [name]=\"btn.iconName\"></kirby-icon>\n </button>\n</ng-template>\n", styles: ["ion-header ion-toolbar{--padding-start: 16px;--padding-end: 16px;--padding-bottom: 16px;--padding-top: 16px;--border-width: 0;--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black))}ion-header ion-toolbar button{color:var(--color)}@media (min-width: 721px){ion-header ion-toolbar{padding-top:8px}}:host{--vh100: var(--vh, 1vh) * 100;--header-height: 0px;--footer-height: 0px}:host.drawer ion-header ion-toolbar:first-of-type{padding-top:0}@media (min-width: 721px){:host-context(ion-modal:not(.kirby-modal-full-height)){padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer{padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:var(--kirby-safe-area-top, 0)}@media (min-width: 721px){:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:8px}}ion-title{box-sizing:border-box;padding-inline-start:calc(48px + var(--padding-start));padding-inline-end:calc(48px + var(--padding-end));font-size:22px;font-weight:700}:host(.drawer) ion-title{font-size:18px}ion-content{--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black));display:flex;flex-direction:column;--padding-top: 24px;--padding-bottom: 24px;--padding-start: 16px;--padding-end: 16px}ion-content ::ng-deep>*{box-sizing:border-box;display:block}@media (min-width: 721px){ion-content{--padding-start: 56px;--padding-end: 56px}}:host(.collapsible-title) ion-content{--padding-top: 0px}:host(.collapsible-title) ion-content ion-header ion-toolbar:first-of-type{padding-top:0;--padding-top: 0px;--padding-bottom: 0px;--padding-start: 0px;--padding-end: 0px}:host(.collapsible-title) ion-title{font-size:16px;font-weight:700}\n"], components: [{ type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i5.ButtonComponent, selector: "button[kirby-button],Button[kirby-button]", inputs: ["attentionLevel", "isDestructive", "themeColor", "expand", "isFloating", "size"] }, { type: i6.IconComponent, selector: "kirby-icon", inputs: ["size", "name", "customName"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModuleFactory"] }, { type: i8.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
458
+ /** @nocollapse */ ModalWrapperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: ModalWrapperComponent, selector: "kirby-modal-wrapper", inputs: { config: "config" }, host: { listeners: { "window:focus": "onFocusChange()", "window:focusout": "onFocusChange()", "window:ionKeyboardDidShow": "_onKeyboardShow($event.detail.keyboardHeight)", "window:keyboardWillShow": "_onKeyboardShow($event.keyboardHeight)", "window:ionKeyboardDidHide": "_onKeyboardHide()", "window:keyboardWillHide": "_onKeyboardHide()", "window:resize": "_onWindowResize()" }, properties: { "class.collapsible-title": "this._hasCollapsibleTitle", "class.drawer": "this._isDrawer" } }, providers: [{ provide: Modal, useExisting: ModalWrapperComponent }], viewQueries: [{ propertyName: "ionContent", first: true, predicate: IonContent, descendants: true, static: true }, { propertyName: "ionContentElement", first: true, predicate: IonContent, descendants: true, read: ElementRef, static: true }, { propertyName: "ionHeaderElement", first: true, predicate: IonHeader, descendants: true, read: ElementRef, static: true }, { propertyName: "ionToolbarElement", first: true, predicate: IonToolbar, descendants: true, read: ElementRef, static: true }, { propertyName: "ionTitleElement", first: true, predicate: IonTitle, descendants: true, read: ElementRef, static: true }, { propertyName: "routerOutlet", first: true, predicate: RouterOutlet, descendants: true, static: true }, { propertyName: "contentTitle", first: true, predicate: ["contentTitle"], descendants: true, read: ElementRef }, { propertyName: "toolbarButtonsQuery", predicate: ButtonComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<ion-header (touchstart)=\"onHeaderTouchStart($event)\">\n <ion-toolbar>\n <ion-title></ion-title>\n <ion-buttons slot=\"start\" *ngIf=\"config.flavor === 'drawer'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'arrow-down' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'modal'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'close' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'drawer' && config.drawerSupplementaryAction\">\n <ng-container\n *ngTemplateOutlet=\"supplementaryButton; context: { btn: config.drawerSupplementaryAction }\"\n ></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content [scrollEvents]=\"true\">\n <ion-header *ngIf=\"_hasCollapsibleTitle\" collapse=\"condense\">\n <ion-toolbar>\n <span class=\"kirby-text-large\" #contentTitle></span>\n </ion-toolbar>\n </ion-header>\n <ng-container\n *ngComponentOutlet=\"config.component; injector: componentPropsInjector\"\n ></ng-container>\n <router-outlet\n name=\"kirbyModalWrapperOutlet\"\n [style.visibility]=\"config.modalRoute ? 'visible' : 'hidden'\"\n ></router-outlet>\n</ion-content>\n\n<ng-template #closeButton let-icon=\"icon\">\n <button kirby-button attentionLevel=\"4\" size=\"md\" (click)=\"close()\">\n <kirby-icon [name]=\"icon\"></kirby-icon>\n </button>\n</ng-template>\n\n<ng-template #supplementaryButton let-btn=\"btn\">\n <button kirby-button attentionLevel=\"2\" size=\"md\" (click)=\"btn.action($event)\">\n <kirby-icon [name]=\"btn.iconName\"></kirby-icon>\n </button>\n</ng-template>\n", styles: ["ion-header ion-toolbar{--padding-start: 16px;--padding-end: 16px;--padding-bottom: 12px;--padding-top: 12px;--border-width: 0;--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black))}ion-header ion-toolbar button{color:var(--color)}@media (min-width: 721px){ion-header ion-toolbar{padding-top:8px}}:host{--vh100: var(--vh, 1vh) * 100;--header-height: 0px;--footer-height: 0px}:host.drawer ion-header ion-toolbar:first-of-type{padding-top:0}@media (min-width: 721px){:host-context(ion-modal:not(.kirby-modal-full-height)){padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer{padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:var(--kirby-safe-area-top, 0)}@media (min-width: 721px){:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:8px}}ion-title{box-sizing:border-box;padding-inline-start:calc(48px + var(--padding-start));padding-inline-end:calc(48px + var(--padding-end));font-size:22px;font-weight:700}:host(.drawer) ion-title{font-size:18px}ion-content{--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black));display:flex;flex-direction:column;--padding-top: 24px;--padding-bottom: 24px;--padding-start: 16px;--padding-end: 16px}ion-content ::ng-deep>*{box-sizing:border-box;display:block}@media (min-width: 721px){ion-content{--padding-start: 56px;--padding-end: 56px}}:host(.collapsible-title) ion-content{--padding-top: 0px}:host(.collapsible-title) ion-content ion-header ion-toolbar:first-of-type{padding-top:0;--padding-top: 0px;--padding-bottom: 0px;--padding-start: 0px;--padding-end: 0px}:host(.collapsible-title) ion-title{font-size:16px;font-weight:700}\n"], components: [{ type: i4.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { type: i4.IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { type: i5.ButtonComponent, selector: "button[kirby-button],Button[kirby-button]", inputs: ["attentionLevel", "isDestructive", "themeColor", "expand", "isFloating", "size"] }, { type: i6.IconComponent, selector: "kirby-icon", inputs: ["size", "name", "customName"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModuleFactory"] }, { type: i8.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
459
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: ModalWrapperComponent, decorators: [{
460
460
  type: Component,
461
- args: [{ selector: 'kirby-modal-wrapper', providers: [{ provide: Modal, useExisting: ModalWrapperComponent }], template: "<ion-header (touchstart)=\"onHeaderTouchStart($event)\">\n <ion-toolbar>\n <ion-title></ion-title>\n <ion-buttons slot=\"start\" *ngIf=\"config.flavor === 'drawer'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'arrow-down' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'modal'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'close' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'drawer' && config.drawerSupplementaryAction\">\n <ng-container\n *ngTemplateOutlet=\"supplementaryButton; context: { btn: config.drawerSupplementaryAction }\"\n ></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content [scrollEvents]=\"true\">\n <ion-header *ngIf=\"_hasCollapsibleTitle\" collapse=\"condense\">\n <ion-toolbar>\n <span class=\"kirby-text-large\" #contentTitle></span>\n </ion-toolbar>\n </ion-header>\n <ng-container\n *ngComponentOutlet=\"config.component; injector: componentPropsInjector\"\n ></ng-container>\n <router-outlet\n name=\"kirbyModalWrapperOutlet\"\n [style.visibility]=\"config.modalRoute ? 'visible' : 'hidden'\"\n ></router-outlet>\n</ion-content>\n\n<ng-template #closeButton let-icon=\"icon\">\n <button kirby-button attentionLevel=\"4\" size=\"sm\" (click)=\"close()\">\n <kirby-icon [name]=\"icon\"></kirby-icon>\n </button>\n</ng-template>\n\n<ng-template #supplementaryButton let-btn=\"btn\">\n <button kirby-button attentionLevel=\"2\" size=\"sm\" (click)=\"btn.action($event)\">\n <kirby-icon [name]=\"btn.iconName\"></kirby-icon>\n </button>\n</ng-template>\n", styles: ["ion-header ion-toolbar{--padding-start: 16px;--padding-end: 16px;--padding-bottom: 16px;--padding-top: 16px;--border-width: 0;--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black))}ion-header ion-toolbar button{color:var(--color)}@media (min-width: 721px){ion-header ion-toolbar{padding-top:8px}}:host{--vh100: var(--vh, 1vh) * 100;--header-height: 0px;--footer-height: 0px}:host.drawer ion-header ion-toolbar:first-of-type{padding-top:0}@media (min-width: 721px){:host-context(ion-modal:not(.kirby-modal-full-height)){padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer{padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:var(--kirby-safe-area-top, 0)}@media (min-width: 721px){:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:8px}}ion-title{box-sizing:border-box;padding-inline-start:calc(48px + var(--padding-start));padding-inline-end:calc(48px + var(--padding-end));font-size:22px;font-weight:700}:host(.drawer) ion-title{font-size:18px}ion-content{--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black));display:flex;flex-direction:column;--padding-top: 24px;--padding-bottom: 24px;--padding-start: 16px;--padding-end: 16px}ion-content ::ng-deep>*{box-sizing:border-box;display:block}@media (min-width: 721px){ion-content{--padding-start: 56px;--padding-end: 56px}}:host(.collapsible-title) ion-content{--padding-top: 0px}:host(.collapsible-title) ion-content ion-header ion-toolbar:first-of-type{padding-top:0;--padding-top: 0px;--padding-bottom: 0px;--padding-start: 0px;--padding-end: 0px}:host(.collapsible-title) ion-title{font-size:16px;font-weight:700}\n"] }]
461
+ args: [{ selector: 'kirby-modal-wrapper', providers: [{ provide: Modal, useExisting: ModalWrapperComponent }], template: "<ion-header (touchstart)=\"onHeaderTouchStart($event)\">\n <ion-toolbar>\n <ion-title></ion-title>\n <ion-buttons slot=\"start\" *ngIf=\"config.flavor === 'drawer'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'arrow-down' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'modal'\">\n <ng-container *ngTemplateOutlet=\"closeButton; context: { icon: 'close' }\"></ng-container>\n </ion-buttons>\n <ion-buttons slot=\"end\" *ngIf=\"config.flavor === 'drawer' && config.drawerSupplementaryAction\">\n <ng-container\n *ngTemplateOutlet=\"supplementaryButton; context: { btn: config.drawerSupplementaryAction }\"\n ></ng-container>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content [scrollEvents]=\"true\">\n <ion-header *ngIf=\"_hasCollapsibleTitle\" collapse=\"condense\">\n <ion-toolbar>\n <span class=\"kirby-text-large\" #contentTitle></span>\n </ion-toolbar>\n </ion-header>\n <ng-container\n *ngComponentOutlet=\"config.component; injector: componentPropsInjector\"\n ></ng-container>\n <router-outlet\n name=\"kirbyModalWrapperOutlet\"\n [style.visibility]=\"config.modalRoute ? 'visible' : 'hidden'\"\n ></router-outlet>\n</ion-content>\n\n<ng-template #closeButton let-icon=\"icon\">\n <button kirby-button attentionLevel=\"4\" size=\"md\" (click)=\"close()\">\n <kirby-icon [name]=\"icon\"></kirby-icon>\n </button>\n</ng-template>\n\n<ng-template #supplementaryButton let-btn=\"btn\">\n <button kirby-button attentionLevel=\"2\" size=\"md\" (click)=\"btn.action($event)\">\n <kirby-icon [name]=\"btn.iconName\"></kirby-icon>\n </button>\n</ng-template>\n", styles: ["ion-header ion-toolbar{--padding-start: 16px;--padding-end: 16px;--padding-bottom: 12px;--padding-top: 12px;--border-width: 0;--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black))}ion-header ion-toolbar button{color:var(--color)}@media (min-width: 721px){ion-header ion-toolbar{padding-top:8px}}:host{--vh100: var(--vh, 1vh) * 100;--header-height: 0px;--footer-height: 0px}:host.drawer ion-header ion-toolbar:first-of-type{padding-top:0}@media (min-width: 721px){:host-context(ion-modal:not(.kirby-modal-full-height)){padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)) ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer{padding-top:0;position:relative;contain:inherit;min-height:min(var(--min-height),var(--vh100) - var(--kirby-modal-padding-top, 0px))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content{contain:content;max-height:calc(var(--vh100) - var(--kirby-modal-padding-top, 0px) - var(--header-height) - var(--footer-height))}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer ion-content::part(scroll){height:\"100%\";position:relative}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer ion-content::part(scroll){transition:padding-bottom .15s ease-out}:host-context(ion-modal:not(.kirby-modal-full-height)).drawer.drawer.keyboard-visible ion-content::part(scroll){transition:padding-bottom .25s ease-out 1ms}:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:var(--kirby-safe-area-top, 0)}@media (min-width: 721px){:host-context(ion-modal.modal-card:not(.kirby-drawer)) ion-header ion-toolbar:first-of-type{padding-top:8px}}ion-title{box-sizing:border-box;padding-inline-start:calc(48px + var(--padding-start));padding-inline-end:calc(48px + var(--padding-end));font-size:22px;font-weight:700}:host(.drawer) ion-title{font-size:18px}ion-content{--background: transparent;--color: var(--kirby-modal-color, var(--kirby-black));display:flex;flex-direction:column;--padding-top: 24px;--padding-bottom: 24px;--padding-start: 16px;--padding-end: 16px}ion-content ::ng-deep>*{box-sizing:border-box;display:block}@media (min-width: 721px){ion-content{--padding-start: 56px;--padding-end: 56px}}:host(.collapsible-title) ion-content{--padding-top: 0px}:host(.collapsible-title) ion-content ion-header ion-toolbar:first-of-type{padding-top:0;--padding-top: 0px;--padding-bottom: 0px;--padding-start: 0px;--padding-end: 0px}:host(.collapsible-title) ion-title{font-size:16px;font-weight:700}\n"] }]
462
462
  }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.ResizeObserverService }, { type: i0.ComponentFactoryResolver }, { type: i2.WindowRef }, { type: i3.PlatformService }]; }, propDecorators: { _hasCollapsibleTitle: [{
463
463
  type: HostBinding,
464
464
  args: ['class.collapsible-title']
@@ -513,4 +513,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
513
513
  type: HostListener,
514
514
  args: ['window:resize']
515
515
  }] } });
516
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwtd3JhcHBlci9tb2RhbC13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9tb2RhbC9tb2RhbC13cmFwcGVyL21vZGFsLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sU0FBUyxFQUNULFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWtCLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxP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Z0JBQWdCO3NCQUR2QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHaEQsaUJBQWlCO3NCQUR4QixTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHakQsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRUosWUFBWTtzQkFBOUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdqQyxZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBbUMzQyxTQUFTO3NCQURaLFdBQVc7dUJBQUMsY0FBYztnQkFnTTNCLGFBQWE7c0JBRlosWUFBWTt1QkFBQyxjQUFjOztzQkFDM0IsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBUS9CLGVBQWU7c0JBRmQsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxDQUFDLDhCQUE4QixDQUFDOztzQkFDMUUsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQU9sRSxlQUFlO3NCQUZkLFlBQVk7dUJBQUMsMkJBQTJCOztzQkFDeEMsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBb0Z2QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBSZW5kZXJlclN0eWxlRmxhZ3MyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uVGl0bGUsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEZXNpZ25Ub2tlbkhlbHBlciB9IGZyb20gJ0BraXJieWRlc2lnbi9jb3JlJztcblxuaW1wb3J0IHsgS2lyYnlBbmltYXRpb24gfSBmcm9tICcuLi8uLi8uLi9hbmltYXRpb24va2lyYnktYW5pbWF0aW9uJztcbmltcG9ydCB7IFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICcuLi8uLi8uLi90eXBlcy93aW5kb3ctcmVmJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlc2l6ZU9ic2VydmVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9yZXNpemUtb2JzZXJ2ZXIvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJy4uLy4uL3NoYXJlZC9yZXNpemUtb2JzZXJ2ZXIvdHlwZXMvcmVzaXplLW9ic2VydmVyLWVudHJ5JztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kYWwuaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IE1vZGFsQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvbW9kYWwtY29uZmlnJztcbmltcG9ydCB7IENPTVBPTkVOVF9QUk9QUyB9IGZyb20gJy4vY29uZmlnL21vZGFsLWNvbmZpZy5oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraXJieS1tb2RhbC13cmFwcGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb2RhbC13cmFwcGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTW9kYWwsIHVzZUV4aXN0aW5nOiBNb2RhbFdyYXBwZXJDb21wb25lbnQgfV0sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE1vZGFsLCBBZnRlclZpZXdJbml0LCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29sbGFwc2libGUtdGl0bGUnKVxuICBnZXQgX2hhc0NvbGxhcHNpYmxlVGl0bGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWc/LmNvbGxhcHNlVGl0bGU7XG4gIH1cblxuICBzdGF0aWMgcmVhZG9ubHkgS0VZQk9BUkRfSElERV9ERUxBWV9JTl9NUyA9IDEwMDtcblxuICBzY3JvbGxZOiBudW1iZXIgPSBNYXRoLmFicyh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuc2Nyb2xsWSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUUgPSAxMDA7XG5cbiAgc2V0IHNjcm9sbERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pb25Db250ZW50LnNjcm9sbFkgPSAhZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKSBjb25maWc6IE1vZGFsQ29uZmlnO1xuICBjb21wb25lbnRQcm9wc0luamVjdG9yOiBJbmplY3RvcjtcblxuICBAVmlld0NoaWxkcmVuKEJ1dHRvbkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgdG9vbGJhckJ1dHRvbnNRdWVyeTogUXVlcnlMaXN0PFxuICAgIEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+XG4gID47XG4gIEBWaWV3Q2hpbGQoSW9uQ29udGVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpb25Db250ZW50OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uQ29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkNvbnRlbnRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChJb25IZWFkZXIsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uSGVhZGVyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uSGVhZGVyRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoSW9uVG9vbGJhciwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBpb25Ub29sYmFyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uVG9vbGJhckVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKElvblRpdGxlLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIGlvblRpdGxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uVGl0bGVFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChSb3V0ZXJPdXRsZXQsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgcm91dGVyT3V0bGV0OiBSb3V0ZXJPdXRsZXQ7XG5cbiAgQFZpZXdDaGlsZCgnY29udGVudFRpdGxlJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgY29udGVudFRpdGxlOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGtleWJvYXJkVmlzaWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHRvb2xiYXJCdXR0b25zOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgZGVsYXllZENsb3NlID0gKCkgPT4ge307XG4gIHByaXZhdGUgZGVsYXllZENsb3NlVGltZW91dElkO1xuICBwcml2YXRlIGluaXRpYWxWaWV3cG9ydEhlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIHZpZXdwb3J0UmVzaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIGlvbk1vZGFsRWxlbWVudD86IEhUTUxJb25Nb2RhbEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9uTW9kYWxEaWRQcmVzZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcmVhZG9ubHkgZGlkUHJlc2VudCA9IHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50LnRvUHJvbWlzZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvbk1vZGFsV2lsbERpc21pc3MgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSB3aWxsQ2xvc2UgPSB0aGlzLmlvbk1vZGFsV2lsbERpc21pc3MudG9Qcm9taXNlKCk7XG4gIHByaXZhdGUgdmlld3BvcnRSZXNpemUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHZpZXdwb3J0UmVzaXplJCA9IHRoaXMudmlld3BvcnRSZXNpemVcbiAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5WSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRSkpO1xuICBwcml2YXRlIF9tdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGdldCBtdXRhdGlvbk9ic2VydmVyKCk6IE11dGF0aW9uT2JzZXJ2ZXIge1xuICAgIGlmICghdGhpcy5fbXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IHRoaXMuY3JlYXRlRW1iZWRkZWRFbGVtZW50c011dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXI7XG4gIH1cbiAgcHJpdmF0ZSBfaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGdldCBpbnRlcnNlY3Rpb25PYnNlcnZlcigpOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB7XG4gICAgaWYgKCF0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5faW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSB0aGlzLmNyZWF0ZU1vZGFsV3JhcHBlckludGVyc2VjdGlvbk9ic2VydmVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgfVxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRyYXdlcicpXG4gIGdldCBfaXNEcmF3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcic7XG4gIH1cblxuICB3aWxsQ2xvc2UkID0gdGhpcy5pb25Nb2RhbFdpbGxEaXNtaXNzLnBpcGUoZmlyc3QoKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlclNlcnZpY2U6IFJlc2l6ZU9ic2VydmVyU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgd2luZG93UmVmOiBXaW5kb3dSZWYsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2V0Vmlld3BvcnRIZWlnaHQoKTtcbiAgICB0aGlzLm9ic2VydmVWaWV3cG9ydFJlc2l6ZSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pb25Nb2RhbEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdpb24tbW9kYWwnKTtcbiAgICB0aGlzLmluaXRpYWxpemVTaXppbmcoKTtcbiAgICB0aGlzLmluaXRpYWxpemVNb2RhbFJvdXRlKCk7XG4gICAgdGhpcy5saXN0ZW5Gb3JJb25Nb2RhbERpZFByZXNlbnQoKTtcbiAgICB0aGlzLmxpc3RlbkZvcklvbk1vZGFsV2lsbERpc21pc3MoKTtcbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVNb2RhbFRvTW9kYWxXcmFwcGVyKCk7XG4gICAgdGhpcy5jb21wb25lbnRQcm9wc0luamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQ09NUE9ORU5UX1BST1BTLCB1c2VWYWx1ZTogdGhpcy5jb25maWcuY29tcG9uZW50UHJvcHMgfV0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVSZXNpemVNb2RhbFRvTW9kYWxXcmFwcGVyKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInICYmIHRoaXMuY29uZmlnLmludGVyYWN0V2l0aEJhY2tncm91bmQpIHtcbiAgICAgIG1lcmdlKHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50LCB0aGlzLnZpZXdwb3J0UmVzaXplJClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyB3YWl0IGZvciB0ZW1wbGF0ZSB0byByZW5kZXJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbVJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZG9jdW1lbnQuY2xpZW50V2lkdGggLSBkb21SZWN0LnJpZ2h0O1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlvbk1vZGFsRWxlbWVudCwgJ3RvcCcsIGAke2RvbVJlY3QudG9wfXB4YCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW9uTW9kYWxFbGVtZW50LCAnbGVmdCcsIGAke2RvbVJlY3QubGVmdH1weGApO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlvbk1vZGFsRWxlbWVudCwgJ3JpZ2h0JywgYCR7cmlnaHR9cHhgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2l6aW5nKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zaXplID09PSAnZnVsbC1oZWlnaHQnKSByZXR1cm47XG4gICAgdGhpcy5wYXRjaFNjcm9sbEVsZW1lbnRTaXplKCk7XG4gICAgdGhpcy5vYnNlcnZlSGVhZGVyUmVzaXplKCk7XG4gICAgdGhpcy5vYnNlcnZlTW9kYWxGdWxsSGVpZ2h0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb2RhbFJvdXRlKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RhbFJvdXRlKSB7XG4gICAgICB0aGlzLm9uU2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQodGhpcy5jb25maWcuc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkKTtcbiAgICAgIC8vIExvYWQgY29tcG9uZW50IGZyb20gbW9kYWwtcm91dGUgaW5zaWRlIHJvdXRlci1vdXRsZXQ6XG4gICAgICB0aGlzLnJvdXRlck91dGxldC5hY3RpdmF0ZVdpdGgodGhpcy5jb25maWcubW9kYWxSb3V0ZSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TaWJsaW5nTW9kYWxSb3V0ZUFjdGl2YXRlZChzaWJsaW5nTW9kYWxSb3V0ZUFjdGl2YXRlZCQ/OiBPYnNlcnZhYmxlPEFjdGl2YXRlZFJvdXRlPikge1xuICAgIGlmICghc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkKSByZXR1cm47XG4gICAgc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMud2lsbENsb3NlJCkpLnN1YnNjcmliZSgocm91dGUpID0+IHtcbiAgICAgIGlmICh0aGlzLnJvdXRlck91dGxldC5pc0FjdGl2YXRlZCkge1xuICAgICAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLnJvdXRlck91dGxldC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJvdXRlck91dGxldC5hY3RpdmF0ZVdpdGgocm91dGUsIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTtcbiAgICAgIHRoaXMuY2hlY2tGb3JFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoU2Nyb2xsRWxlbWVudFNpemUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydHNDc3NTaGFkb3dQYXJ0cyA9ICdwYXJ0JyBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG4gICAgaWYgKHN1cHBvcnRzQ3NzU2hhZG93UGFydHMpIHJldHVybjtcbiAgICB0aGlzLmlvbkNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpLnRoZW4oKHNjcm9sbEVsZW1lbnQpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc2Nyb2xsRWxlbWVudCwgJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNjcm9sbEVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcicpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgICAgICAncGFkZGluZy1ib3R0b20gJyArIERlc2lnblRva2VuSGVscGVyLnNvZnRLZXlib2FyZFRyYW5zaXRpb25MZWF2ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlTW9kYWxGdWxsSGVpZ2h0KCkge1xuICAgIGNvbnN0IGlvbk1vZGFsV3JhcHBlciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcubW9kYWwtd3JhcHBlcicpO1xuICAgIGlmICghaW9uTW9kYWxXcmFwcGVyKSByZXR1cm47XG4gICAgLy8gU3RhcnQgb2JzZXJ2aW5nIHdoZW4gbW9kYWwgaGFzIGZpbmlzaGVkIGFuaW1hdGluZzpcbiAgICB0aGlzLmRpZFByZXNlbnQudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUoaW9uTW9kYWxXcmFwcGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sYmFyQnV0dG9uc1F1ZXJ5KSB7XG4gICAgICB0aGlzLnRvb2xiYXJCdXR0b25zID0gdGhpcy50b29sYmFyQnV0dG9uc1F1ZXJ5Lm1hcCgoYnV0dG9uUmVmKSA9PiBidXR0b25SZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tGb3JFbWJlZGRlZEVsZW1lbnRzKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICB0aGlzLm1vdmVFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgdGhpcy5vYnNlcnZlRW1iZWRkZWRFbGVtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlSGVhZGVyUmVzaXplKCkge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLm9ic2VydmUodGhpcy5pb25IZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgW3Byb3BlcnR5LCBwaXhlbFZhbHVlXSA9IFsnLS1oZWFkZXItaGVpZ2h0JywgYCR7ZW50cnkuY29udGVudFJlY3QuaGVpZ2h0fXB4YF07XG4gICAgICB0aGlzLnNldENzc1Zhcih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgcHJvcGVydHksIHBpeGVsVmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTtcbiAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbGVtZW50VG9QYXJlbnRNYXApLmZvckVhY2goKFt0YWdOYW1lLCBnZXROZXdQYXJlbnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkRWxlbWVudCA9IHBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4odGFnTmFtZSk7XG4gICAgICAgIGlmIChlbWJlZGRlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLm1vdmVDaGlsZChlbWJlZGRlZEVsZW1lbnQsIGdldE5ld1BhcmVudCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JJb25Nb2RhbERpZFByZXNlbnQoKSB7XG4gICAgaWYgKHRoaXMuaW9uTW9kYWxFbGVtZW50KSB7XG4gICAgICB0aGlzLmlvbk1vZGFsRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpb25Nb2RhbERpZFByZXNlbnQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50Lm5leHQoKTtcbiAgICAgICAgdGhpcy5pb25Nb2RhbERpZFByZXNlbnQuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuRm9ySW9uTW9kYWxXaWxsRGlzbWlzcygpIHtcbiAgICBpZiAodGhpcy5pb25Nb2RhbEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaW9uTW9kYWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lvbk1vZGFsV2lsbERpc21pc3MnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxXaWxsRGlzbWlzcy5uZXh0KCk7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxXaWxsRGlzbWlzcy5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG9Ub3Aoc2Nyb2xsRHVyYXRpb24/OiBLaXJieUFuaW1hdGlvbi5EdXJhdGlvbikge1xuICAgIHRoaXMuaW9uQ29udGVudC5zY3JvbGxUb1RvcChzY3JvbGxEdXJhdGlvbiB8fCAwKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKHNjcm9sbER1cmF0aW9uPzogS2lyYnlBbmltYXRpb24uRHVyYXRpb24pIHtcbiAgICB0aGlzLmlvbkNvbnRlbnQuc2Nyb2xsVG9Cb3R0b20oc2Nyb2xsRHVyYXRpb24gfHwgMCk7XG4gIH1cblxuICBhc3luYyBjbG9zZShkYXRhPzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlvbk1vZGFsRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMua2V5Ym9hcmRWaXNpYmxlIHx8ICF0aGlzLnZpZXdwb3J0UmVzaXplZCkge1xuICAgICAgLy8gTm8ga2V5Ym9hcmQgdmlzaWJsZSBvciB2aWV3cG9ydCBub3QgcmVzaXplZDpcbiAgICAgIC8vIERpc21pc3MgbW9kYWwgYW5kIHJldHVybjpcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5ZWRDbG9zZVRpbWVvdXRJZCk7XG4gICAgICBhd2FpdCB0aGlzLmlvbk1vZGFsRWxlbWVudC5kaXNtaXNzKGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEtleWJvYXJkIHZpc2libGU6XG4gICAgLy8gQmx1ciBhY3RpdmUgZWxlbWVudCBhbmQgd2FpdCBmb3Iga2V5Ym9hcmQgdG8gaGlkZSxcbiAgICAvLyB0aGVuIGRpc21pc3MgbW9kYWwgYW5kIHJldHVybjpcbiAgICB0aGlzLmJsdXJBY3RpdmVFbGVtZW50KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmRlbGF5ZWRDbG9zZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb25Nb2RhbEVsZW1lbnQuZGlzbWlzcyhkYXRhKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGVsYXllZENsb3NlVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgdGhpcy5kZWxheWVkQ2xvc2UsXG4gICAgICAgIE1vZGFsV3JhcHBlckNvbXBvbmVudC5LRVlCT0FSRF9ISURFX0RFTEFZX0lOX01TXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3VzJylcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3Vzb3V0JylcbiAgb25Gb2N1c0NoYW5nZSgpIHtcbiAgICAvLyBUaGlzIGZpeGVzIGFuIHVuZGVzaXJlZCBzY3JvbGwgYmVoYXZpb3VyIG9jY3VycmluZyBvbiBrZXlib2FyZC10YWJiaW5nIGJhY2t3YXJkcyAod2l0aCBzaGlmdCt0YWIpOlxuICAgIHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5zY3JvbGxUbyh7IHRvcDogdGhpcy5zY3JvbGxZIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmlvbktleWJvYXJkRGlkU2hvdycsIFsnJGV2ZW50LmRldGFpbC5rZXlib2FyZEhlaWdodCddKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5Ym9hcmRXaWxsU2hvdycsIFsnJGV2ZW50LmtleWJvYXJkSGVpZ2h0J10pXG4gIF9vbktleWJvYXJkU2hvdyhrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRLZXlib2FyZFZpc2liaWxpdHkoa2V5Ym9hcmRIZWlnaHQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmlvbktleWJvYXJkRGlkSGlkZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlib2FyZFdpbGxIaWRlJylcbiAgX29uS2V5Ym9hcmRIaWRlKCkge1xuICAgIHRoaXMuc2V0S2V5Ym9hcmRWaXNpYmlsaXR5KDApO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVDb250ZW50TWF4SGVpZ2h0KGZyZWV6ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHNob3VsZFRvZ2dsZU1heEhlaWdodCA9XG4gICAgICB0aGlzLmNvbmZpZy5mbGF2b3IgPT09ICdtb2RhbCcgJiYgdGhpcy5wbGF0Zm9ybS5pc1BoYWJsZXRPckJpZ2dlcigpO1xuICAgIGlmICghc2hvdWxkVG9nZ2xlTWF4SGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3R5bGUgPSAnbWF4LWhlaWdodCc7XG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB0aGlzLmlvbkNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBpZiAoZnJlZXplKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBjb250ZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGVudEVsZW1lbnQsIHN0eWxlLCBgJHtjb250ZW50SGVpZ2h0fXB4YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGNvbnRlbnRFbGVtZW50LCBzdHlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEtleWJvYXJkVmlzaWJpbGl0eShrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgY29uc3Qga2V5Ym9hcmRBbHJlYWR5VmlzaWJsZSA9IGtleWJvYXJkSGVpZ2h0ID4gMCAmJiB0aGlzLmtleWJvYXJkVmlzaWJsZTtcbiAgICBjb25zdCBrZXlib2FyZEFscmVhZHlIaWRkZW4gPSBrZXlib2FyZEhlaWdodCA9PT0gMCAmJiAhdGhpcy5rZXlib2FyZFZpc2libGU7XG4gICAgaWYgKGtleWJvYXJkQWxyZWFkeVZpc2libGUgfHwga2V5Ym9hcmRBbHJlYWR5SGlkZGVuKSByZXR1cm47XG4gICAgdGhpcy5rZXlib2FyZFZpc2libGUgPSBrZXlib2FyZEhlaWdodCA+IDA7XG4gICAgdGhpcy50b2dnbGVDb250ZW50TWF4SGVpZ2h0KHRoaXMua2V5Ym9hcmRWaXNpYmxlKTtcbiAgICB0aGlzLnNldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGdldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodDogbnVtYmVyLCBlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgaWYgKGtleWJvYXJkSGVpZ2h0IDw9IDAgfHwgIWVsZW1lbnQpIHJldHVybiAwO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVZpZXdwb3J0Qm90dG9tVG9FbGVtZW50ID0gTWF0aC5mbG9vcihcbiAgICAgIHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5pbm5lckhlaWdodCAtIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tXG4gICAgKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoa2V5Ym9hcmRIZWlnaHQgLSBkaXN0YW5jZUZyb21WaWV3cG9ydEJvdHRvbVRvRWxlbWVudCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHNldENzc1ZhcihlbGVtZW50OiBFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PlxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUsIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlQ3NzQ2xhc3MoZWxlbWVudDogRWxlbWVudCwga2xhc3M6IHN0cmluZywgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PlxuICAgICAgY29uZGl0aW9uID8gdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCBrbGFzcykgOiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQsIGtsYXNzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50b2dnbGVDc3NDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2tleWJvYXJkLXZpc2libGUnLCBrZXlib2FyZEhlaWdodCA+IDApO1xuICAgIGNvbnN0IGtleWJvYXJkT3ZlcmxhcCA9IHRoaXMuZ2V0S2V5Ym9hcmRPdmVybGFwKGtleWJvYXJkSGVpZ2h0LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgbGV0IHNuYXBGb290ZXJUb0tleWJvYXJkID0gZmFsc2U7XG4gICAgY29uc3QgZW1iZWRkZWRGb290ZXJFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZEZvb3RlckVsZW1lbnQoKTtcbiAgICBpZiAoZW1iZWRkZWRGb290ZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldENzc1ZhcihlbWJlZGRlZEZvb3RlckVsZW1lbnQsICctLWtleWJvYXJkLW9mZnNldCcsIGAke2tleWJvYXJkT3ZlcmxhcH1weGApO1xuICAgICAgc25hcEZvb3RlclRvS2V5Ym9hcmQgPSBlbWJlZGRlZEZvb3RlckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbmFwLXRvLWtleWJvYXJkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB0aGlzLmlvbkNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY29udGVudEtleWJvYXJkT2Zmc2V0ID0gc25hcEZvb3RlclRvS2V5Ym9hcmRcbiAgICAgID8ga2V5Ym9hcmRPdmVybGFwXG4gICAgICA6IHRoaXMuZ2V0S2V5Ym9hcmRPdmVybGFwKGtleWJvYXJkSGVpZ2h0LCBjb250ZW50RWxlbWVudCk7XG4gICAgdGhpcy5zZXRDc3NWYXIoY29udGVudEVsZW1lbnQsICctLWtleWJvYXJkLW9mZnNldCcsIGAke2NvbnRlbnRLZXlib2FyZE9mZnNldH1weGApO1xuICB9XG5cbiAgb25IZWFkZXJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgaWYgKHRoaXMua2V5Ym9hcmRWaXNpYmxlKSB7XG4gICAgICBjb25zdCBpc1Rvb2xiYXJCdXR0b25Ub3VjaCA9IHRoaXMudG9vbGJhckJ1dHRvbnMuc29tZSgoYnV0dG9uKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0ID09PSBidXR0b24gfHwgYnV0dG9uLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIC8vIFByZXZlbnQgYmx1ciBpZiBldmVudCB0YXJnZXQgaXMgYSB0b29sYmFyIGJ1dHRvblxuICAgICAgLy8gKHRvIGFsbG93IHRhcCBldmVudCB0byBmaXJlKTpcbiAgICAgIGlmICghaXNUb29sYmFyQnV0dG9uVG91Y2gpIHtcbiAgICAgICAgdGhpcy5ibHVyQWN0aXZlRWxlbWVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBfb25XaW5kb3dSZXNpemUoKSB7XG4gICAgdGhpcy5zZXRWaWV3cG9ydEhlaWdodCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaWV3cG9ydEhlaWdodCgpIHtcbiAgICBjb25zdCB2aCA9ICh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuaW5uZXJIZWlnaHQgKiAwLjAxKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMuc2V0Q3NzVmFyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnLS12aCcsIGAke3ZofXB4YCk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVWaWV3cG9ydFJlc2l6ZSgpIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5vYnNlcnZlKHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5kb2N1bWVudC5ib2R5LCAoZW50cnkpID0+XG4gICAgICB0aGlzLm9uVmlld3BvcnRSZXNpemUoZW50cnkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25WaWV3cG9ydFJlc2l6ZShlbnRyeTogUmVzaXplT2JzZXJ2ZXJFbnRyeSkge1xuICAgIGlmICghdGhpcy5pbml0aWFsVmlld3BvcnRIZWlnaHQpIHtcbiAgICAgIC8vIEluaXRpYWwgb2JzZXJ2ZSBjYWxsYmFjaywgcmVnaXN0ZXIgaW5pdGlhbCBoZWlnaHQ6XG4gICAgICB0aGlzLmluaXRpYWxWaWV3cG9ydEhlaWdodCA9IGVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3cG9ydFJlc2l6ZWQgPSBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQgIT09IHRoaXMuaW5pdGlhbFZpZXdwb3J0SGVpZ2h0O1xuICAgIGlmICghdGhpcy52aWV3cG9ydFJlc2l6ZWQpIHtcbiAgICAgIC8vIFdlIGFyZSBiYWNrIHRvIGluaXRpYWwgdmlldyBwb3J0IGhlaWdodCwgY2hlY2sgZm9yIHBlbmRpbmcgY2xvc2UgZnVuYzpcbiAgICAgIGlmICh0aGlzLmRlbGF5ZWRDbG9zZVRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheWVkQ2xvc2VUaW1lb3V0SWQpO1xuICAgICAgICB0aGlzLmRlbGF5ZWRDbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpZXdwb3J0UmVzaXplLm5leHQoKTtcbiAgfVxuXG4gIGJsdXJBY3RpdmVFbGVtZW50KCkge1xuICAgIGNvbnN0IEJMVVJfVEFSR0VUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSc7XG4gICAgaWYgKHRoaXMua2V5Ym9hcmRWaXNpYmxlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50Lm1hdGNoZXMoQkxVUl9UQVJHRVRfU0VMRUNUT1IpXG4gICAgICApIHtcbiAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50VG9QYXJlbnRNYXA6IHsgW2tleTogc3RyaW5nXTogKCkgPT4gSFRNTEVsZW1lbnRbXSB9ID0ge1xuICAgICdLSVJCWS1NT0RBTC1GT09URVInOiAoKSA9PiBbdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRdLFxuICAgICdLSVJCWS1QQUdFLVRJVExFJzogKCkgPT5cbiAgICAgIFt0aGlzLmlvblRpdGxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRlbnRUaXRsZT8ubmF0aXZlRWxlbWVudF0uZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudCAhPT0gdW5kZWZpbmVkXG4gICAgICApLFxuICAgICdLSVJCWS1QQUdFLVBST0dSRVNTJzogKCkgPT4gW3RoaXMuaW9uVG9vbGJhckVsZW1lbnQubmF0aXZlRWxlbWVudF0sXG4gIH07XG5cbiAgcHJpdmF0ZSBjbGVhckVtYmVkZGVkRWxlbWVudHMoKSB7XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5lbGVtZW50VG9QYXJlbnRNYXApLmZvckVhY2goKFt0YWdOYW1lLCBnZXRQYXJlbnRzXSkgPT4ge1xuICAgICAgY29uc3QgbmV3UGFyZW50cyA9IGdldFBhcmVudHMoKTtcbiAgICAgIG5ld1BhcmVudHMuZm9yRWFjaCgobmV3UGFyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkRWxlbWVudCA9IG5ld1BhcmVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgOnNjb3BlID4gJHt0YWdOYW1lfWApO1xuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKGVtYmVkZGVkRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIFRPRE86IFJld3JpdGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIGluZGVwZW5kZW50IG9mIGVsZW1lbnQgb3JkZXIuIFxuICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9raXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vaXNzdWVzLzIwOTZcbiAgKi9cbiAgcHJpdmF0ZSBnZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTogbnVsbCB8IEVsZW1lbnQge1xuICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50Q2hpbGRyZW4gPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5pb25Db250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuXG4gICAgKS5yZXZlcnNlKCk7IC8vIFJldmVyc2UgbWFrZXMgaXQgZWFzaWVyIHRvIHJldHJpZXZlIHRoZSBsYXN0IGNoaWxkcmVuIGluIHRoZSBsaXN0XG5cbiAgICBjb25zdCBlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQgPSAhIXRoaXMuY29uZmlnLm1vZGFsUm91dGVcbiAgICAgID8gY29udGVudEVsZW1lbnRDaGlsZHJlblswXVxuICAgICAgOiBjb250ZW50RWxlbWVudENoaWxkcmVuWzFdO1xuXG4gICAgLyogXG4gICAgICBBcyBNb2RhbENvbmZpZy5jb21wb25lbnQgaGFzIHR5cGUgJ2FueScgYWxsIHZhbHVlcyBhcmUgdmFsaWQgZm9yIGNvbXBvbmVudDsgXG4gICAgICBleHBsaWNpdGx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyBlbWJlZGRlZCBjb21wb25lbnQgZWxlbWVudCBpcyBmb3VuZCBkdWUgdG8gXG4gICAgICB0aGlzLlxuICAgICovXG4gICAgaWYgKCFlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVtYmVkZGVkRm9vdGVyRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2tpcmJ5LW1vZGFsLWZvb3RlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQ2hpbGQoY2hpbGQ6IEVsZW1lbnQsIG5ld1BhcmVudHM6IEVsZW1lbnRbXSkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoY2hpbGQucGFyZW50RWxlbWVudCwgY2hpbGQpO1xuXG4gICAgbmV3UGFyZW50cy5mb3JFYWNoKChuZXdQYXJlbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFRvQXBwZW5kID0gaW5kZXggPiAwID8gY2hpbGQuY2xvbmVOb2RlKHRydWUpIDogY2hpbGQ7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG5ld1BhcmVudCwgY2hpbGRUb0FwcGVuZCk7XG4gICAgICAvLyBBcHBlbmQgYWRkcyBjaGlsZCBhcyBsYXN0IGVsZW1lbnQgb2YgcGFyZW50OyB0aGVyZWZvcmUgcmV0cmlldmUgd2l0aCBsYXN0RWxlbWVudENoaWxkXG4gICAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBuZXdQYXJlbnQubGFzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudC50YWdOYW1lID09PSAnS0lSQlktTU9EQUwtRk9PVEVSJykge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5vYnNlcnZlKGNoaWxkRWxlbWVudCwgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3Byb3BlcnR5LCBwaXhlbFZhbHVlXSA9IFtcbiAgICAgICAgICAgICctLWZvb3Rlci1oZWlnaHQnLFxuICAgICAgICAgICAgYCR7TWF0aC5mbG9vcihlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQpfXB4YCxcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBwcm9wZXJ0eSwgcGl4ZWxWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDaGlsZChjaGlsZD86IEVsZW1lbnQpIHtcbiAgICBpZiAoISFjaGlsZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChjaGlsZC5wYXJlbnRFbGVtZW50LCBjaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTtcbiAgICBpZiAocGFyZW50RWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuOyAvLyBNdXRlIG9ic2VydmUgd2FybmluZyB3aGVuIHBhcmVudEVsZW1lbnQgaXMgbnVsbFxuXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUocGFyZW50RWxlbWVudCwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLCAvLyBMaXN0ZW4gZm9yIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgY2hpbGQgbm9kZXNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRW1iZWRkZWRFbGVtZW50c011dGF0aW9uT2JzZXJ2ZXIoKTogTXV0YXRpb25PYnNlcnZlciB7XG4gICAgY29uc3Qgb2JzZXJ2ZWRFbGVtZW50cyA9IE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudFRvUGFyZW50TWFwKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBtdXRhdGlvbnNcbiAgICAgICAgLmZpbHRlcigobXV0YXRpb24pID0+IG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnKSAvLyBGaWx0ZXIgZm9yIG11dGF0aW9uIHRvIHRoZSB0cmVlIG9mIG5vZGVzXG4gICAgICAgIC5tYXAoKG11dGF0aW9uKSA9PiB7XG4gICAgICAgICAgLy8gT25seSBjaGVjayBmb3IgYWRkZWROb2RlcyBhcyByZW1vdmFsIGlzIGhhbmRsZWQgYnkgdGhlIEFuZ3VsYXIgcmVuZGVyZXI6XG4gICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykuZmlsdGVyKChub2RlKSA9PlxuICAgICAgICAgICAgb2JzZXJ2ZWRFbGVtZW50cy5pbmNsdWRlcyhub2RlLm5vZGVOYW1lKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhZGRlZEVsZW1lbnRzID0gQXJyYXkucHJvdG90eXBlXG4gICAgICAgIC5jb25jYXQoLi4uYWRkZWROb2RlcylcbiAgICAgICAgLmZpbHRlcigobm9kZSk6IG5vZGUgaXMgSFRNTEVsZW1lbnQgPT4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KTtcblxuICAgICAgYWRkZWRFbGVtZW50cy5mb3JFYWNoKChhZGRlZEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgbmV3UGFyZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudFRvUGFyZW50TWFwW2FkZGVkRWxlbWVudC5ub2RlTmFtZV0oKTtcbiAgICAgICAgLy8gTW92ZSBlbWJlZGRlZCBlbGVtZW50IG91dCBvZiBjb250ZW50IGFuZCBhcHBlbmQgdG8gbmV3IHBhcmVudDpcbiAgICAgICAgdGhpcy5tb3ZlQ2hpbGQoYWRkZWRFbGVtZW50LCBuZXdQYXJlbnRFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTW9kYWxXcmFwcGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0IGNhbGxiYWNrOiBJbnRlcnNlY3Rpb25PYnNlcnZlckNhbGxiYWNrID0gKGVudHJpZXMpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIGNvbnN0IGlzVG91Y2hpbmdWaWV3cG9ydCA9IGVudHJ5LmludGVyc2VjdGlvblJhdGlvIDwgMTtcbiAgICAgIGlmIChpc1RvdWNoaW5nVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbnRyeS50YXJnZXQsICdmdWxsLWhlaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbnRyeS50YXJnZXQsICdmdWxsLWhlaWdodCcpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgZXhwbGljaXQgdmlld3BvcnQgcm9vdCBpZiB3aXRoaW4gaWZyYW1lOlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZnJhbWVFbGVtZW50XG4gICAgICA/ICh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQgYXMgYW55KSAvLyBDYXN0IHRvIGBhbnlgIGFzIFR5cGVzY3JpcHQgbGliLmQudHMgZG9lc250IHN1cHBvcnQgRG9jdW1lbnQgdHlwZSB5ZXRcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9wdGlvbnM6IEludGVyc2VjdGlvbk9ic2VydmVySW5pdCA9IHtcbiAgICAgIHJvb3RNYXJnaW46ICcwcHggMHB4IC0xcHggMHB4JywgLy8gYGJvdHRvbTogLTFweGAgYWxsb3dzIGNoZWNraW5nIHdoZW4gdGhlIG1vZGFsIGJvdHRvbSBpcyB0b3VjaGluZyB0aGUgdmlld3BvcnRcbiAgICAgIHJvb3QsXG4gICAgICB0aHJlc2hvbGQ6IFswLjk5LCAxXSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZXJPdXRsZXQuaXNBY3RpdmF0ZWQpIHtcbiAgICAgIHRoaXMucm91dGVyT3V0bGV0LmRlYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgLy9jbGVhbiB1cCB0aGUgb2JzZXJ2ZXJcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGRlbGV0ZSB0aGlzLl9tdXRhdGlvbk9ic2VydmVyO1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGRlbGV0ZSB0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLnVub2JzZXJ2ZSh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQuYm9keSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS51bm9ic2VydmUodGhpcy5pb25IZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UudW5vYnNlcnZlKHRoaXMuZ2V0RW1iZWRkZWRGb290ZXJFbGVtZW50KCkpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyICh0b3VjaHN0YXJ0KT1cIm9uSGVhZGVyVG91Y2hTdGFydCgkZXZlbnQpXCI+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8aW9uLXRpdGxlPjwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIiAqbmdJZj1cImNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VCdXR0b247IGNvbnRleHQ6IHsgaWNvbjogJ2Fycm93LWRvd24nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCIgKm5nSWY9XCJjb25maWcuZmxhdm9yID09PSAnbW9kYWwnXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VCdXR0b247IGNvbnRleHQ6IHsgaWNvbjogJ2Nsb3NlJyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiICpuZ0lmPVwiY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcicgJiYgY29uZmlnLmRyYXdlclN1cHBsZW1lbnRhcnlBY3Rpb25cIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdXBwbGVtZW50YXJ5QnV0dG9uOyBjb250ZXh0OiB7IGJ0bjogY29uZmlnLmRyYXdlclN1cHBsZW1lbnRhcnlBY3Rpb24gfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50IFtzY3JvbGxFdmVudHNdPVwidHJ1ZVwiPlxuICA8aW9uLWhlYWRlciAqbmdJZj1cIl9oYXNDb2xsYXBzaWJsZVRpdGxlXCIgY29sbGFwc2U9XCJjb25kZW5zZVwiPlxuICAgIDxpb24tdG9vbGJhcj5cbiAgICAgIDxzcGFuIGNsYXNzPVwia2lyYnktdGV4dC1sYXJnZVwiICNjb250ZW50VGl0bGU+PC9zcGFuPlxuICAgIDwvaW9uLXRvb2xiYXI+XG4gIDwvaW9uLWhlYWRlcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0NvbXBvbmVudE91dGxldD1cImNvbmZpZy5jb21wb25lbnQ7IGluamVjdG9yOiBjb21wb25lbnRQcm9wc0luamVjdG9yXCJcbiAgPjwvbmctY29udGFpbmVyPlxuICA8cm91dGVyLW91dGxldFxuICAgIG5hbWU9XCJraXJieU1vZGFsV3JhcHBlck91dGxldFwiXG4gICAgW3N0eWxlLnZpc2liaWxpdHldPVwiY29uZmlnLm1vZGFsUm91dGUgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gID48L3JvdXRlci1vdXRsZXQ+XG48L2lvbi1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlQnV0dG9uIGxldC1pY29uPVwiaWNvblwiPlxuICA8YnV0dG9uIGtpcmJ5LWJ1dHRvbiBhdHRlbnRpb25MZXZlbD1cIjRcIiBzaXplPVwic21cIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgIDxraXJieS1pY29uIFtuYW1lXT1cImljb25cIj48L2tpcmJ5LWljb24+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdXBwbGVtZW50YXJ5QnV0dG9uIGxldC1idG49XCJidG5cIj5cbiAgPGJ1dHRvbiBraXJieS1idXR0b24gYXR0ZW50aW9uTGV2ZWw9XCIyXCIgc2l6ZT1cInNtXCIgKGNsaWNrKT1cImJ0bi5hY3Rpb24oJGV2ZW50KVwiPlxuICAgIDxraXJieS1pY29uIFtuYW1lXT1cImJ0bi5pY29uTmFtZVwiPjwva2lyYnktaWNvbj5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Rlc2lnbnN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvbW9kYWwvbW9kYWwtd3JhcHBlci9tb2RhbC13cmFwcGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGVzaWduc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9tb2RhbC9tb2RhbC13cmFwcGVyL21vZGFsLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sU0FBUyxFQUNULFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWtCLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxP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Z0JBQWdCO3NCQUR2QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHaEQsaUJBQWlCO3NCQUR4QixTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHakQsZUFBZTtzQkFEdEIsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBRUosWUFBWTtzQkFBOUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdqQyxZQUFZO3NCQURuQixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBbUMzQyxTQUFTO3NCQURaLFdBQVc7dUJBQUMsY0FBYztnQkFnTTNCLGFBQWE7c0JBRlosWUFBWTt1QkFBQyxjQUFjOztzQkFDM0IsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBUS9CLGVBQWU7c0JBRmQsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxDQUFDLDhCQUE4QixDQUFDOztzQkFDMUUsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQU9sRSxlQUFlO3NCQUZkLFlBQVk7dUJBQUMsMkJBQTJCOztzQkFDeEMsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBb0Z2QyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBSZW5kZXJlclN0eWxlRmxhZ3MyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uVGl0bGUsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaXJzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEZXNpZ25Ub2tlbkhlbHBlciB9IGZyb20gJ0BraXJieWRlc2lnbi9jb3JlJztcblxuaW1wb3J0IHsgS2lyYnlBbmltYXRpb24gfSBmcm9tICcuLi8uLi8uLi9hbmltYXRpb24va2lyYnktYW5pbWF0aW9uJztcbmltcG9ydCB7IFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBXaW5kb3dSZWYgfSBmcm9tICcuLi8uLi8uLi90eXBlcy93aW5kb3ctcmVmJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlc2l6ZU9ic2VydmVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9yZXNpemUtb2JzZXJ2ZXIvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJFbnRyeSB9IGZyb20gJy4uLy4uL3NoYXJlZC9yZXNpemUtb2JzZXJ2ZXIvdHlwZXMvcmVzaXplLW9ic2VydmVyLWVudHJ5JztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kYWwuaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IE1vZGFsQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvbW9kYWwtY29uZmlnJztcbmltcG9ydCB7IENPTVBPTkVOVF9QUk9QUyB9IGZyb20gJy4vY29uZmlnL21vZGFsLWNvbmZpZy5oZWxwZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraXJieS1tb2RhbC13cmFwcGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb2RhbC13cmFwcGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTW9kYWwsIHVzZUV4aXN0aW5nOiBNb2RhbFdyYXBwZXJDb21wb25lbnQgfV0sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE1vZGFsLCBBZnRlclZpZXdJbml0LCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuY29sbGFwc2libGUtdGl0bGUnKVxuICBnZXQgX2hhc0NvbGxhcHNpYmxlVGl0bGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWc/LmNvbGxhcHNlVGl0bGU7XG4gIH1cblxuICBzdGF0aWMgcmVhZG9ubHkgS0VZQk9BUkRfSElERV9ERUxBWV9JTl9NUyA9IDEwMDtcblxuICBzY3JvbGxZOiBudW1iZXIgPSBNYXRoLmFicyh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuc2Nyb2xsWSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgVklFV1BPUlRfUkVTSVpFX0RFQk9VTkNFX1RJTUUgPSAxMDA7XG5cbiAgc2V0IHNjcm9sbERpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pb25Db250ZW50LnNjcm9sbFkgPSAhZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKSBjb25maWc6IE1vZGFsQ29uZmlnO1xuICBjb21wb25lbnRQcm9wc0luamVjdG9yOiBJbmplY3RvcjtcblxuICBAVmlld0NoaWxkcmVuKEJ1dHRvbkNvbXBvbmVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgdG9vbGJhckJ1dHRvbnNRdWVyeTogUXVlcnlMaXN0PFxuICAgIEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+XG4gID47XG4gIEBWaWV3Q2hpbGQoSW9uQ29udGVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBpb25Db250ZW50OiBJb25Db250ZW50O1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uQ29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElvbkNvbnRlbnRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChJb25IZWFkZXIsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgaW9uSGVhZGVyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uSGVhZGVyRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoSW9uVG9vbGJhciwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgcHJpdmF0ZSBpb25Ub29sYmFyRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uVG9vbGJhckVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKElvblRpdGxlLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9KVxuICBwcml2YXRlIGlvblRpdGxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW9uVGl0bGVFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChSb3V0ZXJPdXRsZXQsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgcm91dGVyT3V0bGV0OiBSb3V0ZXJPdXRsZXQ7XG5cbiAgQFZpZXdDaGlsZCgnY29udGVudFRpdGxlJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHByaXZhdGUgY29udGVudFRpdGxlOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGtleWJvYXJkVmlzaWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIHRvb2xiYXJCdXR0b25zOiBIVE1MQnV0dG9uRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgZGVsYXllZENsb3NlID0gKCkgPT4ge307XG4gIHByaXZhdGUgZGVsYXllZENsb3NlVGltZW91dElkO1xuICBwcml2YXRlIGluaXRpYWxWaWV3cG9ydEhlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIHZpZXdwb3J0UmVzaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIGlvbk1vZGFsRWxlbWVudD86IEhUTUxJb25Nb2RhbEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW9uTW9kYWxEaWRQcmVzZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcmVhZG9ubHkgZGlkUHJlc2VudCA9IHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50LnRvUHJvbWlzZSgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlvbk1vZGFsV2lsbERpc21pc3MgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSB3aWxsQ2xvc2UgPSB0aGlzLmlvbk1vZGFsV2lsbERpc21pc3MudG9Qcm9taXNlKCk7XG4gIHByaXZhdGUgdmlld3BvcnRSZXNpemUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHZpZXdwb3J0UmVzaXplJCA9IHRoaXMudmlld3BvcnRSZXNpemVcbiAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5WSUVXUE9SVF9SRVNJWkVfREVCT1VOQ0VfVElNRSkpO1xuICBwcml2YXRlIF9tdXRhdGlvbk9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGdldCBtdXRhdGlvbk9ic2VydmVyKCk6IE11dGF0aW9uT2JzZXJ2ZXIge1xuICAgIGlmICghdGhpcy5fbXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IHRoaXMuY3JlYXRlRW1iZWRkZWRFbGVtZW50c011dGF0aW9uT2JzZXJ2ZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX211dGF0aW9uT2JzZXJ2ZXI7XG4gIH1cbiAgcHJpdmF0ZSBfaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIGdldCBpbnRlcnNlY3Rpb25PYnNlcnZlcigpOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB7XG4gICAgaWYgKCF0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcikge1xuICAgICAgdGhpcy5faW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSB0aGlzLmNyZWF0ZU1vZGFsV3JhcHBlckludGVyc2VjdGlvbk9ic2VydmVyKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgfVxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRyYXdlcicpXG4gIGdldCBfaXNEcmF3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcic7XG4gIH1cblxuICB3aWxsQ2xvc2UkID0gdGhpcy5pb25Nb2RhbFdpbGxEaXNtaXNzLnBpcGUoZmlyc3QoKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlclNlcnZpY2U6IFJlc2l6ZU9ic2VydmVyU2VydmljZSxcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgd2luZG93UmVmOiBXaW5kb3dSZWYsXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc2V0Vmlld3BvcnRIZWlnaHQoKTtcbiAgICB0aGlzLm9ic2VydmVWaWV3cG9ydFJlc2l6ZSgpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pb25Nb2RhbEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9zZXN0KCdpb24tbW9kYWwnKTtcbiAgICB0aGlzLmluaXRpYWxpemVTaXppbmcoKTtcbiAgICB0aGlzLmluaXRpYWxpemVNb2RhbFJvdXRlKCk7XG4gICAgdGhpcy5saXN0ZW5Gb3JJb25Nb2RhbERpZFByZXNlbnQoKTtcbiAgICB0aGlzLmxpc3RlbkZvcklvbk1vZGFsV2lsbERpc21pc3MoKTtcbiAgICB0aGlzLmluaXRpYWxpemVSZXNpemVNb2RhbFRvTW9kYWxXcmFwcGVyKCk7XG4gICAgdGhpcy5jb21wb25lbnRQcm9wc0luamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQ09NUE9ORU5UX1BST1BTLCB1c2VWYWx1ZTogdGhpcy5jb25maWcuY29tcG9uZW50UHJvcHMgfV0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVSZXNpemVNb2RhbFRvTW9kYWxXcmFwcGVyKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInICYmIHRoaXMuY29uZmlnLmludGVyYWN0V2l0aEJhY2tncm91bmQpIHtcbiAgICAgIG1lcmdlKHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50LCB0aGlzLnZpZXdwb3J0UmVzaXplJClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAvLyB3YWl0IGZvciB0ZW1wbGF0ZSB0byByZW5kZXJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRvbVJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZG9jdW1lbnQuY2xpZW50V2lkdGggLSBkb21SZWN0LnJpZ2h0O1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlvbk1vZGFsRWxlbWVudCwgJ3RvcCcsIGAke2RvbVJlY3QudG9wfXB4YCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW9uTW9kYWxFbGVtZW50LCAnbGVmdCcsIGAke2RvbVJlY3QubGVmdH1weGApO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlvbk1vZGFsRWxlbWVudCwgJ3JpZ2h0JywgYCR7cmlnaHR9cHhgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2l6aW5nKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zaXplID09PSAnZnVsbC1oZWlnaHQnKSByZXR1cm47XG4gICAgdGhpcy5wYXRjaFNjcm9sbEVsZW1lbnRTaXplKCk7XG4gICAgdGhpcy5vYnNlcnZlSGVhZGVyUmVzaXplKCk7XG4gICAgdGhpcy5vYnNlcnZlTW9kYWxGdWxsSGVpZ2h0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVNb2RhbFJvdXRlKCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5tb2RhbFJvdXRlKSB7XG4gICAgICB0aGlzLm9uU2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQodGhpcy5jb25maWcuc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkKTtcbiAgICAgIC8vIExvYWQgY29tcG9uZW50IGZyb20gbW9kYWwtcm91dGUgaW5zaWRlIHJvdXRlci1vdXRsZXQ6XG4gICAgICB0aGlzLnJvdXRlck91dGxldC5hY3RpdmF0ZVdpdGgodGhpcy5jb25maWcubW9kYWxSb3V0ZSwgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TaWJsaW5nTW9kYWxSb3V0ZUFjdGl2YXRlZChzaWJsaW5nTW9kYWxSb3V0ZUFjdGl2YXRlZCQ/OiBPYnNlcnZhYmxlPEFjdGl2YXRlZFJvdXRlPikge1xuICAgIGlmICghc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkKSByZXR1cm47XG4gICAgc2libGluZ01vZGFsUm91dGVBY3RpdmF0ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMud2lsbENsb3NlJCkpLnN1YnNjcmliZSgocm91dGUpID0+IHtcbiAgICAgIGlmICh0aGlzLnJvdXRlck91dGxldC5pc0FjdGl2YXRlZCkge1xuICAgICAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLnJvdXRlck91dGxldC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJvdXRlck91dGxldC5hY3RpdmF0ZVdpdGgocm91dGUsIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTtcbiAgICAgIHRoaXMuY2hlY2tGb3JFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoU2Nyb2xsRWxlbWVudFNpemUoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydHNDc3NTaGFkb3dQYXJ0cyA9ICdwYXJ0JyBpbiBIVE1MRWxlbWVudC5wcm90b3R5cGU7XG4gICAgaWYgKHN1cHBvcnRzQ3NzU2hhZG93UGFydHMpIHJldHVybjtcbiAgICB0aGlzLmlvbkNvbnRlbnQuZ2V0U2Nyb2xsRWxlbWVudCgpLnRoZW4oKHNjcm9sbEVsZW1lbnQpID0+IHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc2Nyb2xsRWxlbWVudCwgJ2hlaWdodCcsICcxMDAlJyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNjcm9sbEVsZW1lbnQsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcicpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICBzY3JvbGxFbGVtZW50LFxuICAgICAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgICAgICAncGFkZGluZy1ib3R0b20gJyArIERlc2lnblRva2VuSGVscGVyLnNvZnRLZXlib2FyZFRyYW5zaXRpb25MZWF2ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlTW9kYWxGdWxsSGVpZ2h0KCkge1xuICAgIGNvbnN0IGlvbk1vZGFsV3JhcHBlciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcubW9kYWwtd3JhcHBlcicpO1xuICAgIGlmICghaW9uTW9kYWxXcmFwcGVyKSByZXR1cm47XG4gICAgLy8gU3RhcnQgb2JzZXJ2aW5nIHdoZW4gbW9kYWwgaGFzIGZpbmlzaGVkIGFuaW1hdGluZzpcbiAgICB0aGlzLmRpZFByZXNlbnQudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUoaW9uTW9kYWxXcmFwcGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sYmFyQnV0dG9uc1F1ZXJ5KSB7XG4gICAgICB0aGlzLnRvb2xiYXJCdXR0b25zID0gdGhpcy50b29sYmFyQnV0dG9uc1F1ZXJ5Lm1hcCgoYnV0dG9uUmVmKSA9PiBidXR0b25SZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tGb3JFbWJlZGRlZEVsZW1lbnRzKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICB0aGlzLm1vdmVFbWJlZGRlZEVsZW1lbnRzKCk7XG4gICAgdGhpcy5vYnNlcnZlRW1iZWRkZWRFbGVtZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlSGVhZGVyUmVzaXplKCkge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLm9ic2VydmUodGhpcy5pb25IZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgW3Byb3BlcnR5LCBwaXhlbFZhbHVlXSA9IFsnLS1oZWFkZXItaGVpZ2h0JywgYCR7ZW50cnkuY29udGVudFJlY3QuaGVpZ2h0fXB4YF07XG4gICAgICB0aGlzLnNldENzc1Zhcih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgcHJvcGVydHksIHBpeGVsVmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTtcbiAgICBpZiAocGFyZW50RWxlbWVudCkge1xuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbGVtZW50VG9QYXJlbnRNYXApLmZvckVhY2goKFt0YWdOYW1lLCBnZXROZXdQYXJlbnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkRWxlbWVudCA9IHBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4odGFnTmFtZSk7XG4gICAgICAgIGlmIChlbWJlZGRlZEVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLm1vdmVDaGlsZChlbWJlZGRlZEVsZW1lbnQsIGdldE5ld1BhcmVudCgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JJb25Nb2RhbERpZFByZXNlbnQoKSB7XG4gICAgaWYgKHRoaXMuaW9uTW9kYWxFbGVtZW50KSB7XG4gICAgICB0aGlzLmlvbk1vZGFsRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpb25Nb2RhbERpZFByZXNlbnQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxEaWRQcmVzZW50Lm5leHQoKTtcbiAgICAgICAgdGhpcy5pb25Nb2RhbERpZFByZXNlbnQuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuRm9ySW9uTW9kYWxXaWxsRGlzbWlzcygpIHtcbiAgICBpZiAodGhpcy5pb25Nb2RhbEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaW9uTW9kYWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lvbk1vZGFsV2lsbERpc21pc3MnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxXaWxsRGlzbWlzcy5uZXh0KCk7XG4gICAgICAgIHRoaXMuaW9uTW9kYWxXaWxsRGlzbWlzcy5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsVG9Ub3Aoc2Nyb2xsRHVyYXRpb24/OiBLaXJieUFuaW1hdGlvbi5EdXJhdGlvbikge1xuICAgIHRoaXMuaW9uQ29udGVudC5zY3JvbGxUb1RvcChzY3JvbGxEdXJhdGlvbiB8fCAwKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKHNjcm9sbER1cmF0aW9uPzogS2lyYnlBbmltYXRpb24uRHVyYXRpb24pIHtcbiAgICB0aGlzLmlvbkNvbnRlbnQuc2Nyb2xsVG9Cb3R0b20oc2Nyb2xsRHVyYXRpb24gfHwgMCk7XG4gIH1cblxuICBhc3luYyBjbG9zZShkYXRhPzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlvbk1vZGFsRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMua2V5Ym9hcmRWaXNpYmxlIHx8ICF0aGlzLnZpZXdwb3J0UmVzaXplZCkge1xuICAgICAgLy8gTm8ga2V5Ym9hcmQgdmlzaWJsZSBvciB2aWV3cG9ydCBub3QgcmVzaXplZDpcbiAgICAgIC8vIERpc21pc3MgbW9kYWwgYW5kIHJldHVybjpcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5ZWRDbG9zZVRpbWVvdXRJZCk7XG4gICAgICBhd2FpdCB0aGlzLmlvbk1vZGFsRWxlbWVudC5kaXNtaXNzKGRhdGEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEtleWJvYXJkIHZpc2libGU6XG4gICAgLy8gQmx1ciBhY3RpdmUgZWxlbWVudCBhbmQgd2FpdCBmb3Iga2V5Ym9hcmQgdG8gaGlkZSxcbiAgICAvLyB0aGVuIGRpc21pc3MgbW9kYWwgYW5kIHJldHVybjpcbiAgICB0aGlzLmJsdXJBY3RpdmVFbGVtZW50KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmRlbGF5ZWRDbG9zZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb25Nb2RhbEVsZW1lbnQuZGlzbWlzcyhkYXRhKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGVsYXllZENsb3NlVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgdGhpcy5kZWxheWVkQ2xvc2UsXG4gICAgICAgIE1vZGFsV3JhcHBlckNvbXBvbmVudC5LRVlCT0FSRF9ISURFX0RFTEFZX0lOX01TXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3VzJylcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3Vzb3V0JylcbiAgb25Gb2N1c0NoYW5nZSgpIHtcbiAgICAvLyBUaGlzIGZpeGVzIGFuIHVuZGVzaXJlZCBzY3JvbGwgYmVoYXZpb3VyIG9jY3VycmluZyBvbiBrZXlib2FyZC10YWJiaW5nIGJhY2t3YXJkcyAod2l0aCBzaGlmdCt0YWIpOlxuICAgIHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5zY3JvbGxUbyh7IHRvcDogdGhpcy5zY3JvbGxZIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmlvbktleWJvYXJkRGlkU2hvdycsIFsnJGV2ZW50LmRldGFpbC5rZXlib2FyZEhlaWdodCddKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5Ym9hcmRXaWxsU2hvdycsIFsnJGV2ZW50LmtleWJvYXJkSGVpZ2h0J10pXG4gIF9vbktleWJvYXJkU2hvdyhrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRLZXlib2FyZFZpc2liaWxpdHkoa2V5Ym9hcmRIZWlnaHQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmlvbktleWJvYXJkRGlkSGlkZScpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlib2FyZFdpbGxIaWRlJylcbiAgX29uS2V5Ym9hcmRIaWRlKCkge1xuICAgIHRoaXMuc2V0S2V5Ym9hcmRWaXNpYmlsaXR5KDApO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVDb250ZW50TWF4SGVpZ2h0KGZyZWV6ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHNob3VsZFRvZ2dsZU1heEhlaWdodCA9XG4gICAgICB0aGlzLmNvbmZpZy5mbGF2b3IgPT09ICdtb2RhbCcgJiYgdGhpcy5wbGF0Zm9ybS5pc1BoYWJsZXRPckJpZ2dlcigpO1xuICAgIGlmICghc2hvdWxkVG9nZ2xlTWF4SGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3R5bGUgPSAnbWF4LWhlaWdodCc7XG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB0aGlzLmlvbkNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICBpZiAoZnJlZXplKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBjb250ZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGVudEVsZW1lbnQsIHN0eWxlLCBgJHtjb250ZW50SGVpZ2h0fXB4YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZVN0eWxlKGNvbnRlbnRFbGVtZW50LCBzdHlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEtleWJvYXJkVmlzaWJpbGl0eShrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgY29uc3Qga2V5Ym9hcmRBbHJlYWR5VmlzaWJsZSA9IGtleWJvYXJkSGVpZ2h0ID4gMCAmJiB0aGlzLmtleWJvYXJkVmlzaWJsZTtcbiAgICBjb25zdCBrZXlib2FyZEFscmVhZHlIaWRkZW4gPSBrZXlib2FyZEhlaWdodCA9PT0gMCAmJiAhdGhpcy5rZXlib2FyZFZpc2libGU7XG4gICAgaWYgKGtleWJvYXJkQWxyZWFkeVZpc2libGUgfHwga2V5Ym9hcmRBbHJlYWR5SGlkZGVuKSByZXR1cm47XG4gICAgdGhpcy5rZXlib2FyZFZpc2libGUgPSBrZXlib2FyZEhlaWdodCA+IDA7XG4gICAgdGhpcy50b2dnbGVDb250ZW50TWF4SGVpZ2h0KHRoaXMua2V5Ym9hcmRWaXNpYmxlKTtcbiAgICB0aGlzLnNldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGdldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodDogbnVtYmVyLCBlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgaWYgKGtleWJvYXJkSGVpZ2h0IDw9IDAgfHwgIWVsZW1lbnQpIHJldHVybiAwO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVZpZXdwb3J0Qm90dG9tVG9FbGVtZW50ID0gTWF0aC5mbG9vcihcbiAgICAgIHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5pbm5lckhlaWdodCAtIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tXG4gICAgKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoa2V5Ym9hcmRIZWlnaHQgLSBkaXN0YW5jZUZyb21WaWV3cG9ydEJvdHRvbVRvRWxlbWVudCwgMCk7XG4gIH1cblxuICBwcml2YXRlIHNldENzc1ZhcihlbGVtZW50OiBFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PlxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUsIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlQ3NzQ2xhc3MoZWxlbWVudDogRWxlbWVudCwga2xhc3M6IHN0cmluZywgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PlxuICAgICAgY29uZGl0aW9uID8gdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCBrbGFzcykgOiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnQsIGtsYXNzKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEtleWJvYXJkT3ZlcmxhcChrZXlib2FyZEhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50b2dnbGVDc3NDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2tleWJvYXJkLXZpc2libGUnLCBrZXlib2FyZEhlaWdodCA+IDApO1xuICAgIGNvbnN0IGtleWJvYXJkT3ZlcmxhcCA9IHRoaXMuZ2V0S2V5Ym9hcmRPdmVybGFwKGtleWJvYXJkSGVpZ2h0LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgbGV0IHNuYXBGb290ZXJUb0tleWJvYXJkID0gZmFsc2U7XG4gICAgY29uc3QgZW1iZWRkZWRGb290ZXJFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZEZvb3RlckVsZW1lbnQoKTtcbiAgICBpZiAoZW1iZWRkZWRGb290ZXJFbGVtZW50KSB7XG4gICAgICB0aGlzLnNldENzc1ZhcihlbWJlZGRlZEZvb3RlckVsZW1lbnQsICctLWtleWJvYXJkLW9mZnNldCcsIGAke2tleWJvYXJkT3ZlcmxhcH1weGApO1xuICAgICAgc25hcEZvb3RlclRvS2V5Ym9hcmQgPSBlbWJlZGRlZEZvb3RlckVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbmFwLXRvLWtleWJvYXJkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudEVsZW1lbnQgPSB0aGlzLmlvbkNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY29udGVudEtleWJvYXJkT2Zmc2V0ID0gc25hcEZvb3RlclRvS2V5Ym9hcmRcbiAgICAgID8ga2V5Ym9hcmRPdmVybGFwXG4gICAgICA6IHRoaXMuZ2V0S2V5Ym9hcmRPdmVybGFwKGtleWJvYXJkSGVpZ2h0LCBjb250ZW50RWxlbWVudCk7XG4gICAgdGhpcy5zZXRDc3NWYXIoY29udGVudEVsZW1lbnQsICctLWtleWJvYXJkLW9mZnNldCcsIGAke2NvbnRlbnRLZXlib2FyZE9mZnNldH1weGApO1xuICB9XG5cbiAgb25IZWFkZXJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgaWYgKHRoaXMua2V5Ym9hcmRWaXNpYmxlKSB7XG4gICAgICBjb25zdCBpc1Rvb2xiYXJCdXR0b25Ub3VjaCA9IHRoaXMudG9vbGJhckJ1dHRvbnMuc29tZSgoYnV0dG9uKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0ID09PSBidXR0b24gfHwgYnV0dG9uLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIC8vIFByZXZlbnQgYmx1ciBpZiBldmVudCB0YXJnZXQgaXMgYSB0b29sYmFyIGJ1dHRvblxuICAgICAgLy8gKHRvIGFsbG93IHRhcCBldmVudCB0byBmaXJlKTpcbiAgICAgIGlmICghaXNUb29sYmFyQnV0dG9uVG91Y2gpIHtcbiAgICAgICAgdGhpcy5ibHVyQWN0aXZlRWxlbWVudCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBfb25XaW5kb3dSZXNpemUoKSB7XG4gICAgdGhpcy5zZXRWaWV3cG9ydEhlaWdodCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaWV3cG9ydEhlaWdodCgpIHtcbiAgICBjb25zdCB2aCA9ICh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuaW5uZXJIZWlnaHQgKiAwLjAxKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMuc2V0Q3NzVmFyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnLS12aCcsIGAke3ZofXB4YCk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVWaWV3cG9ydFJlc2l6ZSgpIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5vYnNlcnZlKHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5kb2N1bWVudC5ib2R5LCAoZW50cnkpID0+XG4gICAgICB0aGlzLm9uVmlld3BvcnRSZXNpemUoZW50cnkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25WaWV3cG9ydFJlc2l6ZShlbnRyeTogUmVzaXplT2JzZXJ2ZXJFbnRyeSkge1xuICAgIGlmICghdGhpcy5pbml0aWFsVmlld3BvcnRIZWlnaHQpIHtcbiAgICAgIC8vIEluaXRpYWwgb2JzZXJ2ZSBjYWxsYmFjaywgcmVnaXN0ZXIgaW5pdGlhbCBoZWlnaHQ6XG4gICAgICB0aGlzLmluaXRpYWxWaWV3cG9ydEhlaWdodCA9IGVudHJ5LmNvbnRlbnRSZWN0LmhlaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52aWV3cG9ydFJlc2l6ZWQgPSBlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQgIT09IHRoaXMuaW5pdGlhbFZpZXdwb3J0SGVpZ2h0O1xuICAgIGlmICghdGhpcy52aWV3cG9ydFJlc2l6ZWQpIHtcbiAgICAgIC8vIFdlIGFyZSBiYWNrIHRvIGluaXRpYWwgdmlldyBwb3J0IGhlaWdodCwgY2hlY2sgZm9yIHBlbmRpbmcgY2xvc2UgZnVuYzpcbiAgICAgIGlmICh0aGlzLmRlbGF5ZWRDbG9zZVRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheWVkQ2xvc2VUaW1lb3V0SWQpO1xuICAgICAgICB0aGlzLmRlbGF5ZWRDbG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnZpZXdwb3J0UmVzaXplLm5leHQoKTtcbiAgfVxuXG4gIGJsdXJBY3RpdmVFbGVtZW50KCkge1xuICAgIGNvbnN0IEJMVVJfVEFSR0VUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSc7XG4gICAgaWYgKHRoaXMua2V5Ym9hcmRWaXNpYmxlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50Lm1hdGNoZXMoQkxVUl9UQVJHRVRfU0VMRUNUT1IpXG4gICAgICApIHtcbiAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50VG9QYXJlbnRNYXA6IHsgW2tleTogc3RyaW5nXTogKCkgPT4gSFRNTEVsZW1lbnRbXSB9ID0ge1xuICAgICdLSVJCWS1NT0RBTC1GT09URVInOiAoKSA9PiBbdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRdLFxuICAgICdLSVJCWS1QQUdFLVRJVExFJzogKCkgPT5cbiAgICAgIFt0aGlzLmlvblRpdGxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbnRlbnRUaXRsZT8ubmF0aXZlRWxlbWVudF0uZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT4gZWxlbWVudCAhPT0gdW5kZWZpbmVkXG4gICAgICApLFxuICAgICdLSVJCWS1QQUdFLVBST0dSRVNTJzogKCkgPT4gW3RoaXMuaW9uVG9vbGJhckVsZW1lbnQubmF0aXZlRWxlbWVudF0sXG4gIH07XG5cbiAgcHJpdmF0ZSBjbGVhckVtYmVkZGVkRWxlbWVudHMoKSB7XG4gICAgT2JqZWN0LmVudHJpZXModGhpcy5lbGVtZW50VG9QYXJlbnRNYXApLmZvckVhY2goKFt0YWdOYW1lLCBnZXRQYXJlbnRzXSkgPT4ge1xuICAgICAgY29uc3QgbmV3UGFyZW50cyA9IGdldFBhcmVudHMoKTtcbiAgICAgIG5ld1BhcmVudHMuZm9yRWFjaCgobmV3UGFyZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVtYmVkZGVkRWxlbWVudCA9IG5ld1BhcmVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgOnNjb3BlID4gJHt0YWdOYW1lfWApO1xuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKGVtYmVkZGVkRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIFRPRE86IFJld3JpdGUgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIGluZGVwZW5kZW50IG9mIGVsZW1lbnQgb3JkZXIuIFxuICAgICBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9raXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vaXNzdWVzLzIwOTZcbiAgKi9cbiAgcHJpdmF0ZSBnZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTogbnVsbCB8IEVsZW1lbnQge1xuICAgIGNvbnN0IGNvbnRlbnRFbGVtZW50Q2hpbGRyZW4gPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5pb25Db250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuXG4gICAgKS5yZXZlcnNlKCk7IC8vIFJldmVyc2UgbWFrZXMgaXQgZWFzaWVyIHRvIHJldHJpZXZlIHRoZSBsYXN0IGNoaWxkcmVuIGluIHRoZSBsaXN0XG5cbiAgICBjb25zdCBlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQgPSAhIXRoaXMuY29uZmlnLm1vZGFsUm91dGVcbiAgICAgID8gY29udGVudEVsZW1lbnRDaGlsZHJlblswXVxuICAgICAgOiBjb250ZW50RWxlbWVudENoaWxkcmVuWzFdO1xuXG4gICAgLyogXG4gICAgICBBcyBNb2RhbENvbmZpZy5jb21wb25lbnQgaGFzIHR5cGUgJ2FueScgYWxsIHZhbHVlcyBhcmUgdmFsaWQgZm9yIGNvbXBvbmVudDsgXG4gICAgICBleHBsaWNpdGx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyBlbWJlZGRlZCBjb21wb25lbnQgZWxlbWVudCBpcyBmb3VuZCBkdWUgdG8gXG4gICAgICB0aGlzLlxuICAgICovXG4gICAgaWYgKCFlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBlbWJlZGRlZENvbXBvbmVudEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEVtYmVkZGVkRm9vdGVyRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2tpcmJ5LW1vZGFsLWZvb3RlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQ2hpbGQoY2hpbGQ6IEVsZW1lbnQsIG5ld1BhcmVudHM6IEVsZW1lbnRbXSkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoY2hpbGQucGFyZW50RWxlbWVudCwgY2hpbGQpO1xuXG4gICAgbmV3UGFyZW50cy5mb3JFYWNoKChuZXdQYXJlbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZFRvQXBwZW5kID0gaW5kZXggPiAwID8gY2hpbGQuY2xvbmVOb2RlKHRydWUpIDogY2hpbGQ7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKG5ld1BhcmVudCwgY2hpbGRUb0FwcGVuZCk7XG4gICAgICAvLyBBcHBlbmQgYWRkcyBjaGlsZCBhcyBsYXN0IGVsZW1lbnQgb2YgcGFyZW50OyB0aGVyZWZvcmUgcmV0cmlldmUgd2l0aCBsYXN0RWxlbWVudENoaWxkXG4gICAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBuZXdQYXJlbnQubGFzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudC50YWdOYW1lID09PSAnS0lSQlktTU9EQUwtRk9PVEVSJykge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5vYnNlcnZlKGNoaWxkRWxlbWVudCwgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgY29uc3QgW3Byb3BlcnR5LCBwaXhlbFZhbHVlXSA9IFtcbiAgICAgICAgICAgICctLWZvb3Rlci1oZWlnaHQnLFxuICAgICAgICAgICAgYCR7TWF0aC5mbG9vcihlbnRyeS5jb250ZW50UmVjdC5oZWlnaHQpfXB4YCxcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBwcm9wZXJ0eSwgcGl4ZWxWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDaGlsZChjaGlsZD86IEVsZW1lbnQpIHtcbiAgICBpZiAoISFjaGlsZCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChjaGlsZC5wYXJlbnRFbGVtZW50LCBjaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlRW1iZWRkZWRFbGVtZW50cygpIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5nZXRFbWJlZGRlZENvbXBvbmVudEVsZW1lbnQoKTtcbiAgICBpZiAocGFyZW50RWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuOyAvLyBNdXRlIG9ic2VydmUgd2FybmluZyB3aGVuIHBhcmVudEVsZW1lbnQgaXMgbnVsbFxuXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUocGFyZW50RWxlbWVudCwge1xuICAgICAgY2hpbGRMaXN0OiB0cnVlLCAvLyBMaXN0ZW4gZm9yIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgY2hpbGQgbm9kZXNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRW1iZWRkZWRFbGVtZW50c011dGF0aW9uT2JzZXJ2ZXIoKTogTXV0YXRpb25PYnNlcnZlciB7XG4gICAgY29uc3Qgb2JzZXJ2ZWRFbGVtZW50cyA9IE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudFRvUGFyZW50TWFwKTtcbiAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbnM6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBtdXRhdGlvbnNcbiAgICAgICAgLmZpbHRlcigobXV0YXRpb24pID0+IG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnKSAvLyBGaWx0ZXIgZm9yIG11dGF0aW9uIHRvIHRoZSB0cmVlIG9mIG5vZGVzXG4gICAgICAgIC5tYXAoKG11dGF0aW9uKSA9PiB7XG4gICAgICAgICAgLy8gT25seSBjaGVjayBmb3IgYWRkZWROb2RlcyBhcyByZW1vdmFsIGlzIGhhbmRsZWQgYnkgdGhlIEFuZ3VsYXIgcmVuZGVyZXI6XG4gICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykuZmlsdGVyKChub2RlKSA9PlxuICAgICAgICAgICAgb2JzZXJ2ZWRFbGVtZW50cy5pbmNsdWRlcyhub2RlLm5vZGVOYW1lKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhZGRlZEVsZW1lbnRzID0gQXJyYXkucHJvdG90eXBlXG4gICAgICAgIC5jb25jYXQoLi4uYWRkZWROb2RlcylcbiAgICAgICAgLmZpbHRlcigobm9kZSk6IG5vZGUgaXMgSFRNTEVsZW1lbnQgPT4gbm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KTtcblxuICAgICAgYWRkZWRFbGVtZW50cy5mb3JFYWNoKChhZGRlZEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgbmV3UGFyZW50RWxlbWVudCA9IHRoaXMuZWxlbWVudFRvUGFyZW50TWFwW2FkZGVkRWxlbWVudC5ub2RlTmFtZV0oKTtcbiAgICAgICAgLy8gTW92ZSBlbWJlZGRlZCBlbGVtZW50IG91dCBvZiBjb250ZW50IGFuZCBhcHBlbmQgdG8gbmV3IHBhcmVudDpcbiAgICAgICAgdGhpcy5tb3ZlQ2hpbGQoYWRkZWRFbGVtZW50LCBuZXdQYXJlbnRFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTW9kYWxXcmFwcGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIge1xuICAgIGNvbnN0IGNhbGxiYWNrOiBJbnRlcnNlY3Rpb25PYnNlcnZlckNhbGxiYWNrID0gKGVudHJpZXMpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcbiAgICAgIGNvbnN0IGlzVG91Y2hpbmdWaWV3cG9ydCA9IGVudHJ5LmludGVyc2VjdGlvblJhdGlvIDwgMTtcbiAgICAgIGlmIChpc1RvdWNoaW5nVmlld3BvcnQpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbnRyeS50YXJnZXQsICdmdWxsLWhlaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhlbnRyeS50YXJnZXQsICdmdWxsLWhlaWdodCcpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTZXQgZXhwbGljaXQgdmlld3BvcnQgcm9vdCBpZiB3aXRoaW4gaWZyYW1lOlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZnJhbWVFbGVtZW50XG4gICAgICA/ICh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQgYXMgYW55KSAvLyBDYXN0IHRvIGBhbnlgIGFzIFR5cGVzY3JpcHQgbGliLmQudHMgZG9lc250IHN1cHBvcnQgRG9jdW1lbnQgdHlwZSB5ZXRcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9wdGlvbnM6IEludGVyc2VjdGlvbk9ic2VydmVySW5pdCA9IHtcbiAgICAgIHJvb3RNYXJnaW46ICcwcHggMHB4IC0xcHggMHB4JywgLy8gYGJvdHRvbTogLTFweGAgYWxsb3dzIGNoZWNraW5nIHdoZW4gdGhlIG1vZGFsIGJvdHRvbSBpcyB0b3VjaGluZyB0aGUgdmlld3BvcnRcbiAgICAgIHJvb3QsXG4gICAgICB0aHJlc2hvbGQ6IFswLjk5LCAxXSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0aW9ucyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZXJPdXRsZXQuaXNBY3RpdmF0ZWQpIHtcbiAgICAgIHRoaXMucm91dGVyT3V0bGV0LmRlYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgLy9jbGVhbiB1cCB0aGUgb2JzZXJ2ZXJcbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGRlbGV0ZSB0aGlzLl9tdXRhdGlvbk9ic2VydmVyO1xuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGRlbGV0ZSB0aGlzLl9pbnRlcnNlY3Rpb25PYnNlcnZlcjtcbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLnVub2JzZXJ2ZSh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuZG9jdW1lbnQuYm9keSk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS51bm9ic2VydmUodGhpcy5pb25IZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UudW5vYnNlcnZlKHRoaXMuZ2V0RW1iZWRkZWRGb290ZXJFbGVtZW50KCkpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyICh0b3VjaHN0YXJ0KT1cIm9uSGVhZGVyVG91Y2hTdGFydCgkZXZlbnQpXCI+XG4gIDxpb24tdG9vbGJhcj5cbiAgICA8aW9uLXRpdGxlPjwvaW9uLXRpdGxlPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIiAqbmdJZj1cImNvbmZpZy5mbGF2b3IgPT09ICdkcmF3ZXInXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VCdXR0b247IGNvbnRleHQ6IHsgaWNvbjogJ2Fycm93LWRvd24nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2lvbi1idXR0b25zPlxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCIgKm5nSWY9XCJjb25maWcuZmxhdm9yID09PSAnbW9kYWwnXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2xvc2VCdXR0b247IGNvbnRleHQ6IHsgaWNvbjogJ2Nsb3NlJyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiICpuZ0lmPVwiY29uZmlnLmZsYXZvciA9PT0gJ2RyYXdlcicgJiYgY29uZmlnLmRyYXdlclN1cHBsZW1lbnRhcnlBY3Rpb25cIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdXBwbGVtZW50YXJ5QnV0dG9uOyBjb250ZXh0OiB7IGJ0bjogY29uZmlnLmRyYXdlclN1cHBsZW1lbnRhcnlBY3Rpb24gfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgPC9pb24tdG9vbGJhcj5cbjwvaW9uLWhlYWRlcj5cblxuPGlvbi1jb250ZW50IFtzY3JvbGxFdmVudHNdPVwidHJ1ZVwiPlxuICA8aW9uLWhlYWRlciAqbmdJZj1cIl9oYXNDb2xsYXBzaWJsZVRpdGxlXCIgY29sbGFwc2U9XCJjb25kZW5zZVwiPlxuICAgIDxpb24tdG9vbGJhcj5cbiAgICAgIDxzcGFuIGNsYXNzPVwia2lyYnktdGV4dC1sYXJnZVwiICNjb250ZW50VGl0bGU+PC9zcGFuPlxuICAgIDwvaW9uLXRvb2xiYXI+XG4gIDwvaW9uLWhlYWRlcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0NvbXBvbmVudE91dGxldD1cImNvbmZpZy5jb21wb25lbnQ7IGluamVjdG9yOiBjb21wb25lbnRQcm9wc0luamVjdG9yXCJcbiAgPjwvbmctY29udGFpbmVyPlxuICA8cm91dGVyLW91dGxldFxuICAgIG5hbWU9XCJraXJieU1vZGFsV3JhcHBlck91dGxldFwiXG4gICAgW3N0eWxlLnZpc2liaWxpdHldPVwiY29uZmlnLm1vZGFsUm91dGUgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gID48L3JvdXRlci1vdXRsZXQ+XG48L2lvbi1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlQnV0dG9uIGxldC1pY29uPVwiaWNvblwiPlxuICA8YnV0dG9uIGtpcmJ5LWJ1dHRvbiBhdHRlbnRpb25MZXZlbD1cIjRcIiBzaXplPVwibWRcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgIDxraXJieS1pY29uIFtuYW1lXT1cImljb25cIj48L2tpcmJ5LWljb24+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdXBwbGVtZW50YXJ5QnV0dG9uIGxldC1idG49XCJidG5cIj5cbiAgPGJ1dHRvbiBraXJieS1idXR0b24gYXR0ZW50aW9uTGV2ZWw9XCIyXCIgc2l6ZT1cIm1kXCIgKGNsaWNrKT1cImJ0bi5hY3Rpb24oJGV2ZW50KVwiPlxuICAgIDxraXJieS1pY29uIFtuYW1lXT1cImJ0bi5pY29uTmFtZVwiPjwva2lyYnktaWNvbj5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuIl19