UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

274 lines 42.1 kB
import { __decorate, __metadata } from "tslib"; import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator'; import { SearchType } from '@microsoft/windows-admin-center-sdk/core/data/active-directory/models/search-type'; import { Net } from '@microsoft/windows-admin-center-sdk/core/data/net'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { DataTableMultipleSelectMode } from '../../data-table'; import { SmeInternalFormFieldComponent } from '../../form/form-field/form-field.component'; import { ValidationAlertSeverity } from '../../form/validation-alert/validation-alert'; import { ActiveDirectoryService } from '../active-directory.service'; import * as i0 from "@angular/core"; import * as i1 from "../active-directory.service"; import * as i2 from "../../../directives/autofocus/autofocus.directive"; import * as i3 from "@angular/common"; import * as i4 from "../../data-table/data-table.component"; import * as i5 from "../../data-table/data-table-column.component"; import * as i6 from "@angular/forms"; import * as i7 from "../../loading-wheel/loading-wheel.component"; import * as i8 from "../../master-view/master-view.component"; import * as i9 from "../../form/validation-alert/validation-alert.component"; import * as i10 from "../../form/form-field-layout/form-field-layout.component"; const _c0 = ["searchButton"]; const _c1 = ["type", "adsearch"]; function ActiveDirectorySearchFormFieldComponent_p_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "p"); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r0.notAvailableMessage); } } function ActiveDirectorySearchFormFieldComponent_div_2_sme_loading_wheel_6_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-loading-wheel", 11); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵproperty("message", ctx_r3.searchActiveDirectoryMessage); } } function ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-alert", 12); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵproperty("alert", ctx_r4.directorySearchError); } } function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template(rf, ctx) { if (rf & 1) { const _r10 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sme-master-view", 13); i0.ɵɵlistener("clearSelection", function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template_sme_master_view_clearSelection_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.value = []); }); i0.ɵɵelementStart(1, "sme-data-table", 14, 15); i0.ɵɵlistener("selectionChange", function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template_sme_data_table_selectionChange_1_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r11 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r11.value = $event); }); i0.ɵɵelement(3, "sme-data-table-column", 16, 17)(5, "sme-data-table-column", 18)(6, "sme-data-table-column", 19); i0.ɵɵelementEnd()(); } if (rf & 2) { const _r7 = i0.ɵɵreference(2); const _r8 = i0.ɵɵreference(4); const ctx_r5 = i0.ɵɵnextContext(2); i0.ɵɵproperty("showGroup", false)("showFilter", false)("showRefresh", false)("selection", ctx_r5.value)("total", _r7.renderedItems.length); i0.ɵɵadvance(1); i0.ɵɵpropertyInterpolate("selectionMode", ctx_r5.selectionMode); i0.ɵɵproperty("items", ctx_r5.accounts)("selection", ctx_r5.value)("scrollable", true)("defaultSortColumn", _r8)("defaultSortMode", 1); i0.ɵɵadvance(2); i0.ɵɵpropertyInterpolate("header", ctx_r5.resultNameColumnHeader); i0.ɵɵadvance(2); i0.ɵɵpropertyInterpolate("header", ctx_r5.resultTypeColumnHeader); i0.ɵɵadvance(1); i0.ɵɵpropertyInterpolate("header", ctx_r5.resultLoginNameColumnHeader); } } function ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "sme-alert", 12); } if (rf & 2) { const ctx_r6 = i0.ɵɵnextContext(2); i0.ɵɵproperty("alert", ctx_r6.directorySearchSizeLimitWarning); } } function ActiveDirectorySearchFormFieldComponent_div_2_Template(rf, ctx) { if (rf & 1) { const _r13 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "input", 5); i0.ɵɵlistener("ngModelChange", function ActiveDirectorySearchFormFieldComponent_div_2_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.searchString = $event); })("keydown.enter", function ActiveDirectorySearchFormFieldComponent_div_2_Template_input_keydown_enter_2_listener() { i0.ɵɵrestoreView(_r13); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.searchFromActiveDirectory()); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "button", 6, 7); i0.ɵɵlistener("click", function ActiveDirectorySearchFormFieldComponent_div_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.searchFromActiveDirectory()); }); i0.ɵɵtext(5); i0.ɵɵelementEnd(); i0.ɵɵtemplate(6, ActiveDirectorySearchFormFieldComponent_div_2_sme_loading_wheel_6_Template, 1, 1, "sme-loading-wheel", 8); i0.ɵɵelementEnd(); i0.ɵɵtemplate(7, ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_7_Template, 1, 1, "sme-alert", 9); i0.ɵɵtemplate(8, ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template, 7, 14, "sme-master-view", 10); i0.ɵɵtemplate(9, ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_9_Template, 1, 1, "sme-alert", 9); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(2); i0.ɵɵproperty("ngModel", ctx_r1.searchString)("placeholder", ctx_r1.searchPlaceHolder)("autofocus", ctx_r1.autofocus); i0.ɵɵattribute("aria-label", ctx_r1.searchPlaceHolder); i0.ɵɵadvance(1); i0.ɵɵproperty("disabled", !ctx_r1.searchString || ctx_r1.searchingAdInProgress); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r1.searchButtonLabel); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r1.searchingAdInProgress); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r1.directorySearchError); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r1.showAccountList); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r1.showSizeLimitWarning); } } /** * Form field for selecting ad objects from a search query */ export class ActiveDirectorySearchFormFieldComponent extends SmeInternalFormFieldComponent { /** * Initializes a new instance of the ActiveDirectoryFormFieldFormFieldComponent */ constructor(injector, ADService) { super(injector); this.ADService = ADService; /** * Indicates that multiple selections are allowed * Default is true */ this.multiple = true; this.directorySearchError = null; this.searchOn = SearchType.Any; this.searchButtonLabel = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Button.Search.Label; this.searchPlaceHolder = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Button.Search.PlaceHolder; this.resultNameColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.NameColumnHeader; this.resultTypeColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.TypeColumnHeader; this.resultLoginNameColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.LoginNameColumnHeader; this.notAvailableMessage = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ActiveDirectorySearchNotAvailable.message; this.searchActiveDirectoryMessage = ''; this.searchString = ''; this.searchingAdInProgress = false; this.showAccountList = false; this.showSizeLimitWarning = false; this.accounts = []; this.directorySearchSizeLimitWarning = { message: '', severity: ValidationAlertSeverity.Warning }; this.subscriptions.push(this.ADService.isGatewayDomainJoined.subscribe(domainJoined => this.isGatewayDomainJoined = domainJoined)); } /** * The source name to use for logging */ get logSourceName() { return 'ActiveDirectorySearchFormFieldComponent'; } get selectionMode() { return this.multiple ? DataTableMultipleSelectMode.Multiple : DataTableMultipleSelectMode.Single; } ngOnDestroy() { super.ngOnDestroy(); if (this.searchADSubscription && !this.searchADSubscription.closed) { this.searchADSubscription.unsubscribe(); } } /** * search computer list from active directory through gateway api */ searchFromActiveDirectory() { // initial values this.showAccountList = false; this.showSizeLimitWarning = false; this.searchingAdInProgress = true; this.directorySearchError = null; this.accounts = []; const searchStr = this.searchString; this.searchActiveDirectoryMessage = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Search.Progress.format(searchStr); if (this.searchADSubscription && !this.searchADSubscription.closed) { this.searchADSubscription.unsubscribe(); } const options = { searchString: searchStr, searchOn: this.searchOn, sizeLimit: this.ADService.defaultDirectorySearchSizeLimit }; this.searchADSubscription = this.ADService.search(options).subscribe({ next: (response) => { if (response.length > 0) { this.accounts = response; this.showSizeLimitWarning = response.length === options.sizeLimit; if (this.showSizeLimitWarning) { const format = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.SizeLimit.Warning; this.directorySearchSizeLimitWarning.message = format.format(options.sizeLimit); } } this.showAccountList = true; this.searchingAdInProgress = false; this.yieldFocusOnSearchButton(); }, error: (error) => { this.directorySearchError = { message: this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Error.message .format(searchStr, Net.getErrorMessage(error)), severity: ValidationAlertSeverity.Error }; this.showAccountList = false; this.searchingAdInProgress = false; this.yieldFocusOnSearchButton(); } }); } /** * Creates the idBag used by this component to store unique element ids. * id values will be assigned be the @see BaseComponent super class. */ createIdBag() { return { detailsSpan: '' }; } /** * Focus on search button */ yieldFocusOnSearchButton() { if (this.searchButtonRef && Dom.isFocusable(this.searchButtonRef.nativeElement)) { this.searchButtonRef.nativeElement.focus(); } } } /** @nocollapse */ ActiveDirectorySearchFormFieldComponent.ɵfac = function ActiveDirectorySearchFormFieldComponent_Factory(t) { return new (t || ActiveDirectorySearchFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.ActiveDirectoryService)); }; /** @nocollapse */ ActiveDirectorySearchFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ActiveDirectorySearchFormFieldComponent, selectors: [["sme-form-field", "type", "adsearch"]], viewQuery: function ActiveDirectorySearchFormFieldComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchButtonRef = _t.first); } }, inputs: { multiple: "multiple", notAvailableMessage: "notAvailableMessage", searchButtonLabel: "searchButtonLabel", searchPlaceHolder: "searchPlaceHolder", resultNameColumnHeader: "resultNameColumnHeader", resultTypeColumnHeader: "resultTypeColumnHeader", searchOn: "searchOn" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c1, decls: 3, vars: 3, consts: [[3, "formField"], [4, "ngIf"], ["class", "sme-arrange-stack-v sme-layout-absolute-phone-up sme-position-inset-none", 4, "ngIf"], [1, "sme-arrange-stack-v", "sme-layout-absolute-phone-up", "sme-position-inset-none"], [1, "sme-layout-relative", "sme-position-flex-none", "sme-padding-top-sm", "sme-arrange-stack-h"], ["type", "text", 1, "sme-position-flex-auto", 3, "ngModel", "placeholder", "autofocus", "ngModelChange", "keydown.enter"], ["type", "button", 1, "sme-layout-relative", "sme-position-left-xs", "sme-layout-inline-block", "sme-button-primary", 3, "disabled", "click"], ["searchButton", ""], ["size", "medium", 3, "message", 4, "ngIf"], [3, "alert", 4, "ngIf"], ["class", "sme-layout-relative-all-screens sme-position-flex-auto", "dataTableMinWidth", "sm", 3, "showGroup", "showFilter", "showRefresh", "selection", "total", "clearSelection", 4, "ngIf"], ["size", "medium", 3, "message"], [3, "alert"], ["dataTableMinWidth", "sm", 1, "sme-layout-relative-all-screens", "sme-position-flex-auto", 3, "showGroup", "showFilter", "showRefresh", "selection", "total", "clearSelection"], [3, "items", "selectionMode", "selection", "scrollable", "defaultSortColumn", "defaultSortMode", "selectionChange"], ["smeDataTable", ""], ["field", "name", "sortable", "true", 3, "header"], ["defaultSortColumn", ""], ["field", "type", "sortable", "true", 3, "header"], ["field", "loginName", "sortable", "true", 3, "header"]], template: function ActiveDirectorySearchFormFieldComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-form-field-layout", 0); i0.ɵɵtemplate(1, ActiveDirectorySearchFormFieldComponent_p_1_Template, 2, 1, "p", 1); i0.ɵɵtemplate(2, ActiveDirectorySearchFormFieldComponent_div_2_Template, 10, 10, "div", 2); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("formField", ctx); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !ctx.isGatewayDomainJoined); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.isGatewayDomainJoined); } }, dependencies: [i2.AutofocusDirective, i3.NgIf, i4.DataTableComponent, i5.DataTableColumnComponent, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgModel, i7.LoadingWheelComponent, i8.MasterViewComponent, i9.ValidationAlertComponent, i10.FormFieldLayoutComponent], encapsulation: 2 }); __decorate([ Debounce(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], ActiveDirectorySearchFormFieldComponent.prototype, "searchFromActiveDirectory", null); __decorate([ Yield(), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], ActiveDirectorySearchFormFieldComponent.prototype, "yieldFocusOnSearchButton", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActiveDirectorySearchFormFieldComponent, [{ type: Component, args: [{ selector: 'sme-form-field[type="adSearch"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <p *ngIf=\"!isGatewayDomainJoined\">{{notAvailableMessage}}</p>\r\n <div *ngIf=\"isGatewayDomainJoined\" class=\"sme-arrange-stack-v sme-layout-absolute-phone-up sme-position-inset-none\">\r\n <div class=\"sme-layout-relative sme-position-flex-none sme-padding-top-sm sme-arrange-stack-h\">\r\n <input class=\"sme-position-flex-auto\" type=\"text\" [(ngModel)]=\"searchString\" [placeholder]=\"searchPlaceHolder\"\r\n [autofocus]=\"autofocus\" [attr.aria-label]=\"searchPlaceHolder\" (keydown.enter)=\"searchFromActiveDirectory()\">\r\n <button #searchButton type=\"button\" class=\"sme-layout-relative sme-position-left-xs sme-layout-inline-block sme-button-primary\"\r\n [disabled]=\"!searchString || searchingAdInProgress\" (click)=\"searchFromActiveDirectory()\">{{searchButtonLabel}}</button>\r\n <sme-loading-wheel *ngIf=\"searchingAdInProgress\" size=\"medium\" [message]=\"searchActiveDirectoryMessage\"></sme-loading-wheel>\r\n </div>\r\n <sme-alert *ngIf=\"directorySearchError\" [alert]=\"directorySearchError\"></sme-alert>\r\n <sme-master-view *ngIf=\"showAccountList\" class=\"sme-layout-relative-all-screens sme-position-flex-auto\" [showGroup]=\"false\" [showFilter]=\"false\"\r\n [showRefresh]=\"false\" [selection]=\"value\" [total]=\"smeDataTable.renderedItems.length\" (clearSelection)=\"value=[]\"\r\n dataTableMinWidth=\"sm\">\r\n <sme-data-table #smeDataTable [items]=\"accounts\" selectionMode=\"{{selectionMode}}\" [(selection)]=\"value\" [scrollable]=\"true\"\r\n [defaultSortColumn]=\"defaultSortColumn\" [defaultSortMode]=\"1\">\r\n <sme-data-table-column #defaultSortColumn field=\"name\" header=\"{{resultNameColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n <sme-data-table-column field=\"type\" header=\"{{resultTypeColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n <sme-data-table-column field=\"loginName\" header=\"{{resultLoginNameColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n </sme-data-table>\r\n </sme-master-view>\r\n <sme-alert *ngIf=\"showSizeLimitWarning\" [alert]=\"directorySearchSizeLimitWarning\"></sme-alert>\r\n </div>\r\n</sme-form-field-layout>\r\n" }] }], function () { return [{ type: i0.Injector }, { type: i1.ActiveDirectoryService }]; }, { searchButtonRef: [{ type: ViewChild, args: ['searchButton'] }], multiple: [{ type: Input }], notAvailableMessage: [{ type: Input }], searchButtonLabel: [{ type: Input }], searchPlaceHolder: [{ type: Input }], resultNameColumnHeader: [{ type: Input }], resultTypeColumnHeader: [{ type: Input }], searchOn: [{ type: Input }], searchFromActiveDirectory: [], yieldFocusOnSearchButton: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS1zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9hY3RpdmUtZGlyZWN0b3J5L3NlYXJjaC1mb3JtLWZpZWxkL2FjdGl2ZS1kaXJlY3Rvcnktc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvYWN0aXZlLWRpcmVjdG9yeS9zZWFyY2gtZm9ybS1maWVsZC9hY3RpdmUtZGlyZWN0b3J5LXNlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBR2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQztBQUMvRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBR3ZFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzNGLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0lDWm5FLHlCQUFrQztJQUFBLFlB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RDtRQUM3RCwwRkFvQk07UUFDUixpQkFBd0I7O1FBdkJELCtCQUFrQjtRQUNuQyxlQUE0QjtRQUE1QixpREFBNEI7UUFDMUIsZUFBMkI7UUFBM0IsZ0RBQTJCOztBRCtJL0I7SUFBQyxRQUFRLEVBQUU7Ozs7d0ZBK0NWO0FBZUQ7SUFBQyxLQUFLLEVBQUU7Ozs7dUZBS1A7dUZBOUxRLHVDQUF1QztjQUpuRCxTQUFTOzJCQUNJLGlDQUFpQztnR0FZcEMsZUFBZTtrQkFEckIsU0FBUzttQkFBQyxjQUFjO1lBZWxCLFFBQVE7a0JBRGQsS0FBSztZQVNDLG1CQUFtQjtrQkFEekIsS0FBSztZQVFDLGlCQUFpQjtrQkFEdkIsS0FBSztZQVFDLGlCQUFpQjtrQkFEdkIsS0FBSztZQVFDLHNCQUFzQjtrQkFENUIsS0FBSztZQVFDLHNCQUFzQjtrQkFENUIsS0FBSztZQWNDLFFBQVE7a0JBRGQsS0FBSztZQXFEQyx5QkFBeUIsTUE4RHhCLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjdGl2ZS1kaXJlY3RvcnkvbW9kZWxzL2FjY291bnQtaW5mbyc7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlYXJjaE9wdGlvbnMgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWN0aXZlLWRpcmVjdG9yeS9tb2RlbHMvYWN0aXZlLWRpcmVjdG9yeS1zZWFyY2gtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFNlYXJjaFR5cGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWN0aXZlLWRpcmVjdG9yeS9tb2RlbHMvc2VhcmNoLXR5cGUnO1xyXG5pbXBvcnQgeyBOZXQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvbmV0JztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFqYXhFcnJvciB9IGZyb20gJ3J4anMvYWpheCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSB9IGZyb20gJy4uLy4uL2RhdGEtdGFibGUnO1xyXG5pbXBvcnQgeyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0vZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydCwgVmFsaWRhdGlvbkFsZXJ0U2V2ZXJpdHkgfSBmcm9tICcuLi8uLi9mb3JtL3ZhbGlkYXRpb24tYWxlcnQvdmFsaWRhdGlvbi1hbGVydCc7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9hY3RpdmUtZGlyZWN0b3J5LnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEZvcm0gZmllbGQgZm9yIHNlbGVjdGluZyBhZCBvYmplY3RzIGZyb20gYSBzZWFyY2ggcXVlcnlcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFt0eXBlPVwiYWRTZWFyY2hcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FjdGl2ZS1kaXJlY3Rvcnktc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlTZWFyY2hGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudDxBY2NvdW50SW5mb1tdPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgc2VhcmNoaW5nQWRJblByb2dyZXNzOiBib29sZWFuO1xyXG4gICAgcHVibGljIHNlYXJjaEFjdGl2ZURpcmVjdG9yeU1lc3NhZ2U6IHN0cmluZztcclxuICAgIHB1YmxpYyBzaG93QWNjb3VudExpc3Q6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgc2hvd1NpemVMaW1pdFdhcm5pbmc6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgYWNjb3VudHM6IEFjY291bnRJbmZvW107XHJcbiAgICBwdWJsaWMgaXNHYXRld2F5RG9tYWluSm9pbmVkOiBib29sZWFuO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaEJ1dHRvbicpXHJcbiAgICBwdWJsaWMgc2VhcmNoQnV0dG9uUmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdBY3RpdmVEaXJlY3RvcnlTZWFyY2hGb3JtRmllbGRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHRoYXQgbXVsdGlwbGUgc2VsZWN0aW9ucyBhcmUgYWxsb3dlZFxyXG4gICAgICogRGVmYXVsdCBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgbWVzc2FnZSBmb3IgdGhlIEFjdGl2ZSBEaXJlY3RvcnkgaXMgbm90IGF2YWlsYWJsZS5cclxuICAgICAqIEluIG5vdCBwcm92aWRlLCB1c2UgdGhlIGRlZmF1bHQgb25lXHJcbiAgICAgKiBAZXhhbXBsZSBcIlNlYXJjaCBpbiBBY3RpdmUgRGlyZWN0b3J5IGlzIG5vdCBhdmFpbGFibGVcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG5vdEF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlYXJjaCBidXR0b24gaW4gdGhlIGNvbnRyb2wuXHJcbiAgICAgKiBAZXhhbXBsZSBcIlNlYXJjaFwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VhcmNoQnV0dG9uTGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGxhY2UgaG9sZGVyIGluIHNlYXJjaCB0ZXh0IGJveC5cclxuICAgICAqIEBleGFtcGxlIGVudGVyIGFueSB0ZXh0IGZvciBjb21wdXRlciwgdXNlciBvciBncm91cFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlYXJjaFBsYWNlSG9sZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIE5hbWUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJOYW1lXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZXN1bHROYW1lQ29sdW1uSGVhZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIFR5cGUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJUeXBlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZXN1bHRUeXBlQ29sdW1uSGVhZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIFR5cGUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJMb2dpbiBOYW1lXCJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHNlYXJjaCBjbGFzcyZjYXRlZ29yeS5cclxuICAgICAqIEBleGFtcGxlIFNlYXJjaFR5cGUuQ29tcHV0ZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWFyY2hPbj86IFNlYXJjaFR5cGUgfCBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHNlYXJjaFN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgZGlyZWN0b3J5U2VhcmNoU2l6ZUxpbWl0V2FybmluZzogVmFsaWRhdGlvbkFsZXJ0O1xyXG4gICAgcHVibGljIGRpcmVjdG9yeVNlYXJjaEVycm9yOiBWYWxpZGF0aW9uQWxlcnQgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlIDogRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNpbmdsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIG1lbWJlciBmb3IgYWQgc2VhcmNoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2VhcmNoQURTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBY3RpdmVEaXJlY3RvcnlGb3JtRmllbGRGb3JtRmllbGRDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwdWJsaWMgQURTZXJ2aWNlOiBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoT24gPSBTZWFyY2hUeXBlLkFueTtcclxuICAgICAgICB0aGlzLnNlYXJjaEJ1dHRvbkxhYmVsID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5CdXR0b24uU2VhcmNoLkxhYmVsO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoUGxhY2VIb2xkZXIgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWN0aXZlRGlyZWN0b3J5Rm9ybUZpZWxkLkJ1dHRvbi5TZWFyY2guUGxhY2VIb2xkZXI7XHJcbiAgICAgICAgdGhpcy5yZXN1bHROYW1lQ29sdW1uSGVhZGVyID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5SZXN1bHRUYWJsZS5OYW1lQ29sdW1uSGVhZGVyO1xyXG4gICAgICAgIHRoaXMucmVzdWx0VHlwZUNvbHVtbkhlYWRlciA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuUmVzdWx0VGFibGUuVHlwZUNvbHVtbkhlYWRlcjtcclxuICAgICAgICB0aGlzLnJlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlciA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuUmVzdWx0VGFibGUuTG9naW5OYW1lQ29sdW1uSGVhZGVyO1xyXG4gICAgICAgIHRoaXMubm90QXZhaWxhYmxlTWVzc2FnZSA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuQWN0aXZlRGlyZWN0b3J5U2VhcmNoTm90QXZhaWxhYmxlLm1lc3NhZ2U7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hBY3RpdmVEaXJlY3RvcnlNZXNzYWdlID0gJyc7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTdHJpbmcgPSAnJztcclxuICAgICAgICB0aGlzLnNlYXJjaGluZ0FkSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWNjb3VudHMgPSBbXTtcclxuICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFdhcm5pbmcgPSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxyXG4gICAgICAgICAgICBzZXZlcml0eTogVmFsaWRhdGlvbkFsZXJ0U2V2ZXJpdHkuV2FybmluZ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5BRFNlcnZpY2UuaXNHYXRld2F5RG9tYWluSm9pbmVkLnN1YnNjcmliZShkb21haW5Kb2luZWQgPT4gdGhpcy5pc0dhdGV3YXlEb21haW5Kb2luZWQgPSBkb21haW5Kb2luZWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHNlYXJjaCBjb21wdXRlciBsaXN0IGZyb20gYWN0aXZlIGRpcmVjdG9yeSB0aHJvdWdoIGdhdGV3YXkgYXBpXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgc2VhcmNoRnJvbUFjdGl2ZURpcmVjdG9yeSgpIHtcclxuICAgICAgICAvLyBpbml0aWFsIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaEVycm9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFjY291bnRzID0gW107XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hBY3RpdmVEaXJlY3RvcnlNZXNzYWdlID1cclxuICAgICAgICAgICAgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5TZWFyY2guUHJvZ3Jlc3MuZm9ybWF0KHNlYXJjaFN0cik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uICYmICF0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25zOiBBY3RpdmVEaXJlY3RvcnlTZWFyY2hPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBzZWFyY2hTdHJpbmc6IHNlYXJjaFN0cixcclxuICAgICAgICAgICAgc2VhcmNoT246IHRoaXMuc2VhcmNoT24sXHJcbiAgICAgICAgICAgIHNpemVMaW1pdDogdGhpcy5BRFNlcnZpY2UuZGVmYXVsdERpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2VhcmNoQURTdWJzY3JpcHRpb24gPSB0aGlzLkFEU2VydmljZS5zZWFyY2gob3B0aW9ucykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBBY2NvdW50SW5mb1tdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudHMgPSByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dTaXplTGltaXRXYXJuaW5nID0gcmVzcG9uc2UubGVuZ3RoID09PSBvcHRpb25zLnNpemVMaW1pdDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWN0aXZlRGlyZWN0b3J5Rm9ybUZpZWxkLlNpemVMaW1pdC5XYXJuaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFdhcm5pbmcubWVzc2FnZSA9IGZvcm1hdC5mb3JtYXQob3B0aW9ucy5zaXplTGltaXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnlpZWxkRm9jdXNPblNlYXJjaEJ1dHRvbigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yOiBBamF4RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0b3J5U2VhcmNoRXJyb3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5FcnJvci5tZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoc2VhcmNoU3RyLCBOZXQuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IFZhbGlkYXRpb25BbGVydFNldmVyaXR5LkVycm9yXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QWNjb3VudExpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnlpZWxkRm9jdXNPblNlYXJjaEJ1dHRvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3BhbjogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb24gc2VhcmNoIGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSB5aWVsZEZvY3VzT25TZWFyY2hCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoQnV0dG9uUmVmICYmIERvbS5pc0ZvY3VzYWJsZSh0aGlzLnNlYXJjaEJ1dHRvblJlZi5uYXRpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCI+XHJcbiAgPHAgKm5nSWY9XCIhaXNHYXRld2F5RG9tYWluSm9pbmVkXCI+e3tub3RBdmFpbGFibGVNZXNzYWdlfX08L3A+XHJcbiAgPGRpdiAqbmdJZj1cImlzR2F0ZXdheURvbWFpbkpvaW5lZFwiIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2stdiBzbWUtbGF5b3V0LWFic29sdXRlLXBob25lLXVwIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZSBzbWUtcG9zaXRpb24tZmxleC1ub25lIHNtZS1wYWRkaW5nLXRvcC1zbSBzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgIDxpbnB1dCBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIiB0eXBlPVwidGV4dFwiICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0cmluZ1wiIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZUhvbGRlclwiXHJcbiAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInNlYXJjaFBsYWNlSG9sZGVyXCIgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoRnJvbUFjdGl2ZURpcmVjdG9yeSgpXCI+XHJcbiAgICAgIDxidXR0b24gI3NlYXJjaEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzbWUtbGF5b3V0LXJlbGF0aXZlIHNtZS1wb3NpdGlvbi1sZWZ0LXhzIHNtZS1sYXlvdXQtaW5saW5lLWJsb2NrIHNtZS1idXR0b24tcHJpbWFyeVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWFyY2hTdHJpbmcgfHwgc2VhcmNoaW5nQWRJblByb2dyZXNzXCIgKGNsaWNrKT1cInNlYXJjaEZyb21BY3RpdmVEaXJlY3RvcnkoKVwiPnt7c2VhcmNoQnV0dG9uTGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJzZWFyY2hpbmdBZEluUHJvZ3Jlc3NcIiBzaXplPVwibWVkaXVtXCIgW21lc3NhZ2VdPVwic2VhcmNoQWN0aXZlRGlyZWN0b3J5TWVzc2FnZVwiPjwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxzbWUtYWxlcnQgKm5nSWY9XCJkaXJlY3RvcnlTZWFyY2hFcnJvclwiIFthbGVydF09XCJkaXJlY3RvcnlTZWFyY2hFcnJvclwiPjwvc21lLWFsZXJ0PlxyXG4gICAgPHNtZS1tYXN0ZXItdmlldyAqbmdJZj1cInNob3dBY2NvdW50TGlzdFwiIGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZS1hbGwtc2NyZWVucyBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCIgW3Nob3dHcm91cF09XCJmYWxzZVwiIFtzaG93RmlsdGVyXT1cImZhbHNlXCJcclxuICAgICAgW3Nob3dSZWZyZXNoXT1cImZhbHNlXCIgW3NlbGVjdGlvbl09XCJ2YWx1ZVwiIFt0b3RhbF09XCJzbWVEYXRhVGFibGUucmVuZGVyZWRJdGVtcy5sZW5ndGhcIiAoY2xlYXJTZWxlY3Rpb24pPVwidmFsdWU9W11cIlxyXG4gICAgICBkYXRhVGFibGVNaW5XaWR0aD1cInNtXCI+XHJcbiAgICAgIDxzbWUtZGF0YS10YWJsZSAjc21lRGF0YVRhYmxlIFtpdGVtc109XCJhY2NvdW50c1wiIHNlbGVjdGlvbk1vZGU9XCJ7e3NlbGVjdGlvbk1vZGV9fVwiIFsoc2VsZWN0aW9uKV09XCJ2YWx1ZVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgIFtkZWZhdWx0U29ydENvbHVtbl09XCJkZWZhdWx0U29ydENvbHVtblwiIFtkZWZhdWx0U29ydE1vZGVdPVwiMVwiPlxyXG4gICAgICAgIDxzbWUtZGF0YS10YWJsZS1jb2x1bW4gI2RlZmF1bHRTb3J0Q29sdW1uIGZpZWxkPVwibmFtZVwiIGhlYWRlcj1cInt7cmVzdWx0TmFtZUNvbHVtbkhlYWRlcn19XCIgc29ydGFibGU9XCJ0cnVlXCI+PC9zbWUtZGF0YS10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgPHNtZS1kYXRhLXRhYmxlLWNvbHVtbiBmaWVsZD1cInR5cGVcIiBoZWFkZXI9XCJ7e3Jlc3VsdFR5cGVDb2x1bW5IZWFkZXJ9fVwiIHNvcnRhYmxlPVwidHJ1ZVwiPjwvc21lLWRhdGEtdGFibGUtY29sdW1uPlxyXG4gICAgICAgIDxzbWUtZGF0YS10YWJsZS1jb2x1bW4gZmllbGQ9XCJsb2dpbk5hbWVcIiBoZWFkZXI9XCJ7e3Jlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlcn19XCIgc29ydGFibGU9XCJ0cnVlXCI+PC9zbWUtZGF0YS10YWJsZS1jb2x1bW4+XHJcbiAgICAgIDwvc21lLWRhdGEtdGFibGU+XHJcbiAgICA8L3NtZS1tYXN0ZXItdmlldz5cclxuICAgIDxzbWUtYWxlcnQgKm5nSWY9XCJzaG93U2l6ZUxpbWl0V2FybmluZ1wiIFthbGVydF09XCJkaXJlY3RvcnlTZWFyY2hTaXplTGltaXRXYXJuaW5nXCI+PC9zbWUtYWxlcnQ+XHJcbiAgPC9kaXY+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=