UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

756 lines (755 loc) 57.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter, ViewChild } from '@angular/core'; import { AbstractMultiDropdown } from './AbstractMultiDropdown'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; import { I18N } from '../../../decorator/I18N.decorator'; import { Option } from '../../../decorator/Option.decorator'; import { PhloxAppInfoService } from '../../../service/PhloxAppInfoService.service'; import { MaterialTextBox } from '../../../theme/material/component/dataview/input/MaterialTextBox.component'; const /** @type {?} */ TYPE_NAME = "phx-search-multi-dropdown"; export class SearchMultiDropdownList extends AbstractMultiDropdown { /** * @param {?} needFocusService * @param {?} elementRef * @param {?} phloxAppInfoService */ constructor(needFocusService, elementRef, phloxAppInfoService) { super(needFocusService, elementRef, phloxAppInfoService); this.elementRef = elementRef; this._searchTextClick = false; this._searchBtnClick = false; this._searchBtnLabel = "Search"; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); } /** * @param {?} $event * @return {?} */ _doSearch($event) { let /** @type {?} */ searchItems; if (searchItems === null || searchItems === undefined) { searchItems = []; } if (this.mTextBox !== null && this.mTextBox !== undefined) { let /** @type {?} */ searchText = this.mTextBox.getInputValue() === null || this.mTextBox.getInputValue() === undefined ? "" : this.mTextBox.getInputValue().toString(); searchItems = this.search(searchText); } let /** @type {?} */ indexItem = -1; if (searchItems !== null && searchItems !== undefined && searchItems.length > 0) { if (searchItems.length >= 1) { indexItem = this.getItemIndexFromValue(searchItems[0].getValue()); } } if (indexItem !== -1) { let /** @type {?} */ row = $(this.elementRef.nativeElement).find('.phx-search-multi-dropdown > .dropdown-container >.menu.show > ul.menu-item > li:eq(' + (indexItem) + ')'); let /** @type {?} */ offset = $(this.elementRef.nativeElement).find('.phx-search-multi-dropdown > .dropdown-container >.menu.show > ul.menu-item > li').first().position().top; let /** @type {?} */ table = $(this.elementRef.nativeElement).find('.phx-search-multi-dropdown > .dropdown-container >.menu.show > ul.menu-item'); $(table).scrollTop(($(row).position().top - offset)); } } /** * @param {?} $event * @return {?} */ _onKeyUp($event) { if ($event !== null && $event !== undefined) { if ($event.keyCode == 13) { this._doSearch($event); } } } /** * @param {?} $event * @return {?} */ _onSearchBtnClick($event) { this._searchTextClick = false; this._searchBtnClick = true; $event.preventDefault(); let /** @type {?} */ val = $(this.elementRef.nativeElement).find("material-text-box").find("input").val(); this.mTextBox.setInputValue(val); this._doSearch($event); this._searchBtnClick = false; } /** * @param {?} value * @return {?} */ search(value) { if (this.searchHandler !== null && this.searchHandler !== undefined) { return this.searchHandler.search(value, this.items); } return []; } /** * @return {?} */ getSearchHandler() { return this.searchHandler; } /** * @param {?} searchHandler * @return {?} */ setSearchData(searchHandler) { this.searchHandler = searchHandler; } /** * @param {?} inputValue * @param {?} results * @return {?} */ onValidationEnd(inputValue, results) { //! do sthing } /** * @param {?} data * @param {?} inputVal * @return {?} */ onDataChange(data, inputVal) { } /** * @param {?} oldValue * @param {?} inputVal * @param {?=} data * @return {?} */ onDataChangePrevented(oldValue, inputVal, data) { this._setData(oldValue, true, null, false); } /** * @param {?} $event * @return {?} */ onCheckBeforeChange($event) { $event.preventDefault(); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(() => { if (!this._isItemClick && !this._searchTextClick && !this._searchBtnClick) { this.doBlur($event); this.needFocusService.resetFocusingComponent($event); } else { this.doFocus($event); } this._isItemClick = false; }, 20); } /** * @param {?} $event * @return {?} */ doFocus($event) { if (this._searchTextClick) { $(this.elementRef.nativeElement).find("material-text-box").focus(); } else if (this._searchBtnClick) { $(this.elementRef.nativeElement).find("phx-simple-ripple-btn").focus(); } else { $(this.elementRef.nativeElement).find(".dropdown > .label > button").focus(); } this._searchTextClick = false; this._searchBtnClick = false; } /** * @param {?} $event * @return {?} */ doLostFocus($event) { setTimeout(() => { if (this._searchTextClick || this._searchBtnClick || this._isItemClick) { this.doFocus($event); this._searchTextClick = false; this._searchBtnClick = false; this._isItemClick = false; return; } super.doLostFocus($event); }, 20); } /** * @param {?} $event * @return {?} */ doBlur($event) { $(this.elementRef.nativeElement).find(".dropdown > .label > button").blur(); } /** * @param {?} $event * @return {?} */ _onBeforeSearchTextFocus($event) { this._isItemClick = true; this._searchTextClick = true; this._searchBtnClick = false; $event.preventDefault(); } /** * @param {?} $event * @return {?} */ _onBeforeSearchTextLostFocus($event) { if (this._isItemClick) { this._searchTextClick = false; this._searchBtnClick = false; } } /** * @return {?} */ getOptions() { return this.options; } /** * @return {?} */ getItems() { return this.items; } /** * @return {?} */ getWidth() { return this.width; } /** * @param {?} width * @return {?} */ setWidth(width) { this.width = width; } /** * @return {?} */ getHeight() { return this.height; } /** * @param {?} height * @return {?} */ setHeight(height) { this.height = height; } /** * @return {?} */ isSearchTextClick() { return this._searchTextClick; } /** * @param {?} searchTextClick * @return {?} */ setSearchTextClick(searchTextClick) { this._searchTextClick = searchTextClick; } /** * @return {?} */ isSearchBtnClick() { return this._searchBtnClick; } /** * @param {?} searchBtnClick * @return {?} */ setSearchBtnClick(searchBtnClick) { this._searchBtnClick = searchBtnClick; } /** * @return {?} */ getSearchBtnLabel() { return this._searchBtnLabel; } /** * @param {?} searchBtnLabel * @return {?} */ setSearchBtnLabel(searchBtnLabel) { this._searchBtnLabel = searchBtnLabel; } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickEvent(event) { this.beforeClickEvent = event; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickEvent(event) { this.clickEvent = event; } /** * @return {?} */ getBeforeShowEvent() { return this.beforeShowEvent; } /** * @param {?} event * @return {?} */ setBeforeShowEvent(event) { this.beforeShowEvent = event; } /** * @return {?} */ getShowEvent() { return this.showEvent; } /** * @param {?} event * @return {?} */ setShowEvent(event) { this.showEvent = event; } /** * @return {?} */ getBeforeHideEvent() { return this.beforeHideEvent; } /** * @param {?} event * @return {?} */ setBeforeHideEvent(event) { this.beforeHideEvent = event; } /** * @return {?} */ getHideEvent() { return this.hideEvent; } /** * @param {?} event * @return {?} */ setHideEvent(event) { this.hideEvent = event; } /** * @param {?} $event * @return {?} */ onMouseDownMenu($event) { $event.preventDefault(); } } SearchMultiDropdownList.TYPE_NAME = TYPE_NAME; SearchMultiDropdownList.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-search-multi-dropdown" [style.width]="getWidth()" [style.height]="getHeight()"> <div class="dropdown-container"> <div class="dropdown"> <div class="label"> <button type="button" (click)="click($event)" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)"> <div> <div class="table-wrapper fluid" *ngIf="getSelectedItems() !== null"> <div class="table-cell-wrapper middle" [style.text-align]="getAlign()"> {{getSelectedItems().length}} </div> </div> </div> <div> <div class="table-wrapper fluid"> <div class="table-cell-wrapper middle"> <div class="down-triangle"></div> </div> </div> </div> </button> </div> </div> <div class="menu" (mousedown)="onMouseDownMenu($event)" [class.show]="isShow()" [style.width]="getDropdownWidth()" [style.max-height]="getDropdownHeight()"> <!-- <div style="position: relative;"> --> <div class="group-search"> <div class="col-md-8"> <material-text-box #mTextBox (phxBeforeFocus)="_onBeforeSearchTextFocus($event)" (phxBeforeLostFocus)="_onBeforeSearchTextLostFocus($event)" (keyup)="_onKeyUp($event)" [options]="getOptions()" [dataParent]="this" [ignoreParentData]="true"></material-text-box> </div> <div class="col-md-4"> <phx-simple-ripple-btn (mousedown)="_onSearchBtnClick($event)" [label]="_searchBtnLabel"></phx-simple-ripple-btn> </div> </div> <ul class="menu-item coa-scroll"> <li *ngFor="let item of getItems(); let i = index;" (mousedown)="onSelectItemClicked($event, i)"> <div> <phx-checkbox [data]="isIndexSelected(i)" (phxBeforeChange)="onCheckBeforeChange($event)"></phx-checkbox> <div class="label-item">{{item.label}}</div> </div> </li> </ul> <!-- </div> --> </div> </div> </div> ` },] }, ]; /** @nocollapse */ SearchMultiDropdownList.ctorParameters = () => [ { type: NeedFocusService, }, { type: ElementRef, }, { type: PhloxAppInfoService, }, ]; SearchMultiDropdownList.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "field": [{ type: Input },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "dataComparator": [{ type: Input, args: ['comparator',] },], "items": [{ type: Input },], "align": [{ type: Input },], "dropdownWidth": [{ type: Input },], "dropdownHeight": [{ type: Input },], "searchHandler": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "mTextBox": [{ type: ViewChild, args: ['mTextBox',] },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },], "selectEvent": [{ type: Output, args: ['phxSelect',] },], "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], "beforeShowEvent": [{ type: Output, args: ['phxBeforeShow',] },], "showEvent": [{ type: Output, args: ['phxShow',] },], "beforeHideEvent": [{ type: Output, args: ['phxBeforeHide',] },], "hideEvent": [{ type: Output, args: ['phxHide',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], SearchMultiDropdownList.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], SearchMultiDropdownList.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SearchMultiDropdownList.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "help", void 0); tslib_1.__decorate([ Option('comparator'), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "dataComparator", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Array) ], SearchMultiDropdownList.prototype, "items", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "align", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "dropdownWidth", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SearchMultiDropdownList.prototype, "dropdownHeight", void 0); tslib_1.__decorate([ Option('searchHandler'), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "searchHandler", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SearchMultiDropdownList.prototype, "height", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeSelect'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeSelectEvent", void 0); tslib_1.__decorate([ Option('select'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "selectEvent", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeShow'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeShowEvent", void 0); tslib_1.__decorate([ Option('show'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "showEvent", void 0); tslib_1.__decorate([ Option('beforeHide'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "beforeHideEvent", void 0); tslib_1.__decorate([ Option('hide'), tslib_1.__metadata("design:type", EventEmitter) ], SearchMultiDropdownList.prototype, "hideEvent", void 0); function SearchMultiDropdownList_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ SearchMultiDropdownList.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ SearchMultiDropdownList.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ SearchMultiDropdownList.propDecorators; /** @type {?} */ SearchMultiDropdownList.TYPE_NAME; /** @type {?} */ SearchMultiDropdownList.prototype.dataParent; /** @type {?} */ SearchMultiDropdownList.prototype.ignoreParentData; /** @type {?} */ SearchMultiDropdownList.prototype.data; /** @type {?} */ SearchMultiDropdownList.prototype.ignoreParentDisabled; /** @type {?} */ SearchMultiDropdownList.prototype.delegateHistory; /** @type {?} */ SearchMultiDropdownList.prototype.onDisabled; /** @type {?} */ SearchMultiDropdownList.prototype.onEnabled; /** @type {?} */ SearchMultiDropdownList.prototype.loadingEnabled; /** @type {?} */ SearchMultiDropdownList.prototype.i18nKey; /** @type {?} */ SearchMultiDropdownList.prototype.bypass; /** @type {?} */ SearchMultiDropdownList.prototype.options; /** @type {?} */ SearchMultiDropdownList.prototype.disabled; /** @type {?} */ SearchMultiDropdownList.prototype.field; /** @type {?} */ SearchMultiDropdownList.prototype.name; /** @type {?} */ SearchMultiDropdownList.prototype.typeOfData; /** @type {?} */ SearchMultiDropdownList.prototype.readOnly; /** @type {?} */ SearchMultiDropdownList.prototype.help; /** @type {?} */ SearchMultiDropdownList.prototype.dataComparator; /** @type {?} */ SearchMultiDropdownList.prototype.items; /** @type {?} */ SearchMultiDropdownList.prototype.align; /** @type {?} */ SearchMultiDropdownList.prototype.dropdownWidth; /** @type {?} */ SearchMultiDropdownList.prototype.dropdownHeight; /** @type {?} */ SearchMultiDropdownList.prototype.searchHandler; /** @type {?} */ SearchMultiDropdownList.prototype.width; /** @type {?} */ SearchMultiDropdownList.prototype.height; /** @type {?} */ SearchMultiDropdownList.prototype._searchTextClick; /** @type {?} */ SearchMultiDropdownList.prototype._searchBtnClick; /** @type {?} */ SearchMultiDropdownList.prototype._searchBtnLabel; /** @type {?} */ SearchMultiDropdownList.prototype.mTextBox; /** @type {?} */ SearchMultiDropdownList.prototype.loadEvent; /** @type {?} */ SearchMultiDropdownList.prototype.startValidateEvent; /** @type {?} */ SearchMultiDropdownList.prototype.endValidateEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeFocusEvent; /** @type {?} */ SearchMultiDropdownList.prototype.focusEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeLostFocusEvent; /** @type {?} */ SearchMultiDropdownList.prototype.lostFocusEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeChangeEvent; /** @type {?} */ SearchMultiDropdownList.prototype.changeEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeSelectEvent; /** @type {?} */ SearchMultiDropdownList.prototype.selectEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeClickEvent; /** @type {?} */ SearchMultiDropdownList.prototype.clickEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeShowEvent; /** @type {?} */ SearchMultiDropdownList.prototype.showEvent; /** @type {?} */ SearchMultiDropdownList.prototype.beforeHideEvent; /** @type {?} */ SearchMultiDropdownList.prototype.hideEvent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoTXVsdGlEcm9wZG93bkxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L1NlYXJjaE11bHRpRHJvcGRvd25MaXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUtoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBR25GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQztBQUk3Ryx1QkFBTSxTQUFTLEdBQVcsMkJBQTJCLENBQUM7QUFvRHRELE1BQU0sOEJBQStCLFNBQVEscUJBQXFCOzs7Ozs7SUF5SmhFLFlBQVksZ0JBQWtDLEVBQUUsVUFBc0IsRUFBRSxtQkFBd0M7UUFDOUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7S0FDakM7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFD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IElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0TXVsdGlEcm9wZG93biB9IGZyb20gJy4vQWJzdHJhY3RNdWx0aURyb3Bkb3duJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcclxuaW1wb3J0IHsgRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xyXG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi9JRGF0YUNvbXBhcmF0b3InO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9QaGxveEFwcEluZm9TZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJU2VhcmNoSGFuZGxlciB9IGZyb20gJy4uLy4uL0lTZWFyY2hIYW5kbGVyJztcclxuaW1wb3J0IHsgSVNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0lTZWxlY3RJdGVtTW9kZWwnO1xyXG5pbXBvcnQgeyBNYXRlcmlhbFRleHRCb3ggfSBmcm9tICcuLi8uLi8uLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUZXh0Qm94LmNvbXBvbmVudCc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXNlYXJjaC1tdWx0aS1kcm9wZG93blwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1zZWFyY2gtbXVsdGktZHJvcGRvd25cIiBbc3R5bGUud2lkdGhdPVwiZ2V0V2lkdGgoKVwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVpZ2h0KClcIj5cclxuXHQ8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cImxhYmVsXCI+XHJcblx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNsaWNrKCRldmVudClcIiAoZm9jdXNpbik9XCJvbkZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHQ8ZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiICpuZ0lmPVwiZ2V0U2VsZWN0ZWRJdGVtcygpICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIiBbc3R5bGUudGV4dC1hbGlnbl09XCJnZXRBbGlnbigpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHR7e2dldFNlbGVjdGVkSXRlbXMoKS5sZW5ndGh9fVxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXIgZmx1aWRcIj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImRvd24tdHJpYW5nbGVcIj48L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtZW51XCIgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bk1lbnUoJGV2ZW50KVwiIFtjbGFzcy5zaG93XT1cImlzU2hvdygpXCIgW3N0eWxlLndpZHRoXT1cImdldERyb3Bkb3duV2lkdGgoKVwiIFtzdHlsZS5tYXgtaGVpZ2h0XT1cImdldERyb3Bkb3duSGVpZ2h0KClcIj5cclxuICAgICAgPCEtLSA8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiPiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtc2VhcmNoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cclxuICAgICAgICAgICAgPG1hdGVyaWFsLXRleHQtYm94ICNtVGV4dEJveCAocGh4QmVmb3JlRm9jdXMpPVwiX29uQmVmb3JlU2VhcmNoVGV4dEZvY3VzKCRldmVudClcIiAocGh4QmVmb3JlTG9zdEZvY3VzKT1cIl9vbkJlZm9yZVNlYXJjaFRleHRMb3N0Rm9jdXMoJGV2ZW50KVwiXHJcblx0XHRcdFx0XHRcdCAoa2V5dXApPVwiX29uS2V5VXAoJGV2ZW50KVwiIFtvcHRpb25zXT1cImdldE9wdGlvbnMoKVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIiBbaWdub3JlUGFyZW50RGF0YV09XCJ0cnVlXCI+PC9tYXRlcmlhbC10ZXh0LWJveD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgIDxwaHgtc2ltcGxlLXJpcHBsZS1idG4gKG1vdXNlZG93bik9XCJfb25TZWFyY2hCdG5DbGljaygkZXZlbnQpXCIgW2xhYmVsXT1cIl9zZWFyY2hCdG5MYWJlbFwiPjwvcGh4LXNpbXBsZS1yaXBwbGUtYnRuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblx0XHRcdFx0PHVsIGNsYXNzPVwibWVudS1pdGVtIGNvYS1zY3JvbGxcIj5cclxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRJdGVtcygpOyBsZXQgaSA9IGluZGV4O1wiIChtb3VzZWRvd24pPVwib25TZWxlY3RJdGVtQ2xpY2tlZCgkZXZlbnQsIGkpXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHBoeC1jaGVja2JveCBbZGF0YV09XCJpc0luZGV4U2VsZWN0ZWQoaSlcIiAocGh4QmVmb3JlQ2hhbmdlKT1cIm9uQ2hlY2tCZWZvcmVDaGFuZ2UoJGV2ZW50KVwiPjwvcGh4LWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1pdGVtXCI+e3tpdGVtLmxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICBcdFx0XHQ8L2xpPlxyXG4gICAgXHRcdDwvdWw+XHJcbiAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgPC9kaXY+XHJcblx0PC9kaXY+XHJcbjwvZGl2PlxyXG5gXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hNdWx0aURyb3Bkb3duTGlzdCBleHRlbmRzIEFic3RyYWN0TXVsdGlEcm9wZG93biBpbXBsZW1lbnRzIE9uSW5pdCwgSVNlYXJjaEhhbmRsZXI8SVNlbGVjdEl0ZW1Nb2RlbD4ge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxyXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxyXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXHJcbiAgQElucHV0KCdjb21wYXJhdG9yJylcclxuICBAT3B0aW9uKCdjb21wYXJhdG9yJylcclxuICBwcm90ZWN0ZWQgZGF0YUNvbXBhcmF0b3I6IElEYXRhQ29tcGFyYXRvcjxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpdGVtczogRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbFtdO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0TXVsdGlEcm9wZG93blxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGFsaWduOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRyb3Bkb3duSGVpZ2h0OiBzdHJpbmc7XHJcbiAgLy8gLS0tIGZyb20gc2VsZlxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbignc2VhcmNoSGFuZGxlcicpXHJcbiAgcHJvdGVjdGVkIHNlYXJjaEhhbmRsZXI6IElTZWFyY2hIYW5kbGVyPGFueT47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfc2VhcmNoVGV4dENsaWNrOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX3NlYXJjaEJ0bkNsaWNrOiBib29sZWFuO1xyXG4gIHB1YmxpYyBfc2VhcmNoQnRuTGFiZWw6IHN0cmluZztcclxuXHJcbiAgQFZpZXdDaGlsZCgnbVRleHRCb3gnKVxyXG4gIHByaXZhdGUgbVRleHRCb3g6IE1hdGVyaWFsVGV4dEJveDtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcclxuICBAT3B0aW9uKCdmb2N1cycpXHJcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2VsZWN0SXRlbXNcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVTZWxlY3QnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZVNlbGVjdCcpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVNlbGVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhTZWxlY3QnKVxyXG4gIEBPcHRpb24oJ3NlbGVjdCcpXHJcbiAgcHJvdGVjdGVkIHNlbGVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdE11bHRpRHJvcGRvd25cclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDbGljaycpXHJcbiAgQE9wdGlvbignY2xpY2snKVxyXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVTaG93JylcclxuICBAT3B0aW9uKCdiZWZvcmVTaG93JylcclxuICBwcm90ZWN0ZWQgYmVmb3JlU2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhTaG93JylcclxuICBAT3B0aW9uKCdzaG93JylcclxuICBwcm90ZWN0ZWQgc2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVIaWRlJylcclxuICBAT3B0aW9uKCdiZWZvcmVIaWRlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhIaWRlJylcclxuICBAT3B0aW9uKCdoaWRlJylcclxuICBwcm90ZWN0ZWQgaGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xyXG4gICAgc3VwZXIobmVlZEZvY3VzU2VydmljZSwgZWxlbWVudFJlZiwgcGhsb3hBcHBJbmZvU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcclxuICAgIHRoaXMuX3NlYXJjaFRleHRDbGljayA9IGZhbHNlO1xyXG4gICAgdGhpcy5fc2VhcmNoQnRuQ2xpY2sgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlYXJjaEJ0bkxhYmVsID0gXCJTZWFyY2hcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2RvU2VhcmNoKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgc2VhcmNoSXRlbXM6IERlZmF1bHRTZWxlY3RJdGVtTW9kZWxbXTtcclxuXHJcbiAgICBpZiAoc2VhcmNoSXRlbXMgPT09IG51bGwgfHwgc2VhcmNoSXRlbXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzZWFyY2hJdGVtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1UZXh0Qm94ICE9PSBudWxsICYmIHRoaXMubVRleHRCb3ggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBsZXQgc2VhcmNoVGV4dDogc3RyaW5nID0gdGhpcy5tVGV4dEJveC5nZXRJbnB1dFZhbHVlKCkgPT09IG51bGwgfHwgdGhpcy5tVGV4dEJveC5nZXRJbnB1dFZhbHVlKCkgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiB0aGlzLm1UZXh0Qm94LmdldElucHV0VmFsdWUoKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgc2VhcmNoSXRlbXMgPSB0aGlzLnNlYXJjaChzZWFyY2hUZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaW5kZXhJdGVtOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgICBpZiAoc2VhcmNoSXRlbXMgIT09IG51bGwgJiYgc2VhcmNoSXRlbXMgIT09IHVuZGVmaW5lZCAmJiBzZWFyY2hJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChzZWFyY2hJdGVtcy5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgIGluZGV4SXRlbSA9IHRoaXMuZ2V0SXRlbUluZGV4RnJvbVZhbHVlKHNlYXJjaEl0ZW1zWzBdLmdldFZhbHVlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluZGV4SXRlbSAhPT0gLTEpIHtcclxuICAgICAgbGV0IHJvdzogYW55ID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zZWFyY2gtbXVsdGktZHJvcGRvd24gPiAuZHJvcGRvd24tY29udGFpbmVyID4ubWVudS5zaG93ID4gdWwubWVudS1pdGVtID4gbGk6ZXEoJyArIChpbmRleEl0ZW0pICsgJyknKTtcclxuICAgICAgbGV0IG9mZnNldCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2VhcmNoLW11bHRpLWRyb3Bkb3duID4gLmRyb3Bkb3duLWNvbnRhaW5lciA+Lm1lbnUuc2hvdyA+IHVsLm1lbnUtaXRlbSA+IGxpJykuZmlyc3QoKS5wb3NpdGlvbigpLnRvcDtcclxuICAgICAgbGV0IHRhYmxlOiBhbnkgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNlYXJjaC1tdWx0aS1kcm9wZG93biA+IC5kcm9wZG93bi1jb250YWluZXIgPi5tZW51LnNob3cgPiB1bC5tZW51LWl0ZW0nKTtcclxuXHJcbiAgICAgICQodGFibGUpLnNjcm9sbFRvcCgoJChyb3cpLnBvc2l0aW9uKCkudG9wIC0gb2Zmc2V0KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX29uS2V5VXAoJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICgkZXZlbnQgIT09IG51bGwgJiYgJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5rZXlDb2RlID09IDEzKSB7XHJcbiAgICAgICAgdGhpcy5fZG9TZWFyY2goJGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIF9vblNlYXJjaEJ0bkNsaWNrKCRldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWFyY2hUZXh0Q2xpY2sgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlYXJjaEJ0bkNsaWNrID0gdHJ1ZTtcclxuXHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBsZXQgdmFsID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChcIm1hdGVyaWFsLXRleHQ