UNPKG

kwikid-agent-dashboard

Version:

KwikID's EKYC Agent Map View Module.

274 lines 42.8 kB
import { __awaiter, __decorate } from "tslib"; import { animate, style, transition, trigger } from "@angular/animations"; import { Component, EventEmitter, HostListener, Inject, Input, Output, ViewChild } from "@angular/core"; import { TuiPreviewDialogService } from "@taiga-ui/addon-preview"; import { TuiDialogService } from "@taiga-ui/core"; import { logMethod } from "kwikid-toolkit"; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core"; import * as i2 from "../../components/primary-actions/primary-actions.component"; import * as i3 from "kwikid-forms"; import * as i4 from "../../components/map-view/map-view.component"; import * as i5 from "../../components/task-detail/task-detail.component"; import * as i6 from "../../components/bottom-sheet/bottom-sheet.component"; import * as i7 from "../../components/task-list/task-list.component"; import * as i8 from "@taiga-ui/addon-preview"; import * as i9 from "@angular/common"; export class LayoutBodyComponent { constructor(hostElement, previewDialogService, dialogs) { this.hostElement = hostElement; this.previewDialogService = previewDialogService; this.dialogs = dialogs; this.isMobileView = false; this.popupFormCallback = {}; this.popupFormConfig = {}; this.popupFormData = {}; this.previewProperties = { html: { before: "", after: "" }, iframe: { src: "", title: "" }, popupFormKey: "", title: "", unavailable: false }; this.pageFormConfig = undefined; this.pageFormData = {}; this.onClickApiCall = new EventEmitter(); this.onGetTaskList = new EventEmitter(); this.apiCallResponse = {}; this.config = {}; this.userConfig = {}; this.agentInfo = {}; this.taskList = []; this.isShowFullTaskDetails = false; this.isActiveSidebar = true; this.activeTaskDetail = null; } // The final value should be provided to service, so that it can be used in all components windowResizeWatcher() { if (this.hostElement.nativeElement.offsetWidth < 720) { this.isMobileView = true; } else { this.isMobileView = false; } } ngOnInit() { this.windowResizeWatcher(); } ngOnChanges(changes) { const verifyChange = (key) => { return changes.hasOwnProperty(key) && !changes[key].firstChange; }; for (const change of Object.entries(changes)) { const key = change[0]; const value = change[1].currentValue; } if (verifyChange("taskList")) { this.taskList = changes.taskList.currentValue; } } handleShowingFullTaskDetails() { var _a, _b; if ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.isShowMaps) { this.isShowFullTaskDetails = false; } else if (this.isMobileView) { this.isShowFullTaskDetails = false; } else { this.isShowFullTaskDetails = true; } } handleOnClickTaskItemViewDetail(e) { this.handleShowingFullTaskDetails(); this.handleOnClickCloseTaskDetail(e); this.activeTaskDetail = e; } handleOnClickCloseTaskDetail(e) { this.activeTaskDetail = null; } handleOnClickToggleSidebar(e) { this.isActiveSidebar = !this.isActiveSidebar; } handleOnClickApiCall(e) { this.onClickApiCall.emit(e); } handleOnGetTaskList(event) { this.onGetTaskList.emit(event); } handleOnClickPrimaryAction(e) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { switch (e.type) { case "POPUP_FORM": this.popupFormConfig = yield (yield fetch((_a = e === null || e === void 0 ? void 0 : e.props) === null || _a === void 0 ? void 0 : _a.formUrl)).json(); console.log("popupFormConfig", this.popupFormConfig); this.previewDialogRef = this.previewDialogService .open(this.preview || "") .subscribe({ next: (data) => { this.popupFormCallback = { popupFormData: data.data, popupFormConfig: data.formConfig }; this.popupFormConfig = {}; this.previewDialogRef.complete(); }, error: () => { this.popupFormCallback = { popupFormData: {}, popupFormConfig: this.popupFormConfig }; this.popupFormConfig = {}; console.info("Preview error"); }, complete: () => { console.info("Preview closed"); } }); break; case "PAGE_FORM": this.pageFormConfig = yield (yield fetch((_b = e === null || e === void 0 ? void 0 : e.props) === null || _b === void 0 ? void 0 : _b.formUrl)).json(); break; case "action_3": break; default: break; } }); } handleOnClickSaveForm(e, eventType) { switch (eventType) { case "POPUP_FORM": this.previewDialogRef.next(e); break; case "PAGE_FORM": this.pageFormConfig = undefined; break; default: break; } } } /** @nocollapse */ LayoutBodyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: LayoutBodyComponent, deps: [{ token: i0.ElementRef }, { token: TuiPreviewDialogService }, { token: TuiDialogService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ LayoutBodyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: LayoutBodyComponent, selector: "layout-body", inputs: { config: "config", userConfig: "userConfig", agentInfo: "agentInfo", taskList: "taskList" }, outputs: { onClickApiCall: "onClickApiCall", onGetTaskList: "onGetTaskList" }, host: { listeners: { "window:resize": "windowResizeWatcher($event)" } }, viewQueries: [{ propertyName: "preview", first: true, predicate: ["preview"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"body-container\">\n <div\n id=\"sidebar-container\"\n *ngIf=\"!isMobileView && !activeTaskDetail\"\n [class.is-hidden]=\"!isActiveSidebar\"\n >\n <div\n id=\"sidebar-toggle\"\n *ngIf=\"!isMobileView && !activeTaskDetail && !pageFormConfig\"\n [class.is-hidden]=\"!isActiveSidebar\"\n (click)=\"handleOnClickToggleSidebar($event)\"\n >\n <tui-svg\n *ngIf=\"isActiveSidebar\"\n [src]=\"'tuiIconChevronsLeftLarge'\"\n ></tui-svg>\n <tui-svg\n *ngIf=\"!isActiveSidebar\"\n [src]=\"'tuiIconChevronsRightLarge'\"\n ></tui-svg>\n </div>\n <ng-container *ngTemplateOutlet=\"TaskList\"></ng-container>\n </div>\n <div\n id=\"main-container\"\n [class.is-desktop]=\"!isMobileView\"\n >\n <div\n id=\"primary-actions-wrapper\"\n [class.is-desktop]=\"!isMobileView\"\n [class.is-nomaps]=\"config.mapConfig?.isHidden\"\n *ngIf=\"config.primaryActionsConfig\"\n >\n <primary-actions\n [primaryActionsConfig]=\"config.primaryActionsConfig\"\n (onClickPrimaryAction)=\"handleOnClickPrimaryAction($event)\"\n ></primary-actions>\n </div>\n\n <div\n class=\"kwikid-form-view-page-container\"\n *ngIf=\"pageFormConfig && pageFormConfig !== {}\"\n >\n <kwikid-form-view\n [formConfig]=\"pageFormConfig\"\n [allFormsData]=\"{}\"\n [apiCallResponse]=\"this.apiCallResponse\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (onClickSaveForm)=\"this.handleOnClickSaveForm($event, 'PAGE_FORM')\"\n ></kwikid-form-view>\n </div>\n\n <div\n id=\"map-view-wrapper\"\n [class.is-desktop]=\"!isMobileView\"\n >\n <map-view [mapConfig]=\"config.mapConfig\"></map-view>\n </div>\n\n <div\n id=\"task-detail-wrapper\"\n *ngIf=\"activeTaskDetail && isShowFullTaskDetails\"\n [@taskDetail2InOut]\n >\n <task-detail\n [config]=\"config\"\n [taskDetail]=\"activeTaskDetail\"\n (onClickCloseTaskDetail)=\"handleOnClickCloseTaskDetail($event)\"\n ></task-detail>\n </div>\n </div>\n</div>\n\n<bottom-sheet *ngIf=\"isMobileView\">\n <!-- Content to be projected into the bottom sheet -->\n <ng-container *ngTemplateOutlet=\"TaskList\"></ng-container>\n</bottom-sheet>\n\n<ng-template #TaskList>\n <div\n id=\"task-detail-wrapper\"\n *ngIf=\"activeTaskDetail && !isShowFullTaskDetails\"\n [@taskDetailInOut]\n >\n <task-detail\n [config]=\"config\"\n [taskDetail]=\"activeTaskDetail\"\n (onClickCloseTaskDetail)=\"handleOnClickCloseTaskDetail($event)\"\n ></task-detail>\n </div>\n <div id=\"task-list-wrapper\">\n <task-list\n [config]=\"config\"\n [taskItems]=\"taskList\"\n (onClickTaskItemViewDetail)=\"handleOnClickTaskItemViewDetail($event)\"\n (onGetTaskList)=\"handleOnGetTaskList($event)\"\n [@taskListInOut]\n ></task-list>\n </div>\n</ng-template>\n\n<ng-template\n #preview\n let-preview\n>\n <tui-preview\n [rotatable]=\"false\"\n [zoomable]=\"false\"\n class=\"preview-container\"\n *ngIf=\"popupFormConfig\"\n >\n <button\n tuiIconButton\n tuiPreviewAction\n icon=\"tuiIconCloseLarge\"\n title=\"Close\"\n type=\"button\"\n (click)=\"preview.complete()\"\n ></button>\n\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formConfig]=\"popupFormConfig\"\n [allFormsData]=\"{}\"\n [apiCallResponse]=\"this.apiCallResponse\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (onClickSaveForm)=\"this.handleOnClickSaveForm($event, 'POPUP_FORM')\"\n ></kwikid-form-view>\n </div>\n </tui-preview>\n</ng-template>\n\n<ng-template\n #content\n let-context\n>\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formConfig]=\"popupFormConfig\"\n [allFormsData]=\"{}\"\n [apiCallResponse]=\"this.apiCallResponse\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (onClickSaveForm)=\"this.handleOnClickSaveForm($event, 'POPUP_FORM')\"\n ></kwikid-form-view>\n </div>\n</ng-template>\n", styles: [":root,:host{display:block;width:100%;height:100%}::-webkit-scrollbar{width:8px!important}::-webkit-scrollbar-track{border-radius:10px!important}::-webkit-scrollbar-thumb{background:lightgray!important;border-radius:10px!important}::-webkit-scrollbar-thumb:hover{background:gray!important}#body-container{width:100%;height:100%;display:flex;flex-direction:row;align-items:stretch;overflow:auto;position:relative;z-index:1}#body-container #sidebar-container{width:100%;max-width:320px;height:100%;overflow-y:auto;position:relative;z-index:1;box-shadow:#32325d40 0 13px 27px -5px,#0000004d 0 8px 16px -8px;overflow-x:hidden;z-index:5}#body-container #sidebar-container.is-hidden{width:0px!important}#body-container #sidebar-container #sidebar-toggle{flex-direction:row;background:white;width:3.6rem;border-top-right-radius:1rem;border-bottom-right-radius:1rem;height:3.6rem;display:flex;justify-content:center;align-items:center;cursor:pointer;position:fixed;transform:translate(320px,1.6rem);box-shadow:#32325d40 0 13px 27px -5px,#0000004d 0 8px 16px -8px;z-index:-1}#body-container #sidebar-container #sidebar-toggle.is-hidden{transform:translateY(1.6rem)}#body-container #main-container{flex:1;height:100%;position:relative;overflow:auto;z-index:1}#body-container #main-container #primary-actions-wrapper{position:absolute;padding:0;top:1rem;left:calc(100% - 1rem);z-index:3;border-radius:.5rem;transform:translate(-100%)}#body-container #main-container #primary-actions-wrapper.is-nomaps{box-shadow:none}#body-container #main-container #map-view-wrapper{width:100%;height:100%;overflow:hidden;position:relative;z-index:2}@media only screen and (max-width: 600px){#body-container{display:flex;flex-direction:column-reverse;justify-content:space-between;align-items:stretch}#body-container #main-container{flex:1;height:100%;position:relative;overflow:auto}#body-container #main-container #primary-actions-wrapper{position:absolute;width:calc(100% - (2 * 1rem));padding:0;top:1rem;left:calc(1rem);z-index:3;border-radius:.5rem;transform:translate(0)}#body-container #main-container #primary-actions-wrapper.is-nomaps{box-shadow:none}#body-container #main-container #map-view-wrapper{width:100%;height:100%;overflow:hidden}}#task-list-wrapper{width:100%;height:100%;overflow:auto;background-color:#fff;z-index:2}#task-detail-wrapper{position:absolute;top:0px;left:0px;background-color:#fff;width:100%;height:100%;overflow:auto;z-index:3}.kwikid-form-view-popup-container{border-radius:1rem;background:var(--tui-base-01);min-width:320px;max-width:480px;padding:.5rem;height:100%;max-height:90vh;overflow:auto;width:100%}.kwikid-form-view-page-container{min-width:320px;max-width:100%;padding:.5rem;height:100%;max-height:100%;overflow:auto;width:100%}\n"], components: [{ type: i1.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i2.PrimaryActionsComponent, selector: "primary-actions", inputs: ["primaryActionsConfig"], outputs: ["onClickPrimaryAction"] }, { type: i3.KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: ["allFormsData", "extraData", "apiCallResponse", "buttonClickResponse", "formConfig", "formData", "isMobileView", "popupFormCallback", "userConfig", "stepConfig"], outputs: ["getLogs", "getUnsavedDataState", "onActionShowPopupForm", "onClickApiCall", "onClickViewFile", "onClickFormFieldButton", "onClickGoBack", "onClickSaveForm", "onClickViewForms"] }, { type: i4.MapViewComponent, selector: "map-view", inputs: ["mapConfig"] }, { type: i5.TaskDetailComponent, selector: "task-detail", inputs: ["config", "taskDetail"], outputs: ["onClickCloseTaskDetail"] }, { type: i6.BottomSheetComponent, selector: "bottom-sheet" }, { type: i7.TaskListComponent, selector: "task-list", inputs: ["config", "taskItems"], outputs: ["onClickTaskItemViewDetail", "onGetTaskList"] }, { type: i8.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { type: i1.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.TuiPreviewActionDirective, selector: "[tuiPreviewAction]" }], animations: [ trigger("taskDetailInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(150) ]), transition(":leave", [ animate(150, style({ transform: "translateY(100%)" })) ]) ]), trigger("taskDetail2InOut", [ transition(":enter", [ style({ transform: "translateX(100%)" }), animate(150) ]), transition(":leave", [ animate(150, style({ transform: "translateX(100%)" })) ]) ]), trigger("taskListInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(0) ]), transition(":leave", [ animate(0, style({ transform: "translateY(100%)" })) ]) ]) ] }); __decorate([ logMethod ], LayoutBodyComponent.prototype, "ngOnChanges", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleShowingFullTaskDetails", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickTaskItemViewDetail", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickCloseTaskDetail", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickToggleSidebar", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickApiCall", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickPrimaryAction", null); __decorate([ logMethod ], LayoutBodyComponent.prototype, "handleOnClickSaveForm", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: LayoutBodyComponent, decorators: [{ type: Component, args: [{ selector: "layout-body", templateUrl: "./layout-body.component.html", styleUrls: ["./layout-body.component.scss"], animations: [ trigger("taskDetailInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(150) ]), transition(":leave", [ animate(150, style({ transform: "translateY(100%)" })) ]) ]), trigger("taskDetail2InOut", [ transition(":enter", [ style({ transform: "translateX(100%)" }), animate(150) ]), transition(":leave", [ animate(150, style({ transform: "translateX(100%)" })) ]) ]), trigger("taskListInOut", [ transition(":enter", [ style({ transform: "translateY(100%)" }), animate(0) ]), transition(":leave", [ animate(0, style({ transform: "translateY(100%)" })) ]) ]) ] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i8.TuiPreviewDialogService, decorators: [{ type: Inject, args: [TuiPreviewDialogService] }] }, { type: i1.TuiDialogService, decorators: [{ type: Inject, args: [TuiDialogService] }] }]; }, propDecorators: { windowResizeWatcher: [{ type: HostListener, args: ["window:resize", ["$event"]] }], preview: [{ type: ViewChild, args: ["preview"] }], onClickApiCall: [{ type: Output }], onGetTaskList: [{ type: Output }], config: [{ type: Input }], userConfig: [{ type: Input }], agentInfo: [{ type: Input }], taskList: [{ type: Input }], ngOnChanges: [], handleShowingFullTaskDetails: [], handleOnClickTaskItemViewDetail: [], handleOnClickCloseTaskDetail: [], handleOnClickToggleSidebar: [], handleOnClickApiCall: [], handleOnClickPrimaryAction: [], handleOnClickSaveForm: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJvZHkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWFnZW50LWRhc2hib2FyZC9zcmMvbGliL3YyL2xheW91dC9sYXlvdXQtYm9keS9sYXlvdXQtYm9keS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtYWdlbnQtZGFzaGJvYXJkL3NyYy9saWIvdjIvbGF5b3V0L2xheW91dC1ib2R5L2xheW91dC1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUNMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRSxPQUFPLEVBQW9CLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7OztBQW9DM0MsTUFBTSxPQUFPLG1CQUFtQjtJQW1FOUIsWUFDVSxXQUF1QixFQUVkLG9CQUE2QyxFQUNuQixPQUF5QjtRQUg1RCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUVkLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBeUI7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUE1RHRFLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBTXJCLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUU1QixvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUUxQixrQkFBYSxHQUFRLEVBQUUsQ0FBQztR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LENBQUMsUUFBUSxDQUFDO2dCQVdWLE9BQU87c0JBQXJDLFNBQVM7dUJBQUMsU0FBUztnQkE2QnBCLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxhQUFhO3NCQURaLE1BQU07Z0JBTVAsTUFBTTtzQkFETCxLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sUUFBUTtzQkFEUCxLQUFLO2dCQXFCTixXQUFXLE1BZ0JYLDRCQUE0QixNQVc1QiwrQkFBK0IsTUFPL0IsNEJBQTRCLE1BSzVCLDBCQUEwQixNQUsxQixvQkFBb0IsTUFTZCwwQkFBMEIsTUF5Q2hDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSBcIkBhbmd1bGFyL2FuaW1hdGlvbnNcIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBUdWlQcmV2aWV3RGlhbG9nU2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvYWRkb24tcHJldmlld1wiO1xuaW1wb3J0IHsgVHVpRGlhbG9nQ29udGV4dCwgVHVpRGlhbG9nU2VydmljZSB9IGZyb20gXCJAdGFpZ2EtdWkvY29yZVwiO1xuaW1wb3J0IHsgbG9nTWV0aG9kIH0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJsYXlvdXQtYm9keVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2xheW91dC1ib2R5LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9sYXlvdXQtYm9keS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoXCJ0YXNrRGV0YWlsSW5PdXRcIiwgW1xuICAgICAgdHJhbnNpdGlvbihcIjplbnRlclwiLCBbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoMTAwJSlcIiB9KSxcbiAgICAgICAgYW5pbWF0ZSgxNTApXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oXCI6bGVhdmVcIiwgW1xuICAgICAgICBhbmltYXRlKDE1MCwgc3R5bGUoeyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgxMDAlKVwiIH0pKVxuICAgICAgXSlcbiAgICBdKSxcbiAgICB0cmlnZ2VyKFwidGFza0RldGFpbDJJbk91dFwiLCBbXG4gICAgICB0cmFuc2l0aW9uKFwiOmVudGVyXCIsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWCgxMDAlKVwiIH0pLFxuICAgICAgICBhbmltYXRlKDE1MClcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcIjpsZWF2ZVwiLCBbXG4gICAgICAgIGFuaW1hdGUoMTUwLCBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVYKDEwMCUpXCIgfSkpXG4gICAgICBdKVxuICAgIF0pLFxuICAgIHRyaWdnZXIoXCJ0YXNrTGlzdEluT3V0XCIsIFtcbiAgICAgIHRyYW5zaXRpb24oXCI6ZW50ZXJcIiwgW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDEwMCUpXCIgfSksXG4gICAgICAgIGFuaW1hdGUoMClcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcIjpsZWF2ZVwiLCBbXG4gICAgICAgIGFuaW1hdGUoMCwgc3R5bGUoeyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgxMDAlKVwiIH0pKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExheW91dEJvZHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyBUaGUgZmluYWwgdmFsdWUgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHNlcnZpY2UsIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gYWxsIGNvbXBvbmVudHNcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIiwgW1wiJGV2ZW50XCJdKVxuICB3aW5kb3dSZXNpemVXYXRjaGVyKCkge1xuICAgIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPCA3MjApIHtcbiAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpc01vYmlsZVZpZXcgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKFwicHJldmlld1wiKSByZWFkb25seSBwcmV2aWV3OiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PHZvaWQ+PjtcblxuICBwcml2YXRlIHByZXZpZXdEaWFsb2dSZWY6IGFueTtcblxuICBwb3B1cEZvcm1DYWxsYmFjazogYW55ID0ge307XG5cbiAgcG9wdXBGb3JtQ29uZmlnOiBhbnkgPSB7fTtcblxuICBwb3B1cEZvcm1EYXRhOiBhbnkgPSB7fTtcblxuICBwcmV2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGh0bWw6IHtcbiAgICAgIGJlZm9yZTogXCJcIixcbiAgICAgIGFmdGVyOiBcIlwiXG4gICAgfSxcbiAgICBpZnJhbWU6IHtcbiAgICAgIHNyYzogXCJcIixcbiAgICAgIHRpdGxlOiBcIlwiXG4gICAgfSxcbiAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gIH07XG5cbiAgcGFnZUZvcm1Db25maWc6IGFueSA9IHVuZGVmaW5lZDtcblxuICBwYWdlRm9ybURhdGE6IGFueSA9IHt9O1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrQXBpQ2FsbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgb25HZXRUYXNrTGlzdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBjb25maWc6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHVzZXJDb25maWc6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIGFnZW50SW5mbzogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgdGFza0xpc3Q6IEFycmF5PGFueT4gPSBbXTtcblxuICBpc1Nob3dGdWxsVGFza0RldGFpbHMgPSBmYWxzZTtcblxuICBpc0FjdGl2ZVNpZGViYXIgPSB0cnVlO1xuXG4gIGFjdGl2ZVRhc2tEZXRhaWw6IGFueSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0RWxlbWVudDogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KFR1aVByZXZpZXdEaWFsb2dTZXJ2aWNlKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJldmlld0RpYWxvZ1NlcnZpY2U6IFR1aVByZXZpZXdEaWFsb2dTZXJ2aWNlLFxuICAgIEBJbmplY3QoVHVpRGlhbG9nU2VydmljZSkgcHJpdmF0ZSByZWFkb25seSBkaWFsb2dzOiBUdWlEaWFsb2dTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvd1Jlc2l6ZVdhdGNoZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBPYmplY3QuZW50cmllcyhjaGFuZ2VzKSkge1xuICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSBjaGFuZ2VbMF07XG4gICAgICBjb25zdCB2YWx1ZTogYW55ID0gY2hhbmdlWzFdLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwidGFza0xpc3RcIikpIHtcbiAgICAgIHRoaXMudGFza0xpc3QgPSBjaGFuZ2VzLnRhc2tMaXN0LmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZVNob3dpbmdGdWxsVGFza0RldGFpbHMoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnPy5tYXBzPy5pc1Nob3dNYXBzKSB7XG4gICAgICB0aGlzLmlzU2hvd0Z1bGxUYXNrRGV0YWlscyA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc01vYmlsZVZpZXcpIHtcbiAgICAgIHRoaXMuaXNTaG93RnVsbFRhc2tEZXRhaWxzID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTaG93RnVsbFRhc2tEZXRhaWxzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tUYXNrSXRlbVZpZXdEZXRhaWwoZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVTaG93aW5nRnVsbFRhc2tEZXRhaWxzKCk7XG4gICAgdGhpcy5oYW5kbGVPbkNsaWNrQ2xvc2VUYXNrRGV0YWlsKGUpO1xuICAgIHRoaXMuYWN0aXZlVGFza0RldGFpbCA9IGU7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tDbG9zZVRhc2tEZXRhaWwoZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVUYXNrRGV0YWlsID0gbnVsbDtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1RvZ2dsZVNpZGViYXIoZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5pc0FjdGl2ZVNpZGViYXIgPSAhdGhpcy5pc0FjdGl2ZVNpZGViYXI7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tBcGlDYWxsKGU6IGFueSkge1xuICAgIHRoaXMub25DbGlja0FwaUNhbGwuZW1pdChlKTtcbiAgfVxuXG4gIGhhbmRsZU9uR2V0VGFza0xpc3QoZXZlbnQpIHtcbiAgICB0aGlzLm9uR2V0VGFza0xpc3QuZW1pdChldmVudCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tQcmltYXJ5QWN0aW9uKGU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN3aXRjaCAoZS50eXBlKSB7XG4gICAgICBjYXNlIFwiUE9QVVBfRk9STVwiOlxuICAgICAgICB0aGlzLnBvcHVwRm9ybUNvbmZpZyA9IGF3YWl0IChhd2FpdCBmZXRjaChlPy5wcm9wcz8uZm9ybVVybCkpLmpzb24oKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJwb3B1cEZvcm1Db25maWdcIiwgdGhpcy5wb3B1cEZvcm1Db25maWcpO1xuICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYgPSB0aGlzLnByZXZpZXdEaWFsb2dTZXJ2aWNlXG4gICAgICAgICAgLm9wZW4odGhpcy5wcmV2aWV3IHx8IFwiXCIpXG4gICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ2FsbGJhY2sgPSB7XG4gICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YTogZGF0YS5kYXRhLFxuICAgICAgICAgICAgICAgIHBvcHVwRm9ybUNvbmZpZzogZGF0YS5mb3JtQ29uZmlnXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0ge307XG4gICAgICAgICAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ2FsbGJhY2sgPSB7XG4gICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YToge30sXG4gICAgICAgICAgICAgICAgcG9wdXBGb3JtQ29uZmlnOiB0aGlzLnBvcHVwRm9ybUNvbmZpZ1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNvbmZpZyA9IHt9O1xuXG4gICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlByZXZpZXcgZXJyb3JcIik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiUHJldmlldyBjbG9zZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfRk9STVwiOlxuICAgICAgICB0aGlzLnBhZ2VGb3JtQ29uZmlnID0gYXdhaXQgKGF3YWl0IGZldGNoKGU/LnByb3BzPy5mb3JtVXJsKSkuanNvbigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJhY3Rpb25fM1wiOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1NhdmVGb3JtKGU6IGFueSwgZXZlbnRUeXBlOiBhbnkpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBcIlBPUFVQX0ZPUk1cIjpcbiAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmLm5leHQoZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlBBR0VfRk9STVwiOlxuICAgICAgICB0aGlzLnBhZ2VGb3JtQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cImJvZHktY29udGFpbmVyXCI+XG4gIDxkaXZcbiAgICBpZD1cInNpZGViYXItY29udGFpbmVyXCJcbiAgICAqbmdJZj1cIiFpc01vYmlsZVZpZXcgJiYgIWFjdGl2ZVRhc2tEZXRhaWxcIlxuICAgIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWlzQWN0aXZlU2lkZWJhclwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBpZD1cInNpZGViYXItdG9nZ2xlXCJcbiAgICAgICpuZ0lmPVwiIWlzTW9iaWxlVmlldyAmJiAhYWN0aXZlVGFza0RldGFpbCAmJiAhcGFnZUZvcm1Db25maWdcIlxuICAgICAgW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNBY3RpdmVTaWRlYmFyXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVPbkNsaWNrVG9nZ2xlU2lkZWJhcigkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8dHVpLXN2Z1xuICAgICAgICAqbmdJZj1cImlzQWN0aXZlU2lkZWJhclwiXG4gICAgICAgIFtzcmNdPVwiJ3R1aUljb25DaGV2cm9uc0xlZnRMYXJnZSdcIlxuICAgICAgPjwvdHVpLXN2Zz5cbiAgICAgIDx0dWktc3ZnXG4gICAgICAgICpuZ0lmPVwiIWlzQWN0aXZlU2lkZWJhclwiXG4gICAgICAgIFtzcmNdPVwiJ3R1aUljb25DaGV2cm9uc1JpZ2h0TGFyZ2UnXCJcbiAgICAgID48L3R1aS1zdmc+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhc2tMaXN0XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgaWQ9XCJtYWluLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLmlzLWRlc2t0b3BdPVwiIWlzTW9iaWxlVmlld1wiXG4gID5cbiAgICA8ZGl2XG4gICAgICBpZD1cInByaW1hcnktYWN0aW9ucy13cmFwcGVyXCJcbiAgICAgIFtjbGFzcy5pcy1kZXNrdG9wXT1cIiFpc01vYmlsZVZpZXdcIlxuICAgICAgW2NsYXNzLmlzLW5vbWFwc109XCJjb25maWcubWFwQ29uZmlnPy5pc0hpZGRlblwiXG4gICAgICAqbmdJZj1cImNvbmZpZy5wcmltYXJ5QWN0aW9uc0NvbmZpZ1wiXG4gICAgPlxuICAgICAgPHByaW1hcnktYWN0aW9uc1xuICAgICAgICBbcHJpbWFyeUFjdGlvbnNDb25maWddPVwiY29uZmlnLnByaW1hcnlBY3Rpb25zQ29uZmlnXCJcbiAgICAgICAgKG9uQ2xpY2tQcmltYXJ5QWN0aW9uKT1cImhhbmRsZU9uQ2xpY2tQcmltYXJ5QWN0aW9uKCRldmVudClcIlxuICAgICAgPjwvcHJpbWFyeS1hY3Rpb25zPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJrd2lraWQtZm9ybS12aWV3LXBhZ2UtY29udGFpbmVyXCJcbiAgICAgICpuZ0lmPVwicGFnZUZvcm1Db25maWcgJiYgcGFnZUZvcm1Db25maWcgIT09IHt9XCJcbiAgICA+XG4gICAgICA8a3dpa2lkLWZvcm0tdmlld1xuICAgICAgICBbZm9ybUNvbmZpZ109XCJwYWdlRm9ybUNvbmZpZ1wiXG4gICAgICAgIFthbGxGb3Jtc0RhdGFdPVwie31cIlxuICAgICAgICBbYXBpQ2FsbFJlc3BvbnNlXT1cInRoaXMuYXBpQ2FsbFJlc3BvbnNlXCJcbiAgICAgICAgKG9uQ2xpY2tBcGlDYWxsKT1cImhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxuICAgICAgICAob25DbGlja1NhdmVGb3JtKT1cInRoaXMuaGFuZGxlT25DbGlja1NhdmVGb3JtKCRldmVudCwgJ1BBR0VfRk9STScpXCJcbiAgICAgID48L2t3aWtpZC1mb3JtLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICBpZD1cIm1hcC12aWV3LXdyYXBwZXJcIlxuICAgICAgW2NsYXNzLmlzLWRlc2t0b3BdPVwiIWlzTW9iaWxlVmlld1wiXG4gICAgPlxuICAgICAgPG1hcC12aWV3IFttYXBDb25maWddPVwiY29uZmlnLm1hcENvbmZpZ1wiPjwvbWFwLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICBpZD1cInRhc2stZGV0YWlsLXdyYXBwZXJcIlxuICAgICAgKm5nSWY9XCJhY3RpdmVUYXNrRGV0YWlsICYmIGlzU2hvd0Z1bGxUYXNrRGV0YWlsc1wiXG4gICAgICBbQHRhc2tEZXRhaWwySW5PdXRdXG4gICAgPlxuICAgICAgPHRhc2stZGV0YWlsXG4gICAgICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICAgICAgW3Rhc2tEZXRhaWxdPVwiYWN0aXZlVGFza0RldGFpbFwiXG4gICAgICAgIChvbkNsaWNrQ2xvc2VUYXNrRGV0YWlsKT1cImhhbmRsZU9uQ2xpY2tDbG9zZVRhc2tEZXRhaWwoJGV2ZW50KVwiXG4gICAgICA+PC90YXNrLWRldGFpbD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGJvdHRvbS1zaGVldCAqbmdJZj1cImlzTW9iaWxlVmlld1wiPlxuICA8IS0tIENvbnRlbnQgdG8gYmUgcHJvamVjdGVkIGludG8gdGhlIGJvdHRvbSBzaGVldCAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIlRhc2tMaXN0XCI+PC9uZy1jb250YWluZXI+XG48L2JvdHRvbS1zaGVldD5cblxuPG5nLXRlbXBsYXRlICNUYXNrTGlzdD5cbiAgPGRpdlxuICAgIGlkPVwidGFzay1kZXRhaWwtd3JhcHBlclwiXG4gICAgKm5nSWY9XCJhY3RpdmVUYXNrRGV0YWlsICYmICFpc1Nob3dGdWxsVGFza0RldGFpbHNcIlxuICAgIFtAdGFza0RldGFpbEluT3V0XVxuICA+XG4gICAgPHRhc2stZGV0YWlsXG4gICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICBbdGFza0RldGFpbF09XCJhY3RpdmVUYXNrRGV0YWlsXCJcbiAgICAgIChvbkNsaWNrQ2xvc2VUYXNrRGV0YWlsKT1cImhhbmRsZU9uQ2xpY2tDbG9zZVRhc2tEZXRhaWwoJGV2ZW50KVwiXG4gICAgPjwvdGFzay1kZXRhaWw+XG4gIDwvZGl2PlxuICA8ZGl2IGlkPVwidGFzay1saXN0LXdyYXBwZXJcIj5cbiAgICA8dGFzay1saXN0XG4gICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICBbdGFza0l0ZW1zXT1cInRhc2tMaXN0XCJcbiAgICAgIChvbkNsaWNrVGFza0l0ZW1WaWV3RGV0YWlsKT1cImhhbmRsZU9uQ2xpY2tUYXNrSXRlbVZpZXdEZXRhaWwoJGV2ZW50KVwiXG4gICAgICAob25HZXRUYXNrTGlzdCk9XCJoYW5kbGVPbkdldFRhc2tMaXN0KCRldmVudClcIlxuICAgICAgW0B0YXNrTGlzdEluT3V0XVxuICAgID48L3Rhc2stbGlzdD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI3ByZXZpZXdcbiAgbGV0LXByZXZpZXdcbj5cbiAgPHR1aS1wcmV2aWV3XG4gICAgW3JvdGF0YWJsZV09XCJmYWxzZVwiXG4gICAgW3pvb21hYmxlXT1cImZhbHNlXCJcbiAgICBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCJcbiAgICAqbmdJZj1cInBvcHVwRm9ybUNvbmZpZ1wiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICB0dWlJY29uQnV0dG9uXG4gICAgICB0dWlQcmV2aWV3QWN0aW9uXG4gICAgICBpY29uPVwidHVpSWNvbkNsb3NlTGFyZ2VcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJwcmV2aWV3LmNvbXBsZXRlKClcIlxuICAgID48L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9XCJrd2lraWQtZm9ybS12aWV3LXBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgPGt3aWtpZC1mb3JtLXZpZXdcbiAgICAgICAgW2Zvcm1Db25maWddPVwicG9wdXBGb3JtQ29uZmlnXCJcbiAgICAgICAgW2FsbEZvcm1zRGF0YV09XCJ7fVwiXG4gICAgICAgIFthcGlDYWxsUmVzcG9uc2VdPVwidGhpcy5hcGlDYWxsUmVzcG9uc2VcIlxuICAgICAgICAob25DbGlja0FwaUNhbGwpPVwiaGFuZGxlT25DbGlja0FwaUNhbGwoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrU2F2ZUZvcm0pPVwidGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50LCAnUE9QVVBfRk9STScpXCJcbiAgICAgID48L2t3aWtpZC1mb3JtLXZpZXc+XG4gICAgPC9kaXY+XG4gIDwvdHVpLXByZXZpZXc+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2NvbnRlbnRcbiAgbGV0LWNvbnRleHRcbj5cbiAgPGRpdiBjbGFzcz1cImt3aWtpZC1mb3JtLXZpZXctcG9wdXAtY29udGFpbmVyXCI+XG4gICAgPGt3aWtpZC1mb3JtLXZpZXdcbiAgICAgIFtmb3JtQ29uZmlnXT1cInBvcHVwRm9ybUNvbmZpZ1wiXG4gICAgICBbYWxsRm9ybXNEYXRhXT1cInt9XCJcbiAgICAgIFthcGlDYWxsUmVzcG9uc2VdPVwidGhpcy5hcGlDYWxsUmVzcG9uc2VcIlxuICAgICAgKG9uQ2xpY2tBcGlDYWxsKT1cImhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxuICAgICAgKG9uQ2xpY2tTYXZlRm9ybSk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tTYXZlRm9ybSgkZXZlbnQsICdQT1BVUF9GT1JNJylcIlxuICAgID48L2t3aWtpZC1mb3JtLXZpZXc+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==