@churchillliving/se-ui-toolkit 6.56.67 → 6.56.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/shared/global-filters/global-filters.component.mjs +5 -3
- package/esm2022/lib/components/shared/grid-update/grid-update.component.mjs +13 -4
- package/esm2022/lib/services/grid.service.mjs +6 -1
- package/esm2022/lib/services/utilities.service.mjs +7 -1
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +27 -6
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/services/grid.service.d.ts +1 -0
- package/lib/services/utilities.service.d.ts +2 -0
- package/package.json +1 -1
|
@@ -230,6 +230,8 @@ export class SeGlobalFilterComponent {
|
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
matchSameFields(field, value, operator, numerRangeFilter = {}) {
|
|
233
|
+
if (this.gridUpdate)
|
|
234
|
+
return;
|
|
233
235
|
if (field) {
|
|
234
236
|
if (numerRangeFilter && numerRangeFilter?.format?.type === 'decimal' && value) {
|
|
235
237
|
const digitInfo = numerRangeFilter?.format?.formatParams?.digitsInfo;
|
|
@@ -650,11 +652,11 @@ export class SeGlobalFilterComponent {
|
|
|
650
652
|
}
|
|
651
653
|
}
|
|
652
654
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SeGlobalFilterComponent, deps: [{ token: i1.DatePipe }, { token: i2.DynamicDialogRef, optional: true }, { token: i2.DynamicDialogConfig, optional: true }, { token: i3.GridService }, { token: i2.DialogService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i4.DropdownService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
653
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", gridUpdate: "gridUpdate", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-datepicker\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-datepicker>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"getFilteredOptions(globalFilter)\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keydown)=\"dropdownKeydown(globalFilter, $event)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n [appendTo]=\"'body'\"\n [autoDisplayFirst]=\"globalFilter.value > 0 ? true : false\"\n filterMatchMode=\"startsWith\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-datepicker \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-datepicker>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\" style=\"display: flex; align-items: center; position: relative; width: 100%;\">\n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [ngModel]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\" (ngModelChange)=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value = $event\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n style=\"flex: 1; padding-right: 48px;\"\n />\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value || globalFilter?.valueTwo?.text\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n type=\"button\"\n title=\"Clear\"\n style=\"position: absolute; right: 15px; background: none; border: none; color: #999; cursor: pointer; padding: 0 2px; display: flex; align-items: center; justify-content: center; z-index: 10;\"\n >\n <i class=\"pi pi-times\" style=\"font-size: 14px;\"></i>\n </button>\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\" style=\"position: absolute; right: 8px;\"></i>\n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i10.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "component", type: i12.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "size", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i13.InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i14.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }] }); }
|
|
655
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", gridUpdate: "gridUpdate", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-datepicker\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-datepicker>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"getFilteredOptions(globalFilter)\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keydown)=\"dropdownKeydown(globalFilter, $event)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n [appendTo]=\"'body'\"\n [autoDisplayFirst]=\"globalFilter.value > 0 ? true : false\"\n filterMatchMode=\"startsWith\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.NUMERICINPUT\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n ></button>\n\n <p-datepicker \n #rangeCalendar\n [showButtonBar]=\"true\"\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n ></p-datepicker>\n\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n ></button>\n\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\" style=\"display: flex; align-items: center; position: relative; width: 100%;\">\n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [ngModel]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\" (ngModelChange)=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value = $event\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n style=\"flex: 1; padding-right: 48px;\"\n />\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value || globalFilter?.valueTwo?.text\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n type=\"button\"\n title=\"Clear\"\n style=\"position: absolute; right: 15px; background: none; border: none; color: #999; cursor: pointer; padding: 0 2px; display: flex; align-items: center; justify-content: center; z-index: 10;\"\n >\n <i class=\"pi pi-times\" style=\"font-size: 14px;\"></i>\n </button>\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\" style=\"position: absolute; right: 8px;\"></i>\n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i10.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "component", type: i12.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "size", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i13.InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i14.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }] }); }
|
|
654
656
|
}
|
|
655
657
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SeGlobalFilterComponent, decorators: [{
|
|
656
658
|
type: Component,
|
|
657
|
-
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-datepicker\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-datepicker>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"getFilteredOptions(globalFilter)\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keydown)=\"dropdownKeydown(globalFilter, $event)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n [appendTo]=\"'body'\"\n [autoDisplayFirst]=\"globalFilter.value > 0 ? true : false\"\n filterMatchMode=\"startsWith\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-datepicker \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-datepicker>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\" style=\"display: flex; align-items: center; position: relative; width: 100%;\">\n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [ngModel]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\" (ngModelChange)=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value = $event\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n style=\"flex: 1; padding-right: 48px;\"\n />\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value || globalFilter?.valueTwo?.text\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n type=\"button\"\n title=\"Clear\"\n style=\"position: absolute; right: 15px; background: none; border: none; color: #999; cursor: pointer; padding: 0 2px; display: flex; align-items: center; justify-content: center; z-index: 10;\"\n >\n <i class=\"pi pi-times\" style=\"font-size: 14px;\"></i>\n </button>\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\" style=\"position: absolute; right: 8px;\"></i>\n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
659
|
+
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-datepicker\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-datepicker>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"getFilteredOptions(globalFilter)\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keydown)=\"dropdownKeydown(globalFilter, $event)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n [appendTo]=\"'body'\"\n [autoDisplayFirst]=\"globalFilter.value > 0 ? true : false\"\n filterMatchMode=\"startsWith\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.NUMERICINPUT\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n ></button>\n\n <p-datepicker \n #rangeCalendar\n [showButtonBar]=\"true\"\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n ></p-datepicker>\n\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n ></button>\n\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\" style=\"display: flex; align-items: center; position: relative; width: 100%;\">\n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [ngModel]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\" (ngModelChange)=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value = $event\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n style=\"flex: 1; padding-right: 48px;\"\n />\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value || globalFilter?.valueTwo?.text\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n type=\"button\"\n title=\"Clear\"\n style=\"position: absolute; right: 15px; background: none; border: none; color: #999; cursor: pointer; padding: 0 2px; display: flex; align-items: center; justify-content: center; z-index: 10;\"\n >\n <i class=\"pi pi-times\" style=\"font-size: 14px;\"></i>\n </button>\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\" style=\"position: absolute; right: 8px;\"></i>\n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\"\n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
658
660
|
}], ctorParameters: () => [{ type: i1.DatePipe }, { type: i2.DynamicDialogRef, decorators: [{
|
|
659
661
|
type: Optional
|
|
660
662
|
}] }, { type: i2.DynamicDialogConfig, decorators: [{
|
|
@@ -677,4 +679,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
677
679
|
}], activeTestMode: [{
|
|
678
680
|
type: Input
|
|
679
681
|
}] } });
|
|
680
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFrQixRQUFRLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUosT0FBTyxFQUVMLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsU0FBUyxFQUNULGdCQUFnQixFQUNoQix1QkFBdUIsR0FDeEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPaEQsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQyxJQUFhLGNBQWMsQ0FBRSxHQUFPLElBQUksSUFBRyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFBQyxRQUFRLENBQUE7SUFBQyxDQUFDLENBQUEsQ0FBQztJQWlCdEUsWUFDUyxRQUFrQixFQUNOLEdBQXFCLEVBQ3JCLE1BQTJCLEVBQ3RDLFdBQXdCLEVBQ3pCLGFBQTRCLEVBQzNCLEVBQWMsRUFDZCxNQUFjLEVBQ2QsZUFBZ0MsRUFDaEMsR0FBc0I7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RyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQ25ELEdBQUcsR0FBQyxZQUFZLENBQUMsS0FBSyxDQUN2QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxZQUEyQixFQUFFLEtBQVU7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixZQUFZLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzNGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNQLENBQUM7a0lBbHRCWSx1QkFBdUI7c0hBQXZCLHVCQUF1Qiw0Y0N0QnBDLDh2dkJBNGdCQTs7NEZEdGZhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxtQkFBbUI7OzBCQStCMUIsUUFBUTs7MEJBQ1IsUUFBUTsyTUEzQmlCLFVBQVU7c0JBQXJDLFNBQVM7dUJBQUMsZUFBZTtnQkFDakIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNNLGNBQWM7c0JBQTFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7XG4gIElHbG9iYWxGaWx0ZXIsXG4gIEdyaWRGaWx0ZXJDb250cm9sVHlwZSxcbiAgRUdyaWRDb2x1bW5UeXBlLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG4gIEVHbG9iYWxGaWx0ZXJGb3JtYXRUeXBlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjdXJyZW50VXJsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJqZWN0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ2xvYmFsLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZUdsb2JhbEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXInKSBkYXRlUGlja2VyOiBhbnk7XG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlcnM6IElHbG9iYWxGaWx0ZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzZWFyY2hHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xlYXJHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ3JpZFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgZmlsdGVyc0FwcGxpZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdXBkYXRlVmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUgKHZhbDphbnkpIHsgaWYodmFsID09PSB0cnVlKSB7IGRlYnVnZ2VyIH19XG4gIHB1YmxpYyBmaXRlclR5cGVzID0gR3JpZEZpbHRlckNvbnRyb2xUeXBlO1xuICBwdWJsaWMgY29sdW1uVHlwZSA9IEVHcmlkQ29sdW1uVHlwZTtcbiAgcHVibGljIHNob3dEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNldEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRlUmFuZ2VWYWx1ZSA6IGFueTtcbiAgcHVibGljIHN0YXJ0RGF0ZTogRGF0ZTtcbiAgcHVibGljIGVuZERhdGU6IERhdGU7XG4gIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnM6IGFueVtdID0gW107XG4gIGFwcGx5RmlsdGVyJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGZpbHRlclN1YkluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2hvd0lucHV0OiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlcjogYW55ID0gJyc7XG4gIGhpZGVDbGVhckZpbHRlckJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIGNhbGVuZGFyRm9ybWF0OnN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkYXRlcGlwZTogRGF0ZVBpcGUsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZixcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnLFxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGRyb3Bkb3duU2VydmljZTogRHJvcGRvd25TZXJ2aWNlLCAgXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbm1lbnQgb2Ygc2VsZWN0ZWQgY29sdW1ucyBvbiBwYWdlIGxvYWRcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmRhdGEpe1xuICAgICAgdGhpcy5zaG93RGlhbG9nID0gdGhpcy5jb25maWcuZGF0YS5vcGVuRGlhbG9nO1xuICAgICAgaWYodGhpcy5jb25maWcuZGF0YS5nbG9iYWxGaWx0ZXJzKXtcbiAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzID0gdGhpcy5jb25maWc/LmRhdGEuZ2xvYmFsRmlsdGVycyBhcyBJR2xvYmFsRmlsdGVyW107XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKSA9PT0gMSkge1xuICAgICAgdGhpcy5zZWFyY2hidG5JZCA9ICdzZWFyY2hHbG9iYWxGaWx0ZXJCdG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlYXJjaGJ0bklkID0gYEZpbHRlcl8ke2N1cnJlbnRVcmwoKX1fJHt0aGlzLmdyaWRTZXJ2aWNlLmdldE51bWJlck9mQ2FsbHMoKX1gXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZGF0ZVJhbmdlKXtcbiAgICBpZihkYXRlUmFuZ2U/LnZhbHVlPy5sZW5ndGggPiAxKXtcbiAgICAgIGRhdGVSYW5nZS52YWx1ZVswXSA9IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZVswXSk7XG4gICAgICBkYXRlUmFuZ2UudmFsdWVbMV0gPSBkYXRlUmFuZ2UudmFsdWVbMV0gPT0gbnVsbCA/IGRhdGVSYW5nZS52YWx1ZVswXSA6IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZVsxXSk7XG4gICAgIC8vIGRhdGVSYW5nZS52YWx1ZVsxXSA9IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZVsxXSk7XG4gICAgICB0aGlzLnNlbGVjdERhdGUoZGF0ZVJhbmdlLCBmYWxzZSk7XG4gICAgfWVsc2Uge1xuICAgICAgaWYodGhpcy5kYXRlUmFuZ2VWYWx1ZSl7XG4gICAgICAgIGxldCBkYXRlUmFuZ2VWYWx1ZSA9IHRoaXMuZGF0ZVJhbmdlVmFsdWU/LmluY2x1ZGVzKCctJykgPyB0aGlzLmRhdGVSYW5nZVZhbHVlPy5zcGxpdCgnLScpIDogW3RoaXMuZGF0ZVJhbmdlVmFsdWVdO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgKGRhdGVSYW5nZVZhbHVlWzBdLnRyaW0oKSA9PSBkYXRlUmFuZ2VWYWx1ZVsxXS50cmltKCkpKXtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbXVxuICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZVswXSA9IG5ldyBEYXRlKGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpOyAgICAgXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0ZVJhbmdlVmFsdWU/Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgY29uc3Qgc2luZ2xlRGF0ZSA9IG5ldyBEYXRlKGRhdGVSYW5nZVZhbHVlWzBdLnRyaW0oKSk7XG4gICAgICAgICAgaWYgKCFpc05hTihzaW5nbGVEYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZSA9IFtzaW5nbGVEYXRlLCBzaW5nbGVEYXRlXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gICAgXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpbHRlcmVkT3B0aW9ucyhnbG9iYWxGaWx0ZXIpIHtcbiAgICByZXR1cm4gZ2xvYmFsRmlsdGVyLmZpbHRlcmVkT3B0aW9ucz8ubGVuZ3RoID4gMCAmJiAhZ2xvYmFsRmlsdGVyLmFsbG93U2VhcmNoXG4gICAgICA/IGdsb2JhbEZpbHRlci5maWx0ZXJlZE9wdGlvbnMgOiBnbG9iYWxGaWx0ZXIuZGF0YSA/IGdsb2JhbEZpbHRlci5kYXRhIDogW107XG4gIH1cbiAgXG4gIGNvbnRhaW5zV2hpdGVzcGFjZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLmluY2x1ZGVzKCcgJyk7XG4gIH1cblxuICBhZGRTcGFjZXNhdGZpcnN0KHgpIHtcbiAgICByZXR1cm4gXCIgXCIgKyB4O1xuICB9XG5cbiAgYWRkU3BhY2VzYXRsYXN0KHgpIHtcbiAgICByZXR1cm4geCArIFwiIFwiXG4gIH1cblxuICAvLyBjaGFuZ2UgY2FsZW5kYXIgZm9ybWF0IG9uIHJ1biB0aW1lIGlmIHVzZXIgdHlwZSBkYXRlIG9uIHRoZSBjYWxlbmRhciBmaWVsZC5cbiAgY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgZXZlbnQ/OiBhbnkpIHtcbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dClbMF07XG4gIFxuICAgIGlmIChpbnB1dEVsZW1lbnQpIHtcbiAgICAgIGlucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGE6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGEua2V5ID09PSAnVGFiJyB8fCBhLmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSAoYS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlPy50cmltKCk7XG4gICAgICAgICAgaWYgKGlucHV0VmFsdWUgJiYgIWlucHV0VmFsdWUuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgY29uc3Qgc2luZ2xlRGF0ZSA9IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihzaW5nbGVEYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlID0gW3NpbmdsZURhdGUsIHNpbmdsZURhdGVdO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoZ2xvYmFsRmlsdGVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgXG4gICAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBsZXQgeWVhciA9IChhLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICAgIHllYXIgPSB5ZWFyPy50b1N0cmluZygpLnNwbGl0KCcgJylbMF07XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlVmFsdWUgPSAoYS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlO1xuICAgICAgICBsZXQgZGF0ZVJhbmdlVmFsdWUgPSB0aGlzLmRhdGVSYW5nZVZhbHVlLmluY2x1ZGVzKCctJykgPyB0aGlzLmRhdGVSYW5nZVZhbHVlLnNwbGl0KCctJykgOiAnJztcbiAgXG4gICAgICAgIC8vIEFkZGluZyBzcGFjZSBiZXR3ZWVuIGZyb20gYW5kIHRvIGRhdGUgaW4gZGF0ZSByYW5nZSBmaWx0ZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGVSYW5nZVZhbHVlLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgIGRhdGVSYW5nZVZhbHVlWzFdLnNwbGl0KCcvJykubGVuZ3RoID09PSAzICYmXG4gICAgICAgICAgKCF0aGlzLmNvbnRhaW5zV2hpdGVzcGFjZShkYXRlUmFuZ2VWYWx1ZVswXSkgfHwgIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzFdKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zV2hpdGVzcGFjZShkYXRlUmFuZ2VWYWx1ZVswXSkpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVZhbHVlWzBdID0gdGhpcy5hZGRTcGFjZXNhdGxhc3QoZGF0ZVJhbmdlVmFsdWVbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzFdKSkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlVmFsdWVbMV0gPSB0aGlzLmFkZFNwYWNlc2F0Zmlyc3QoZGF0ZVJhbmdlVmFsdWVbMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAoYS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUgPSBgJHtkYXRlUmFuZ2VWYWx1ZVswXX0tJHtkYXRlUmFuZ2VWYWx1ZVsxXX1gO1xuICAgICAgICB9XG4gIFxuICAgICAgaWYoeWVhcj8ubGVuZ3RoID09PSA0KXtcbiAgICAgICAgdGhpcy5jYWxlbmRhckZvcm1hdCA9ICdtbS9kZC95eSc7XG4gICAgICAgIGlmKGdsb2JhbEZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuQ0FMRU5EQVIpe1xuICAgICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZSA9IG5ldyBEYXRlKChhLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih5ZWFyPy5sZW5ndGgpe1xuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB5ZWFyVmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZT8udG9TdHJpbmcoKT8uc3BsaXQoJy8nKVs0XTtcbiAgICBpZigoIWdsb2JhbEZpbHRlci52YWx1ZSB8fCB5ZWFyVmFsdWUgPT0gdW5kZWZpbmVkIHx8IHllYXJWYWx1ZT8udG9TdHJpbmcoKT8ubGVuZ3RoID09PSAxKSAmJiBnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIsIHRydWUpO1xuICAgIH1cbiAgfSBcbn1cbiAgY2hlY2tJZkZpbHRlclJlcXVpcmVkKGZpbHRlcjpJR2xvYmFsRmlsdGVyKXtcbiAgICBpZihmaWx0ZXIudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbj0+dmFsaWRhdGlvbi50eXBlPT09RUZpbHRlclZhbGlkYXRvci5SRVFVSVJFRCkpe1xuICAgICAgZmlsdGVyLnJlcXVpcmVkRmllbGQ9dHJ1ZTtcbiAgICB9ICAgIFxuICB9XG4gIGNoZWNrRmlsdGVyVmFsaWRhdGlvbihyZW1vdmVFcnJvcjpib29sZWFuID0gZmFsc2UpOmJvb2xlYW57XG4gICAgbGV0IHZhbGlkOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBpZih0aGlzLmdsb2JhbEZpbHRlcnMgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzLmZvckVhY2goKGZpbHRlcik9PntcbiAgICAgICAgaWYoZmlsdGVyLnZhbGlkYXRpb25zICYmIGZpbHRlci52YWxpZGF0aW9ucy5sZW5ndGggPiAwICYmIGZpbHRlci52YWxpZGF0aW9uc1swXS50eXBlID09PSBFRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEICYmICFmaWx0ZXIudmFsdWUgJiYgIXJlbW92ZUVycm9yKXtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgICAgZmlsdGVyLmVycm9yTWVzc2FnZSA9IGZpbHRlci5kaXNwbGF5VGV4dCtcIiBpcyByZXF1aXJlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlci5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyl7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJzPy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tJZkZpbHRlclJlcXVpcmVkKGZpbHRlcik7XG4gICAgICBpZiAoZmlsdGVyLnZhbHVlICYmIChmaWx0ZXIuaGlkZGVuID09PSBmYWxzZSB8fCBmaWx0ZXIuaGlkZGVuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC8vIHNldCBCeSBEZWZhdWx0IENhbGVuZGFyIFJhbmdlXG4gICAgLy90aGlzLnNldERlZmF1bHRDYWxlbmRhclJhbmdlKGZhbHNlKTtcbiAgICBjb25zdCBnaXJkQ2xlYXJGaWx0ZXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICdjbGVhckdyaWRGaWx0ZXJWYWx1ZXNCdXR0b24nXG4gICAgKTtcbiAgICBpZiAoZ2lyZENsZWFyRmlsdGVyQnRuKSB7XG4gICAgICBpZiAoZ2lyZENsZWFyRmlsdGVyQnRuLmNsYXNzTGlzdC5jb250YWlucygnaGlkZS1jbGVhci1maWx0ZXItYnV0dG9uJykpIHtcbiAgICAgICAgdGhpcy5oaWRlQ2xlYXJGaWx0ZXJCdG4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlQ2xlYXJGaWx0ZXJCdG4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlQ2xlYXJGaWx0ZXJCdG4gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHNwbGl0aW5nIGRhdGUgcmFuZ2UgdmFsdWUgYW5kIGFzc2lnbiB0byB2YWx1ZSBhbmQgdmFsdWVUd28gaW4gRGF0ZV9SYW5nZSBDb250cm9sXG4gICAgY29uc3QgZGF0ZVJhbmdlRmlsdGVyID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UpO1xuICAgIGRhdGVSYW5nZUZpbHRlcj8uZm9yRWFjaCgoZGF0ZVJhbmdlKSA9PiB7XG4gICAgICBpZiAoZGF0ZVJhbmdlLnZhbHVlICYmIGRhdGVSYW5nZS52YWx1ZVR3bykge1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBkYXRlUmFuZ2UudmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVJhbmdlLnZhbHVlIDogbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlKTtcbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IGRhdGVSYW5nZS52YWx1ZVR3byBpbnN0YW5jZW9mIERhdGUgPyBkYXRlUmFuZ2UudmFsdWVUd28gOiBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVUd28pO1xuICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbc3RhcnREYXRlLCBlbmREYXRlXTtcbiAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRlUmFuZ2UudmFsdWUgJiYgIWRhdGVSYW5nZS52YWx1ZVR3bykge1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLCBkYXRlUmFuZ2UudmFsdWUsICdndGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZGF0ZVJhbmdlLmZyb21GaWVsZCwgZGF0ZVJhbmdlLnZhbHVlVHdvLCAnZ3RlJyk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBGaWx0cmluZyBOdW1lcmljIFJhbmdlIGNvbnRyb2xzIG9uIGdsb2JhbCBmaWx0ZXIgXG4gICAgY29uc3QgbnVtZXJSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5OVU1FUklDX1JBTkdFKTtcbiAgICBudW1lclJhbmdlRmlsdGVyLmZvckVhY2goKG51bWVyaWNSYW5nZSkgPT4ge1xuICAgICAgaWYgKG51bWVyaWNSYW5nZSkge1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShudW1lcmljUmFuZ2UpO1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlVHdvKG51bWVyaWNSYW5nZSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudG9GaWVsZCl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLCdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIG1hdGNoU2FtZUZpZWxkcyhmaWVsZDogc3RyaW5nLHZhbHVlOmFueSwgb3BlcmF0b3I6c3RyaW5nLCBudW1lclJhbmdlRmlsdGVyOiBhbnkgPSB7fSl7XG4gICAgICBpZihmaWVsZCl7XG4gICAgICAgIGlmKG51bWVyUmFuZ2VGaWx0ZXIgJiYgbnVtZXJSYW5nZUZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgJiYgdmFsdWUpe1xuICAgICAgICAgIGNvbnN0IGRpZ2l0SW5mbyA9IG51bWVyUmFuZ2VGaWx0ZXI/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIGlmKGRpZ2l0SW5mbyl7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKGRpZ2l0SW5mbyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzW2luZGV4XSA9IHtmaWVsZDogZmllbGQsIG1hdGNoTW9kZTonYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWV9OyAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7ZmllbGQ6IGZpZWxkLCBtYXRjaE1vZGU6J2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OmJvb2xlYW4gPSBmYWxzZSkge1xuICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCl7IFxuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCxnbG9iYWxGaWx0ZXIudmFsdWUsJ2d0ZScsIGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9XG4gICAgIH1cbiAgXG4gIH1cbiAgcmVtb3ZlTnVsbExvb2t1cChldmVudDogYW55LCBnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYoIWV2ZW50LnRhcmdldC52YWx1ZSl7XG4gICAgICB0aGlzLmxvb2t1cENsZWFyVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICB9XG4gIH1cbiAgbG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYgKGdsb2JhbEZpbHRlcikge1xuXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPyBnbG9iYWxGaWx0ZXIudmFsdWU9Jyc6JydcbiAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVR3bz9nbG9iYWxGaWx0ZXIudmFsdWVUd289Jyc6JydcbiAgICAgLy8gZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0P2dsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD0nJzonJ1xuICAgICAgLy8gY29sdW1uLmRpc3BsYXlGaWVsZD9yb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0gPSAnJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy50ZXh0PyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udGV4dD0nJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZF0gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAvLyBjb2x1bW4uZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIC8vdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4pO1xuICAgIH1cbiAgIC8vIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XG4gICAvLyBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgLy8gIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xuICAgLy8gfVxuICB9XG5cbiAgc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyOiBhbnksIGNsZWFyVmFsdWU6IGJvb2xlYW4gPWZhbHNlKSB7XG4gICAgaWYoZ2xvYmFsRmlsdGVyLnZhbHVlPy5sZW5ndGggPiAwKXtcbiAgICAgIGNvbnN0IGZyb21EYXRlVmFsdWUgPSB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybShcbiAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlWzBdLFxuICAgICAgICBnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvRGF0ZVZhbHVlID0gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVsxXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbURhdGVWYWx1ZSAmJiB0b0RhdGVWYWx1ZSAmJiBnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkICYmIGdsb2JhbEZpbHRlci50b0ZpZWxkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsZnJvbURhdGVWYWx1ZSwnZ3RlJyk7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLHRvRGF0ZVZhbHVlLCdsdGUnKTtcbiAgICAgIH1cbiAgICB9ZWxzZSBpZihjbGVhclZhbHVlKXtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsIG51bGwsICdndGUnKTtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLCBudWxsLCAnbHRlJyk7XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcikge1xuICAgIGlmIChnbG9iYWxGaWx0ZXIudHlwZSA9PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuRFJPUERPV04gJiYgIWdsb2JhbEZpbHRlci52YWx1ZSkge1xuICAgICAgZ2xvYmFsRmlsdGVyLmZpbHRlcmVkT3B0aW9ucyA9IGdsb2JhbEZpbHRlci5kYXRhID8gWy4uLmdsb2JhbEZpbHRlci5kYXRhXSA6IFtdO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsRmlsdGVyICYmIHRoaXMuZ2xvYmFsRmlsdGVycz8ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGdsb2JhbEZpbHRlci5vbkZvY3VzT3V0KSB7XG4gICAgICAgIGdsb2JhbEZpbHRlci5vbkZvY3VzT3V0KGdsb2JhbEZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsRmlsdGVyLm9uQ2xpY2spIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyLm9uQ2xpY2soZ2xvYmFsRmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmKGdsb2JhbEZpbHRlci50eXBlID09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKXtcbiAgICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRmlsdGVycyA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKHgpID0+IHguZmllbGQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGQgJiYgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKVxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJTdWJJbml0aWFsaXplZCkge1xuICAgICAgICAgIHRoaXMuZmlsdGVyU3ViSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIkLnBpcGUoZGVib3VuY2VUaW1lKDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcih4ID0+IHguZmllbGQpO1xuICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseUZpbHRlciQubmV4dCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyOiBJR2xvYmFsRmlsdGVyKXtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUuZW1pdChnbG9iYWxGaWx0ZXIpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzRXZlbnQoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcihmaWx0ZXIgPT4gZmlsdGVyLmZpZWxkKTtcbiAgICBjb25zdCBkYXRlUmFuZ2VJbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KFxuICAgICAgZmlsdGVyID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0VcbiAgICApO1xuICAgIGlmIChkYXRlUmFuZ2VJbmRleCA+IC0xKSB7XG4gICAgICAvLyB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGRhdGVSYW5nZUluZGV4LCAxKTtcbiAgICAgICAgLy8gfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gIH1cblxuICBzZXRTZWFyY2hEcm9wZG93bkZpbHRlclZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWxGaWx0ZXJzXG4gICAgICA/LmZpbHRlcigoZ2xvYmFsRmlsdGVyKSA9PiBnbG9iYWxGaWx0ZXIuZmllbGQpXG4gICAgICA/Lm1hcCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGZpbHRlci52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbHRlclZhbHVlICYmXG4gICAgICAgICAgdHlwZW9mIGZpbHRlclZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuRFJPUERPV05cbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5maWx0ZXIsIHZhbHVlOiBmaWx0ZXJWYWx1ZSB9O1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgc2VsZWN0ZWQgZmlsdGVyc1xuICAgKi9cbiAgYXBwbHlGaWx0ZXJzKGZpbHRlckV2ZW50OiBib29sZWFuPSB0cnVlLCBnbG9iYWxGaWx0ZXI6YW55ID0ge30pIHtcbiAgICAgdGhpcy5ncmlkU2VydmljZS51c2VyU2VhcmNoZWQ9dHJ1ZTtcbiAgICAgaWYoZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICB9IFxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZpbHRlckV2ZW50O1xuICAgIGNvbnN0IHJhd0ZpbHRlcnMgPSB0aGlzLnNldEZpbHRlclxuICAgICAgPyB0aGlzLnNldFNlYXJjaERyb3Bkb3duRmlsdGVyVmFsdWUoKVxuICAgICAgOiB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcblxuICAgIGNvbnN0IGNsb25lZEZpbHRlcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJhd0ZpbHRlcnMpKTtcblxuICAgIC8vIFJlbW92ZSBEQVRFX1JBTkdFIGZpbHRlciBmcm9tIGNsb25lZCBsaXN0XG4gICAgY29uc3QgaW5kZXggPSBjbG9uZWRGaWx0ZXJzLmZpbmRJbmRleChcbiAgICAgIChmaWx0ZXIpID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0VcbiAgICApO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBjbG9uZWRGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgY2xvbmVkRmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DSEVDS0JPWCAmJlxuICAgICAgICBmaWx0ZXIuZm9ybWF0ID09PSBFR2xvYmFsRmlsdGVyRm9ybWF0VHlwZS5CT09MRUFOX1lOXG4gICAgICApIHtcbiAgICAgICAgaWYgKGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGZpbHRlci52YWx1ZSA9PT0gdHJ1ZSA/ICdZJyA6ICdOJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICBpZiAodGhpcy5zaG93RGlhbG9nKSB7XG4gICAgICB0aGlzLnJlZi5jbG9zZShjbG9uZWRGaWx0ZXJzKTtcbiAgICB9IGVsc2UgXG4gICAgaWYoIXRoaXMuY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKCkpe1xuICAgICAgdGhpcy5jaGVja0ZpbHRlclZhbGlkYXRpb24odHJ1ZSk7XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoY2xvbmVkRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IEJ5IERlZmF1bHQgQ2FsZW5kYXIgUmFuZ2UgXG4gIHNldERlZmF1bHRDYWxlbmRhclJhbmdlKGNoZWNrOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnMgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSAmJiBmaWx0ZXIuZGF5UmFuZ2UgJiYgZmlsdGVyLnZhbHVlICYmIGZpbHRlci52YWx1ZVR3bykge1xuICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93TmV4dChmaWx0ZXIsIGNoZWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzaG93TmV4dChmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGNoZWNrOiBib29sZWFuID0gdHJ1ZSk6IERhdGVbXSB7XG4gICAgLy8gbGV0IG5leHRWYWx1ZTogc3RyaW5nO1xuICAgIGxldCBuZXh0VmFsdWU6IERhdGVbXVxuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgLy8gbmV4dFZhbHVlID0gdGhpcy5zZXREYXlGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5NT05USDpcbiAgICAgIC8vICBuZXh0VmFsdWUgPSB0aGlzLnNldE1vbnRoRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuWUVBUjpcbiAgICAgIC8vICBuZXh0VmFsdWUgPSB0aGlzLnNldFllYXJGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB3ZWVrXG4gICAgICBuZXh0VmFsdWUgPSB0aGlzLnNldFdlZWtGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgZmlsdGVyLnZhbHVlPSBuZXh0VmFsdWVcbiAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpXG4gICAgICAgIC8vZmlsdGVyLnZhbHVlVHdvPW5leHRWYWx1ZVsxXVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGNoZWNrO1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSApXG4gICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdChnbG9iYWxGaWx0ZXJzKTtcbiAgIC8vIGxldCB0ZXN0PW5leHRWYWx1ZVxuICAgIC8vZmlsdGVyLnZhbHVlPW5leHRWYWx1ZVxuICAgXG4gICAgcmV0dXJuIG5leHRWYWx1ZTtcbiAgfVxuXG4gIHNob3dQcmV2aW91cyhmaWx0ZXI6IElHbG9iYWxGaWx0ZXIpOiBEYXRlW10ge1xuICAgIGxldCBwcmV2aW91c1ZhbHVlOiBEYXRlW107XG4gICAgbGV0IGRheVJhbmdlOiBFRGF5UmFuZ2UgPSBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgID8gZmlsdGVyLmRheVJhbmdlXG4gICAgICA6IEVEYXlSYW5nZS5XRUVLO1xuICAgIHN3aXRjaCAoZGF5UmFuZ2UpIHtcbiAgICAgIGNhc2UgRURheVJhbmdlLkRBWTpcbiAgICAgICAvLyBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXREYXlGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgIC8vICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0TW9udGhGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuWUVBUjpcbiAgICAgIC8vICBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXRZZWFyRmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlZWtcbiAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0V2Vla0ZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGZpbHRlci52YWx1ZT1wcmV2aW91c1ZhbHVlXG4gICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpXG4gICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gdHJ1ZTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XG4gICAgY29uc3QgZ2xvYmFsRmlsdGVycyA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKHgpID0+IHguZmllbGQpO1xuICAgIGNvbnN0IGluZGV4ID0gZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWx0ZXIuZmllbGQgJiYgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFIClcbiAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcjogSUdsb2JhbEZpbHRlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChmaWx0ZXIudmFsdWUgPVxuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuc3RhcnREYXRlLFxuICAgICAgICBmaWx0ZXIuZm9ybWF0ID8gZmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKSArXG4gICAgICAnfCcgK1xuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuZW5kRGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkpO1xuICB9XG5cbiAgc2V0RGF0ZVZhbHVlKGZpbHRlcjogYW55KSB7XG4gICAgbGV0IHZhbHVlOiBEYXRlO1xuICAgIGlmIChmaWx0ZXIudmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoZmlsdGVyLnZhbHVlLnNwbGl0KCd8JylbMF0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnNldE1vbnRoKHZhbHVlLmdldE1vbnRoKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF5RmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnREYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldERhdGUoKSAtIDFcbiAgICAgICAgICApXG4gICAgICAgIDogY3VycmVudERhdGU7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldERhdGUoKSArIDFcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICBzZXRZZWFyRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIHZhciBmaXJzdERhdGVPZlllYXIgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpICsgMSwgMCwgMSlcbiAgICAgICAgOiBmaXJzdERhdGVPZlllYXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpIC0gMSwgMCwgMSlcbiAgICAgICAgOiBmaXJzdERhdGVPZlllYXI7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgMTEsIDMxKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0TW9udGhGaWx0ZXIoZmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBpc05leHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBjdXJyZW50RGF0ZSA9IHRoaXMuc2V0RGF0ZVZhbHVlKGZpbHRlcik7XG4gICAgdmFyIGZpcnN0RGF0ZU9mTW9udGggPSBuZXcgRGF0ZShcbiAgICAgIGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBjdXJyZW50RGF0ZS5nZXRNb250aCgpLFxuICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpIC0gMSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIDogZmlyc3REYXRlT2ZNb250aDtcbiAgICB9XG5cbiAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZShcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICBzZXRXZWVrRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogRGF0ZVtde1xuICAgIGxldCBmaWx0ZXJWYWx1ZTpEYXRlPSBBcnJheS5pc0FycmF5KGZpbHRlci52YWx1ZSk/IGZpbHRlci52YWx1ZVswXTpmaWx0ZXIudmFsdWVcbiAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZShmaWx0ZXJWYWx1ZT8gZmlsdGVyVmFsdWU6bmV3IERhdGUoKSkvL3RoaXMuc2V0RGF0ZVZhbHVlKGZpbHRlcik7XG4gICAgbGV0IGZpcnN0RGF5ID0gbmV3IERhdGUoY3VycmVudERhdGUuc2V0RGF0ZShmaWx0ZXJWYWx1ZSA/IGN1cnJlbnREYXRlLmdldERhdGUoKSA6IGN1cnJlbnREYXRlLmdldERhdGUoKSAtIGN1cnJlbnREYXRlLmdldERheSgpICsgMSkpO1xuICAgIGxldCB3ZWVrU2Vjb25kcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGxldCB2YWx1ZTpEYXRlXG4gICAgICAgIGlmIChpc05leHQpIHtcbiAgICAgIHZhbHVlID0gZmlsdGVyVmFsdWVcbiAgICAgICBmaWx0ZXIudmFsdWVcbiAgICAgICAgPyAgdmFsdWUuc2V0RGF0ZShmaWx0ZXJWYWx1ZS5nZXREYXRlKCkrNykgICAvL25ldyBEYXRlKG5ldyBEYXRlKGZpbHRlclZhbHVlKS5nZXRUaW1lKCkgKyB3ZWVrU2Vjb25kcylcbiAgICAgICAgOiB2YWx1ZT0gbmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGZpbHRlci52YWx1ZVxuICAgICAgICA/bmV3IERhdGUoZmlsdGVyVmFsdWUuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG4gICAgICAgIDogbmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG4gICAgfVxuICAgIC8vdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIC8vIGxldCB2YWx1ZTpEYXRlPWZpbHRlclZhbHVlP1xuICAgIC8vICAgaXNOZXh0P25ldyBEYXRlKGZpbHRlclZhbHVlLmdldFRpbWUoKSArIHdlZWtTZWNvbmRzKTpuZXcgRGF0ZShmaWx0ZXJWYWx1ZS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcyk6XG4gICAgLy8gICBpc05leHQ/bmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpKTpuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcylcblxuICAgIGxldCB2YWx1ZVR3bzpEYXRlPW5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSArIDYgKiAyNCAqIDYwICogNjAgKiAxMDAwKTsgXG4gICAvLyBjb25zb2xlLmxvZygndGVzdCcsdmFsdWUsJ3Rlc3QyJyx2YWx1ZVR3bylcbiAgICByZXR1cm4gW3ZhbHVlLCB2YWx1ZVR3b11cbiAgIC8vcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICAgIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkXG4gICAqL1xuICAgICBzZWxlY3RMb29rdXBGaWVsZChnbG9iYWxGaWx0ZXJzOiBJR2xvYmFsRmlsdGVyKSB7XG5cbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2Uuc2V0TG9va1VwRmlsdGVyKGdsb2JhbEZpbHRlcnMsIHRoaXMuZGlhbG9nU2VydmljZSwgdHJ1ZSwgKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IGZvciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB0byBjb21wbGV0ZSBiZWZvcmUgYXBwbHlpbmcgZmlsdGVyc1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXIgdmFsdWVzXG4gICAqL1xuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJzLmZvckVhY2goKGl0ZW0pPT57XG4gICAgICBpZihpdGVtLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5MT09LVVBfSU5QVVQgJiYgaXRlbT8udmFsdWVUd28/LnRleHQpe1xuICAgICAgICBpdGVtLnZhbHVlVHdvID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0udmFsdWUgPSBudWxsO1xuICAgIH0pXG4gICAgY29uc3QgY2xlYXJHcmlkRmlsdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsZWFyR3JpZEZpbHRlclZhbHVlc0J1dHRvbicpXG4gICAgaWYoY2xlYXJHcmlkRmlsdGVyKXtcbiAgICAgIGNsZWFyR3JpZEZpbHRlci5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gICAvKipcbiAgICogQ2xlYXIgdmFsdWVzIG9mIERhdGUgUmFuZ2UgRmlsdGVyXG4gICAqL1xuICAgIGNsZWFyRGF0ZVJhbmdlVmFsdWUoZmlsdGVyOiBhbnkpe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShmaWx0ZXIsIHRydWUpXG4gICAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBkaWFsb2cgd2l0aG91dCBhcHBseWluZyBmaWx0ZXJzXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSgpO1xuICB9XG4gIHJhbmdlRGF0ZWNsb3NlKGVsZW1lbnQpIHsgIFxuICAgIHRoaXMuZGF0ZVBpY2tlci5oaWRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5kYXRlcGlja2VyQ2xpY2sgPSB0cnVlO1xuICAgIC8vIGNvbnN0IGlkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQpO1xuICAgIC8vIGNvbnNvbGUubG9nKGlkLCAgZWxlbWVudC5lbC5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCkvL2VsZW1lbnQsIGlkICxcbiAgICAvLyBpZC5mb2N1cygpO1xuICAgIGVsZW1lbnQuZWwubmF0aXZlRWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQuZm9jdXMoKTtcbiAgICB0aGlzLmRhdGVQaWNrZXIub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGVQaWNrZXIuZGF0ZXBpY2tlckNsaWNrID0gdHJ1ZTtcblxuICB9XG5cbiAgZmlsdGVySW5wdXQoKSB7XG4gICAgdGhpcy5zaG93SW5wdXQgPSAhdGhpcy5zaG93SW5wdXQ7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlZCB0aGUgY2FsZW5kYXIgaW5wdXRcbiAgICovXG4gIHNlbGVjdERhdGUoZ2xvYmFsRmlsdGVyOiBhbnksIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZSwgZXZlbnQ/OmFueSl7XG4gICAgaWYoZ2xvYmFsRmlsdGVyLnZhbHVlPy5sZW5ndGggPiAxICYmIGdsb2JhbEZpbHRlci52YWx1ZVsxXSAhPT0gbnVsbCl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlKGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihmb2N1c2VkID09dHJ1ZSl7XG4gICAgICB0aGlzLnJhbmdlRGF0ZWNsb3NlKGV2ZW50KTsgXG4gICAgICB9XG4gICAgfVxuICAgIGlmKGZvY3VzZWQpe1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2xvYmFsRmlsdGVyLmZpZWxkKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgdGFiRm9jdXNFdmVudChnbG9iYWxGaWx0ZXI6IGFueSkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy4nK2dsb2JhbEZpbHRlci5maWVsZFxuICAgICk7XG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lLmNsaWNrKCk7XG4gICAgfVxuICB9XG4gIGRyb3Bkb3duS2V5ZG93bihnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGV2ZW50OiBhbnkpe1xuICAgIGlmICghZ2xvYmFsRmlsdGVyLmFsbG93U2VhcmNoKSB7XG4gICAgICAgIGdsb2JhbEZpbHRlci5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmRyb3Bkb3duU2VydmljZS5vbkRyb3Bkb3duS2V5ZG93bihldmVudCwgZ2xvYmFsRmlsdGVyKTtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9XG59XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtY29tcG9uZW50LXdyYXBwZXItZGl2XCI+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmhpZGRlbiA/ICdnbG9iYWxGaWx0ZXJIaWRkZW4nIDogZ2xvYmFsRmlsdGVyLmNvbHVtbiA/ICdjb2wtJyArIGdsb2JhbEZpbHRlci5jb2x1bW4gOiAnY29sLTMnXCJcbiAgICAqbmdGb3I9XCJsZXQgZ2xvYmFsRmlsdGVyIG9mIGdsb2JhbEZpbHRlcnNcIlxuICA+XG4gICAgPGRpdiBbbmdTd2l0Y2hdPVwiZ2xvYmFsRmlsdGVyLnR5cGVcIj5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNBTEVOREFSXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NzaWJsZS1idWxrLXVwZGF0ZS1pbnB1dC13cmFwcGVyLWRpdlwiPlxuICAgICAgICAgICAgICA8cC1kYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0OiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0LURhdGUnXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvcC1kYXRlcGlja2VyPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICAgIDxzZS1maWx0ZXItbWVudSBbZ2xvYmFsRmlsdGVyXT1cImdsb2JhbEZpbHRlclwiPjwvc2UtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgUmFuZ2UgLS0+XG4gICAgICA8IS0tIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5DQUxFTkRBUl9SQU5HRVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dQcmV2aW91cyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJQcmV2aW91cyB7e1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5kYXlSYW5nZSA/IGdsb2JhbEZpbHRlci5kYXlSYW5nZSA6ICdXZWVrJ1xuICAgICAgICAgICAgICB9fSA8PFwiIFxuICAgICAgICAgICAgPiAtLT5cbiAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgICA8IS0tIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnByZWZpeD09PXRydWUgfHwgZ2xvYmFsRmlsdGVyLnByZWZpeD09PXVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgIHt7ICBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0ID8gZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA6ICcnIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj4gLS0+XG4gICAgICAgICAgICAgIDwhLS0ge3tcbiAgICAgICAgICAgICAgICBzdGFydERhdGVcbiAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICA6IChnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5JylcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICBlbmREYXRlXG4gICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiAoZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eScpXG4gICAgICAgICAgICAgIH19IC0tPlxuICAgICAgICAgICAgICA8IS0tIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnByZWZpeD09PWZhbHNlXCI+XG4gICAgICAgICAgICAgICAge3sgZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA/IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgOiAnJ319XG4gICAgICAgICAgICAgIDwvc3Bhbj48L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93TmV4dChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJOZXh0IHt7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICAgIH19ID4+XCJcbiAgICAgICAgICAgID4gLS0+XG4gICAgICAgICAgICA8IS0tIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogZ2xvYmFsRmlsdGVyLmNvbG9yID8gZ2xvYmFsRmlsdGVyLmNvbG9yIDogJyd9XCIgLS0+XG4gICAgICAgICAgPCEtLSA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPiAtLT5cblxuICAgICAgPCEtLSBDaGVja2JveCBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JzogJ2ZsZXggYWxpZ24taXRlbXMtY2VudGVyJ1wiXG4gICAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gU3BhY2VyIENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLlNQQUNFUlwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmNvbHVtblxuICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtblxuICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gRHJvcGRvd24gQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRST1BET1dOXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAgIChrZXl1cC5UYWIpPVwidGFiRm9jdXNFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldEZpbHRlcmVkT3B0aW9ucyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdsb2JhbEZpbHRlci5vcHRpb25MYWJlbFwiXG4gICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJnbG9iYWxGaWx0ZXIub3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgICBbZmlsdGVyXT1cImdsb2JhbEZpbHRlci5hbGxvd1NlYXJjaFwiXG4gICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImRyb3Bkb3duS2V5ZG93bihnbG9iYWxGaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICAgIFthdXRvRGlzcGxheUZpcnN0XT1cImdsb2JhbEZpbHRlci52YWx1ZSA+IDAgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgICAgICAgICBmaWx0ZXJNYXRjaE1vZGU9XCJzdGFydHNXaXRoXCJcbiAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiA+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gSW5wdXQgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLklOUFVUXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZmlsdGVyaW5nXCI+XG4gICAgICAgICAgICAgIDxzZS1maWx0ZXItbWVudSBbZ2xvYmFsRmlsdGVyXT1cImdsb2JhbEZpbHRlclwiPjwvc2UtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDwhLS0gTnVtZXJpY0lucHV0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTlVNRVJJQ0lOUFVUXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyIHBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIERhdGUgUmFuZ2UgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHJhbmdlLWNhbGVuZGFyIGdhcC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmRheVJhbmdlXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1yYW5nZS1idG4gIGNhbGVuZGFyLXByZXZpb3VzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dQcmV2aW91cyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCI8PFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIFwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICB9fSA8PFwiIC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHAtZGF0ZXBpY2tlciBcbiAgICAgICAgICAgICNyYW5nZUNhbGVuZGFyXG4gICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcblxuICAgICAgICAgICAgW2lucHV0SWRdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHkgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCA6ICdmbGV4LWdyb3ctMSBncm93LTEgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiIFxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZT1cInJhbmdlXCIgXG4gICAgICAgICAgICBbc2VsZWN0T3RoZXJNb250aHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgKG9uU2VsZWN0KT1cInNlbGVjdERhdGUoZ2xvYmFsRmlsdGVyLCB0cnVlLCByYW5nZUNhbGVuZGFyKVwiXG4gICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJjYWxlbmRhckZvcm1hdFwiXG4gICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAob25DbGlja091dHNpZGUpPVwic2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAob25CbHVyKT1cInNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKGtleXVwKT1cImNhbGVuZGFyRm9jdXNFdmVudChnbG9iYWxGaWx0ZXIsICRldmVudClcIlxuICAgICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJjbGVhckRhdGVSYW5nZVZhbHVlKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKHRydWUsIGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA+PC9wLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmRheVJhbmdlXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNsYXNzPVwiY2FsZW5kYXItcmFuZ2UtYnRuIGNhbGVuZGFyLW5leHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dOZXh0KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgbGFiZWw9XCI+PlwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwhLS0gTmV4dCB7e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgfX0gPj5cIiAtLT5cbiAgICAgICAgICA8IS0tIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogZ2xvYmFsRmlsdGVyLmNvbG9yID8gZ2xvYmFsRmlsdGVyLmNvbG9yIDogJyd9XCIgLS0+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPCEtLSB0b2RheUJ1dHRvblN0eWxlQ2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgY2xlYXJCdXR0b25TdHlsZUNsYXNzPVwibWwtYXV0b1wiIC0tPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZmlsdGVyaW5nXCI+XG4gICAgICAgICAgICAgIDxzZS1maWx0ZXItbWVudSBbZ2xvYmFsRmlsdGVyXT1cImdsb2JhbEZpbHRlclwiPjwvc2UtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBOdW1lcmljIFJhbmdlIGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTlVNRVJJQ19SQU5HRVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW5vd3JhcCBhbGlnbi1pdGVtcy1jZW50ZXIgbXItMlwiPlxuICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdsb2JhbEZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8gPyBnbG9iYWxGaWx0ZXIuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8gOiAnMicgOiAnMCdcIlxuICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVGcm9tKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVGcm9tKGdsb2JhbEZpbHRlcix0cnVlKVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJ2ZsZXgtZ3Jvdy0xICBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvLW51bWVyaWMgbXItMlwiPlRvPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgIFtzaG93QnV0dG9uc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlVHdvXCJcbiAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdsb2JhbEZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8gPyBnbG9iYWxGaWx0ZXIuZm9ybWF0Py5mb3JtYXRQYXJhbXM/LmRpZ2l0c0luZm8gOiAnMicgOiAnMCdcIlxuICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJ2ZsZXgtZ3Jvdy0xIG1yLTIgZ3Jvdy0xIGlucHV0LW51bWJlcidcIlxuICAgICAgICAgICAgICAob25CbHVyKT1cInNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBNdWx0aVNlbGVjdCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLk1VTFRJU0VMRUNUXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImdsb2JhbEZpbHRlci5kYXRhXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG5cbiAgICAgICAgIDwhLS0gU2VsZWN0IEJ1dHRvbiBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLlNFTEVDVEJVVFRPTlwiXG5cbiAgICAgICAgPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8cC1zZWxlY3RCdXR0b25cbiAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgW211bHRpcGxlXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5U3R5bGVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgXG4gICAgICAgID5cbiAgICAgICAgPCEtLSA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPlxuICAgICAgICAgIDxpIFtjbGFzc109XCJpdGVtLmljb25cIj48L2k+XG4gICAgICA8L25nLXRlbXBsYXRlPiAtLT5cbiAgICAgIDwvcC1zZWxlY3RCdXR0b24+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuXG5cbiAgICAgIDwhLS0gTG9va3VwIENvbnRyb2wgRmllbGQgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTE9PS1VQX0lOUFVUXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICBbaWRdPVwiZ2xvYmFsRmlsdGVyLmZpZWxkXCJcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdsb2JhbEZpbHRlcj8udmFsdWVUd28/LnRleHQgPyBnbG9iYWxGaWx0ZXIudmFsdWVUd28udGV4dCA6IGdsb2JhbEZpbHRlci52YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cImdsb2JhbEZpbHRlcj8udmFsdWVUd28/LnRleHQgPyBnbG9iYWxGaWx0ZXIudmFsdWVUd28udGV4dCA6IGdsb2JhbEZpbHRlci52YWx1ZSA9ICRldmVudFwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2xvYmFsRmlsdGVyLmZpZWxkXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGtleXVwLlRhYik9XCJzZWxlY3RMb29rdXBGaWVsZChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgKGtleXVwLmJhY2tzcGFjZSk9XCJyZW1vdmVOdWxsTG9va3VwKCRldmVudCwgZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGxvb2t1cC1pbnB1dFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZy1yaWdodDogNDhweDtcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnZhbHVlIHx8IGdsb2JhbEZpbHRlcj8udmFsdWVUd28/LnRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXIpO29uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXJcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDE1cHg7IGJhY2tncm91bmQ6IG5vbmU7IGJvcmRlcjogbm9uZTsgY29sb3I6ICM5OTk7IGN1cnNvcjogcG9pbnRlcjsgcGFkZGluZzogMCAycHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyB6LWluZGV4OiAxMDtcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXRpbWVzXCIgc3R5bGU9XCJmb250LXNpemU6IDE0cHg7XCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgbG9va3VwLWlucHV0LWljb24gZ2xvYmFsLWZpbHRlclwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogOHB4O1wiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiA+XG4gICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0gPHNwYW4+XG4gIDxpICBpY29uPVwicGkgcGktdGltZXNcIj48L2k+XG48L3NwYW4+IC0tPlxuXG48IS0tIEFwcGx5IGJ1dHRvbiAtLT5cblxuPGJ1dHRvblxucEJ1dHRvblxuKm5nSWY9XCIhZ3JpZFVwZGF0ZVwiXG50eXBlPVwiYnV0dG9uXCJcbmljb249XCJwaSBwaS1zZWFyY2hcIlxuW2lkXT1cInNlYXJjaGJ0bklkXCJcbihjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiXG5jbGFzcz1cImdsb2JhbC1zZWFyY2ggYWxpZ24tZ2xvYmFsRmlsdGVyLWJ0biBnbG9iYWwtYnRuIGhpZGUtZmlsdGVyLWJ1dHRvblwiXG4+PC9idXR0b24+XG5cbjwhLS0gQ2xvc2UgYnV0dG9uIC0tPlxuPGJ1dHRvblxucEJ1dHRvblxuKm5nSWY9XCIhZ3JpZFVwZGF0ZVwiXG5pZD1cImNsZWFyR2xvYmFsRmlsdGVyQnRuXCJcbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXJlcGxheVwiXG4oY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIlxuY2xhc3M9XCJoaWRlLWZpbHRlci1idXR0b25cIlxuPjwvYnV0dG9uPlxuIl19
|
|
682
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFrQixRQUFRLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUosT0FBTyxFQUVMLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsU0FBUyxFQUNULGdCQUFnQixFQUNoQix1QkFBdUIsR0FDeEIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPaEQsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQyxJQUFhLGNBQWMsQ0FBQyxHQUFRLElBQUksSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFBQyxRQUFRLENBQUE7SUFBQyxDQUFDLENBQUMsQ0FBQztJQWlCeEUsWUFDUyxRQUFrQixFQUNOLEdBQXFCLEVBQ3JCLE1BQTJCLEVBQ3RDLFdBQXdCLEVBQ3pCLGFBQTRCLEVBQzNCLEVBQWMsRUFDZCxNQUFjLEVBQ2QsZUFBZ0MsRUFDaEMsR0FBc0I7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QUNELGFBQWEsQ0FBQyxZQUFpQjtRQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQ25ELEdBQUcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUN6QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUNELGVBQWUsQ0FBQyxZQUEyQixFQUFFLEtBQVU7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QixZQUFZLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzNGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7a0lBcHRCVSx1QkFBdUI7c0hBQXZCLHVCQUF1Qiw0Y0N0QnBDLDRvdkJBMGdCQTs7NEZEcGZhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxtQkFBbUI7OzBCQStCMUIsUUFBUTs7MEJBQ1IsUUFBUTsyTUEzQmlCLFVBQVU7c0JBQXJDLFNBQVM7dUJBQUMsZUFBZTtnQkFDakIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNNLGNBQWM7c0JBQTFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7XG4gIElHbG9iYWxGaWx0ZXIsXG4gIEdyaWRGaWx0ZXJDb250cm9sVHlwZSxcbiAgRUdyaWRDb2x1bW5UeXBlLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG4gIEVHbG9iYWxGaWx0ZXJGb3JtYXRUeXBlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBHcmlkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2dyaWQuc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjdXJyZW50VXJsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZHJvcGRvd24uc2VydmljZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJqZWN0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ2xvYmFsLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZUdsb2JhbEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXInKSBkYXRlUGlja2VyOiBhbnk7XG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlcnM6IElHbG9iYWxGaWx0ZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzZWFyY2hHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xlYXJHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ3JpZFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgZmlsdGVyc0FwcGxpZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdXBkYXRlVmFsdWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKSBzZXQgYWN0aXZlVGVzdE1vZGUodmFsOiBhbnkpIHsgaWYgKHZhbCA9PT0gdHJ1ZSkgeyBkZWJ1Z2dlciB9IH1cbiAgcHVibGljIGZpdGVyVHlwZXMgPSBHcmlkRmlsdGVyQ29udHJvbFR5cGU7XG4gIHB1YmxpYyBjb2x1bW5UeXBlID0gRUdyaWRDb2x1bW5UeXBlO1xuICBwdWJsaWMgc2hvd0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2V0RmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGRhdGVSYW5nZVZhbHVlOiBhbnk7XG4gIHB1YmxpYyBzdGFydERhdGU6IERhdGU7XG4gIHB1YmxpYyBlbmREYXRlOiBEYXRlO1xuICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBhcHBseUZpbHRlciQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBmaWx0ZXJTdWJJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNob3dJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXI6IGFueSA9ICcnO1xuICBoaWRlQ2xlYXJGaWx0ZXJCdG46IGJvb2xlYW4gPSB0cnVlO1xuICBjYWxlbmRhckZvcm1hdDogc3RyaW5nID0gJ21tL2RkL3l5JztcbiAgc2VhcmNoYnRuSWQgPSAnc2VhcmNoR2xvYmFsRmlsdGVyQnRuJztcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGVwaXBlOiBEYXRlUGlwZSxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcmVmOiBEeW5hbWljRGlhbG9nUmVmLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbm1lbnQgb2Ygc2VsZWN0ZWQgY29sdW1ucyBvbiBwYWdlIGxvYWRcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5kYXRhKSB7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSB0aGlzLmNvbmZpZy5kYXRhLm9wZW5EaWFsb2c7XG4gICAgICBpZiAodGhpcy5jb25maWcuZGF0YS5nbG9iYWxGaWx0ZXJzKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycyA9IHRoaXMuY29uZmlnPy5kYXRhLmdsb2JhbEZpbHRlcnMgYXMgSUdsb2JhbEZpbHRlcltdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5ncmlkU2VydmljZS5nZXROdW1iZXJPZkNhbGxzKCkgPT09IDEpIHtcbiAgICAgIHRoaXMuc2VhcmNoYnRuSWQgPSAnc2VhcmNoR2xvYmFsRmlsdGVyQnRuJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2hidG5JZCA9IGBGaWx0ZXJfJHtjdXJyZW50VXJsKCl9XyR7dGhpcy5ncmlkU2VydmljZS5nZXROdW1iZXJPZkNhbGxzKCl9YFxuICAgIH1cbiAgfVxuXG4gIHNldERhdGVSYW5nZUZpbHRlclZhbHVlKGRhdGVSYW5nZSkge1xuICAgIGlmIChkYXRlUmFuZ2U/LnZhbHVlPy5sZW5ndGggPiAxKSB7XG4gICAgICBkYXRlUmFuZ2UudmFsdWVbMF0gPSBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMF0pO1xuICAgICAgZGF0ZVJhbmdlLnZhbHVlWzFdID0gZGF0ZVJhbmdlLnZhbHVlWzFdID09IG51bGwgPyBkYXRlUmFuZ2UudmFsdWVbMF0gOiBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMV0pO1xuICAgICAgLy8gZGF0ZVJhbmdlLnZhbHVlWzFdID0gbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlWzFdKTtcbiAgICAgIHRoaXMuc2VsZWN0RGF0ZShkYXRlUmFuZ2UsIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlVmFsdWUpIHtcbiAgICAgICAgbGV0IGRhdGVSYW5nZVZhbHVlID0gdGhpcy5kYXRlUmFuZ2VWYWx1ZT8uaW5jbHVkZXMoJy0nKSA/IHRoaXMuZGF0ZVJhbmdlVmFsdWU/LnNwbGl0KCctJykgOiBbdGhpcy5kYXRlUmFuZ2VWYWx1ZV07XG4gICAgICAgIGlmIChkYXRlUmFuZ2VWYWx1ZS5sZW5ndGggPT0gMiAmJiAoZGF0ZVJhbmdlVmFsdWVbMF0udHJpbSgpID09IGRhdGVSYW5nZVZhbHVlWzFdLnRyaW0oKSkpIHtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbXVxuICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZVswXSA9IG5ldyBEYXRlKGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGVSYW5nZVZhbHVlPy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgIGNvbnN0IHNpbmdsZURhdGUgPSBuZXcgRGF0ZShkYXRlUmFuZ2VWYWx1ZVswXS50cmltKCkpO1xuICAgICAgICAgIGlmICghaXNOYU4oc2luZ2xlRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbc2luZ2xlRGF0ZSwgc2luZ2xlRGF0ZV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpbHRlcmVkT3B0aW9ucyhnbG9iYWxGaWx0ZXIpIHtcbiAgICByZXR1cm4gZ2xvYmFsRmlsdGVyLmZpbHRlcmVkT3B0aW9ucz8ubGVuZ3RoID4gMCAmJiAhZ2xvYmFsRmlsdGVyLmFsbG93U2VhcmNoXG4gICAgICA/IGdsb2JhbEZpbHRlci5maWx0ZXJlZE9wdGlvbnMgOiBnbG9iYWxGaWx0ZXIuZGF0YSA/IGdsb2JhbEZpbHRlci5kYXRhIDogW107XG4gIH1cblxuICBjb250YWluc1doaXRlc3BhY2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5pbmNsdWRlcygnICcpO1xuICB9XG5cbiAgYWRkU3BhY2VzYXRmaXJzdCh4KSB7XG4gICAgcmV0dXJuIFwiIFwiICsgeDtcbiAgfVxuXG4gIGFkZFNwYWNlc2F0bGFzdCh4KSB7XG4gICAgcmV0dXJuIHggKyBcIiBcIlxuICB9XG5cbiAgLy8gY2hhbmdlIGNhbGVuZGFyIGZvcm1hdCBvbiBydW4gdGltZSBpZiB1c2VyIHR5cGUgZGF0ZSBvbiB0aGUgY2FsZW5kYXIgZmllbGQuXG4gIGNhbGVuZGFyRm9jdXNFdmVudChnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGV2ZW50PzogYW55KSB7XG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQpWzBdO1xuXG4gICAgaWYgKGlucHV0RWxlbWVudCkge1xuICAgICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBpZiAoYS5rZXkgPT09ICdUYWInIHx8IGEua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IChhLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU/LnRyaW0oKTtcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSAmJiAhaW5wdXRWYWx1ZS5pbmNsdWRlcygnLScpKSB7XG4gICAgICAgICAgICBjb25zdCBzaW5nbGVEYXRlID0gbmV3IERhdGUoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKHNpbmdsZURhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPSBbc2luZ2xlRGF0ZSwgc2luZ2xlRGF0ZV07XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoYTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBsZXQgeWVhciA9IChhLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICAgIHllYXIgPSB5ZWFyPy50b1N0cmluZygpLnNwbGl0KCcgJylbMF07XG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlVmFsdWUgPSAoYS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LnZhbHVlO1xuICAgICAgICBsZXQgZGF0ZVJhbmdlVmFsdWUgPSB0aGlzLmRhdGVSYW5nZVZhbHVlLmluY2x1ZGVzKCctJykgPyB0aGlzLmRhdGVSYW5nZVZhbHVlLnNwbGl0KCctJykgOiAnJztcblxuICAgICAgICAvLyBBZGRpbmcgc3BhY2UgYmV0d2VlbiBmcm9tIGFuZCB0byBkYXRlIGluIGRhdGUgcmFuZ2UgZmlsdGVyXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVsxXS5zcGxpdCgnLycpLmxlbmd0aCA9PT0gMyAmJlxuICAgICAgICAgICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMF0pIHx8ICF0aGlzLmNvbnRhaW5zV2hpdGVzcGFjZShkYXRlUmFuZ2VWYWx1ZVsxXSkpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMF0pKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVswXSA9IHRoaXMuYWRkU3BhY2VzYXRsYXN0KGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5zV2hpdGVzcGFjZShkYXRlUmFuZ2VWYWx1ZVsxXSkpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVZhbHVlWzFdID0gdGhpcy5hZGRTcGFjZXNhdGZpcnN0KGRhdGVSYW5nZVZhbHVlWzFdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgKGEudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gYCR7ZGF0ZVJhbmdlVmFsdWVbMF19LSR7ZGF0ZVJhbmdlVmFsdWVbMV19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh5ZWFyPy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3l5JztcbiAgICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DQUxFTkRBUikge1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlID0gbmV3IERhdGUoKGEudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKS50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1VU1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeWVhcj8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jYWxlbmRhckZvcm1hdCA9ICdtbS9kZC95JztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgeWVhclZhbHVlID0gZXZlbnQ/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbNF07XG4gICAgICBpZiAoKCFnbG9iYWxGaWx0ZXIudmFsdWUgfHwgeWVhclZhbHVlID09IHVuZGVmaW5lZCB8fCB5ZWFyVmFsdWU/LnRvU3RyaW5nKCk/Lmxlbmd0aCA9PT0gMSkgJiYgZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKSB7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2hlY2tJZkZpbHRlclJlcXVpcmVkKGZpbHRlcjogSUdsb2JhbEZpbHRlcikge1xuICAgIGlmIChmaWx0ZXIudmFsaWRhdGlvbnM/LmZpbmQodmFsaWRhdGlvbiA9PiB2YWxpZGF0aW9uLnR5cGUgPT09IEVGaWx0ZXJWYWxpZGF0b3IuUkVRVUlSRUQpKSB7XG4gICAgICBmaWx0ZXIucmVxdWlyZWRGaWVsZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGNoZWNrRmlsdGVyVmFsaWRhdGlvbihyZW1vdmVFcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgbGV0IHZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVycyAmJiB0aGlzLmdsb2JhbEZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLnZhbGlkYXRpb25zICYmIGZpbHRlci52YWxpZGF0aW9ucy5sZW5ndGggPiAwICYmIGZpbHRlci52YWxpZGF0aW9uc1swXS50eXBlID09PSBFRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEICYmICFmaWx0ZXIudmFsdWUgJiYgIXJlbW92ZUVycm9yKSB7XG4gICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGZpbHRlci5lcnJvck1lc3NhZ2UgPSBmaWx0ZXIuZGlzcGxheVRleHQgKyBcIiBpcyByZXF1aXJlZFwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlci5lcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrSWZGaWx0ZXJSZXF1aXJlZChmaWx0ZXIpO1xuICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiAoZmlsdGVyLmhpZGRlbiA9PT0gZmFsc2UgfHwgZmlsdGVyLmhpZGRlbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBzZXQgQnkgRGVmYXVsdCBDYWxlbmRhciBSYW5nZVxuICAgIC8vdGhpcy5zZXREZWZhdWx0Q2FsZW5kYXJSYW5nZShmYWxzZSk7XG4gICAgY29uc3QgZ2lyZENsZWFyRmlsdGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJ1xuICAgICk7XG4gICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bikge1xuICAgICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbicpKSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBzcGxpdGluZyBkYXRlIHJhbmdlIHZhbHVlIGFuZCBhc3NpZ24gdG8gdmFsdWUgYW5kIHZhbHVlVHdvIGluIERhdGVfUmFuZ2UgQ29udHJvbFxuICAgIGNvbnN0IGRhdGVSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKTtcbiAgICBkYXRlUmFuZ2VGaWx0ZXI/LmZvckVhY2goKGRhdGVSYW5nZSkgPT4ge1xuICAgICAgaWYgKGRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gZGF0ZVJhbmdlLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGVSYW5nZS52YWx1ZSA6IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXRlUmFuZ2UudmFsdWVUd28gaW5zdGFuY2VvZiBEYXRlID8gZGF0ZVJhbmdlLnZhbHVlVHdvIDogbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlVHdvKTtcbiAgICAgICAgZGF0ZVJhbmdlLnZhbHVlID0gW3N0YXJ0RGF0ZSwgZW5kRGF0ZV07XG4gICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZGF0ZVJhbmdlKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0ZVJhbmdlLnZhbHVlICYmICFkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZGF0ZVJhbmdlLmZyb21GaWVsZCwgZGF0ZVJhbmdlLnZhbHVlLCAnZ3RlJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkYXRlUmFuZ2UudmFsdWUgJiYgZGF0ZVJhbmdlLnZhbHVlVHdvKSB7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGRhdGVSYW5nZS5mcm9tRmllbGQsIGRhdGVSYW5nZS52YWx1ZVR3bywgJ2d0ZScpO1xuICAgICAgfVxuICAgIH0pXG4gICAgLy8gRmlsdHJpbmcgTnVtZXJpYyBSYW5nZSBjb250cm9scyBvbiBnbG9iYWwgZmlsdGVyIFxuICAgIGNvbnN0IG51bWVyUmFuZ2VGaWx0ZXIgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuTlVNRVJJQ19SQU5HRSk7XG4gICAgbnVtZXJSYW5nZUZpbHRlci5mb3JFYWNoKChudW1lcmljUmFuZ2UpID0+IHtcbiAgICAgIGlmIChudW1lcmljUmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20obnVtZXJpY1JhbmdlKTtcbiAgICAgICAgdGhpcy5zZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhudW1lcmljUmFuZ2UpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoZ2xvYmFsRmlsdGVyLnRvRmllbGQpIHtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLCBnbG9iYWxGaWx0ZXIudmFsdWVUd28sICdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZiAoc2VuZFJlcXVlc3QpIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgbWF0Y2hTYW1lRmllbGRzKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wZXJhdG9yOiBzdHJpbmcsIG51bWVyUmFuZ2VGaWx0ZXI6IGFueSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuZ3JpZFVwZGF0ZSkgcmV0dXJuO1xuXG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBpZiAobnVtZXJSYW5nZUZpbHRlciAmJiBudW1lclJhbmdlRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyAmJiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBkaWdpdEluZm8gPSBudW1lclJhbmdlRmlsdGVyPy5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbztcbiAgICAgICAgaWYgKGRpZ2l0SW5mbykge1xuICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk/LnRvRml4ZWQoZGlnaXRJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcikgPT4gZmllbGQgPT09IGZpbHRlci5maWVsZCk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnNbaW5kZXhdID0geyBmaWVsZDogZmllbGQsIG1hdGNoTW9kZTogJ2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7IGZpZWxkOiBmaWVsZCwgbWF0Y2hNb2RlOiAnYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0TnVtZXJpY1JhbmdlVmFsdWVGcm9tKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCkge1xuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlLCAnZ3RlJywgZ2xvYmFsRmlsdGVyKTtcbiAgICAgIGlmIChzZW5kUmVxdWVzdCkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG4gIHJlbW92ZU51bGxMb29rdXAoZXZlbnQ6IGFueSwgZ2xvYmFsRmlsdGVyOiBhbnkpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC52YWx1ZSkge1xuICAgICAgdGhpcy5sb29rdXBDbGVhclZhbHVlKGdsb2JhbEZpbHRlcik7XG4gICAgfVxuICB9XG4gIGxvb2t1cENsZWFyVmFsdWUoZ2xvYmFsRmlsdGVyOiBhbnkpIHtcbiAgICBpZiAoZ2xvYmFsRmlsdGVyKSB7XG5cbiAgICAgIGdsb2JhbEZpbHRlci52YWx1ZSA/IGdsb2JhbEZpbHRlci52YWx1ZSA9ICcnIDogJydcbiAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVR3byA/IGdsb2JhbEZpbHRlci52YWx1ZVR3byA9ICcnIDogJydcbiAgICAgIC8vIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD9nbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQ9Jyc6JydcbiAgICAgIC8vIGNvbHVtbi5kaXNwbGF5RmllbGQ/cm93W2NvbHVtbi5kaXNwbGF5RmllbGRdID0gJyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dD8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHQ9Jyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGRdID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbHVtbi5maWx0ZXJWYWx1ZSA9ICcnO1xuICAgICAgLy90aGlzLnNldEZpbHRlckZvY3VzT3V0KGNvbHVtbik7XG4gICAgfVxuICAgIC8vIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XG4gICAgLy8gaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xuICAgIC8vICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgICAvLyB9XG4gIH1cblxuICBzZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSwgY2xlYXJWYWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKGdsb2JhbEZpbHRlci52YWx1ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZnJvbURhdGVWYWx1ZSA9IHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWVbMF0sXG4gICAgICAgIGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApO1xuICAgICAgY29uc3QgdG9EYXRlVmFsdWUgPSB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybShcbiAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlWzFdLFxuICAgICAgICBnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKTtcbiAgICAgIGlmIChmcm9tRGF0ZVZhbHVlICYmIHRvRGF0ZVZhbHVlICYmIGdsb2JhbEZpbHRlci5mcm9tRmllbGQgJiYgZ2xvYmFsRmlsdGVyLnRvRmllbGQpIHtcbiAgICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCwgZnJvbURhdGVWYWx1ZSwgJ2d0ZScpO1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgdG9EYXRlVmFsdWUsICdsdGUnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNsZWFyVmFsdWUpIHtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsIG51bGwsICdndGUnKTtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLCBudWxsLCAnbHRlJyk7XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcikge1xuICAgIGlmIChnbG9iYWxGaWx0ZXIudHlwZSA9PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuRFJPUERPV04gJiYgIWdsb2JhbEZpbHRlci52YWx1ZSkge1xuICAgICAgZ2xvYmFsRmlsdGVyLmZpbHRlcmVkT3B0aW9ucyA9IGdsb2JhbEZpbHRlci5kYXRhID8gWy4uLmdsb2JhbEZpbHRlci5kYXRhXSA6IFtdO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsRmlsdGVyICYmIHRoaXMuZ2xvYmFsRmlsdGVycz8ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGdsb2JhbEZpbHRlci5vbkZvY3VzT3V0KSB7XG4gICAgICAgIGdsb2JhbEZpbHRlci5vbkZvY3VzT3V0KGdsb2JhbEZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZ2xvYmFsRmlsdGVyLm9uQ2xpY2spIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyLm9uQ2xpY2soZ2xvYmFsRmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChnbG9iYWxGaWx0ZXIudHlwZSA9PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UpXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgICAgICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclN1YkluaXRpYWxpemVkKSB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJTdWJJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5hcHBseUZpbHRlciQucGlwZShkZWJvdW5jZVRpbWUoMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcih4ID0+IHguZmllbGQpO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXIkLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcikge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVWYWx1ZS5lbWl0KGdsb2JhbEZpbHRlcik7XG4gIH1cblxuICBhcHBseUZpbHRlcnNFdmVudCgpIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZhbHNlO1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKGZpbHRlciA9PiBmaWx0ZXIuZmllbGQpO1xuICAgIGNvbnN0IGRhdGVSYW5nZUluZGV4ID0gZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoXG4gICAgICBmaWx0ZXIgPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRVxuICAgICk7XG4gICAgaWYgKGRhdGVSYW5nZUluZGV4ID4gLTEpIHtcbiAgICAgIC8vIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGRhdGVSYW5nZUluZGV4LCAxKTtcbiAgICAgIC8vIH0pO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gIH1cblxuICBzZXRTZWFyY2hEcm9wZG93bkZpbHRlclZhbHVlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5nbG9iYWxGaWx0ZXJzXG4gICAgICA/LmZpbHRlcigoZ2xvYmFsRmlsdGVyKSA9PiBnbG9iYWxGaWx0ZXIuZmllbGQpXG4gICAgICA/Lm1hcCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGZpbHRlci52YWx1ZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpbHRlclZhbHVlICYmXG4gICAgICAgICAgdHlwZW9mIGZpbHRlclZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuRFJPUERPV05cbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5maWx0ZXIsIHZhbHVlOiBmaWx0ZXJWYWx1ZSB9O1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgc2VsZWN0ZWQgZmlsdGVyc1xuICAgKi9cbiAgYXBwbHlGaWx0ZXJzKGZpbHRlckV2ZW50OiBib29sZWFuID0gdHJ1ZSwgZ2xvYmFsRmlsdGVyOiBhbnkgPSB7fSkge1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkID0gdHJ1ZTtcbiAgICBpZiAoZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKSB7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcik7XG4gICAgfVxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZpbHRlckV2ZW50O1xuICAgIGNvbnN0IHJhd0ZpbHRlcnMgPSB0aGlzLnNldEZpbHRlclxuICAgICAgPyB0aGlzLnNldFNlYXJjaERyb3Bkb3duRmlsdGVyVmFsdWUoKVxuICAgICAgOiB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcblxuICAgIGNvbnN0IGNsb25lZEZpbHRlcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJhd0ZpbHRlcnMpKTtcblxuICAgIC8vIFJlbW92ZSBEQVRFX1JBTkdFIGZpbHRlciBmcm9tIGNsb25lZCBsaXN0XG4gICAgY29uc3QgaW5kZXggPSBjbG9uZWRGaWx0ZXJzLmZpbmRJbmRleChcbiAgICAgIChmaWx0ZXIpID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0VcbiAgICApO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICBjbG9uZWRGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgY2xvbmVkRmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DSEVDS0JPWCAmJlxuICAgICAgICBmaWx0ZXIuZm9ybWF0ID09PSBFR2xvYmFsRmlsdGVyRm9ybWF0VHlwZS5CT09MRUFOX1lOXG4gICAgICApIHtcbiAgICAgICAgaWYgKGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpbHRlci52YWx1ZSA9IGZpbHRlci52YWx1ZSA9PT0gdHJ1ZSA/ICdZJyA6ICdOJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICBpZiAodGhpcy5zaG93RGlhbG9nKSB7XG4gICAgICB0aGlzLnJlZi5jbG9zZShjbG9uZWRGaWx0ZXJzKTtcbiAgICB9IGVsc2VcbiAgICAgIGlmICghdGhpcy5jaGVja0ZpbHRlclZhbGlkYXRpb24oKSkge1xuICAgICAgICB0aGlzLmNoZWNrRmlsdGVyVmFsaWRhdGlvbih0cnVlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGNsb25lZEZpbHRlcnMpO1xuICAgICAgfVxuICB9XG5cbiAgLy8gc2V0IEJ5IERlZmF1bHQgQ2FsZW5kYXIgUmFuZ2UgXG4gIHNldERlZmF1bHRDYWxlbmRhclJhbmdlKGNoZWNrOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlcnMgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSAmJiBmaWx0ZXIuZGF5UmFuZ2UgJiYgZmlsdGVyLnZhbHVlICYmIGZpbHRlci52YWx1ZVR3bykge1xuICAgICAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKSAvLyBFbWl0IG9ubHkgb25jZSB3aGVuIHRoZSB6b25lIGJlY29tZXMgc3RhYmxlXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93TmV4dChmaWx0ZXIsIGNoZWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzaG93TmV4dChmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGNoZWNrOiBib29sZWFuID0gdHJ1ZSk6IERhdGVbXSB7XG4gICAgLy8gbGV0IG5leHRWYWx1ZTogc3RyaW5nO1xuICAgIGxldCBuZXh0VmFsdWU6IERhdGVbXVxuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgIC8vIG5leHRWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgICAgIC8vICBuZXh0VmFsdWUgPSB0aGlzLnNldE1vbnRoRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuWUVBUjpcbiAgICAgICAgLy8gIG5leHRWYWx1ZSA9IHRoaXMuc2V0WWVhckZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlZWtcbiAgICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXRXZWVrRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGZpbHRlci52YWx1ZSA9IG5leHRWYWx1ZVxuICAgICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGZpbHRlcilcbiAgICAgICAgLy9maWx0ZXIudmFsdWVUd289bmV4dFZhbHVlWzFdXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XG4gICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gY2hlY2s7XG4gICAgY29uc3QgZ2xvYmFsRmlsdGVycyA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKHgpID0+IHguZmllbGQpO1xuICAgIGNvbnN0IGluZGV4ID0gZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSlcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAgLy8gbGV0IHRlc3Q9bmV4dFZhbHVlXG4gICAgLy9maWx0ZXIudmFsdWU9bmV4dFZhbHVlXG5cbiAgICByZXR1cm4gbmV4dFZhbHVlO1xuICB9XG5cbiAgc2hvd1ByZXZpb3VzKGZpbHRlcjogSUdsb2JhbEZpbHRlcik6IERhdGVbXSB7XG4gICAgbGV0IHByZXZpb3VzVmFsdWU6IERhdGVbXTtcbiAgICBsZXQgZGF5UmFuZ2U6IEVEYXlSYW5nZSA9IGZpbHRlci5kYXlSYW5nZVxuICAgICAgPyBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgIDogRURheVJhbmdlLldFRUs7XG4gICAgc3dpdGNoIChkYXlSYW5nZSkge1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuREFZOlxuICAgICAgICAvLyBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXREYXlGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgICAgIC8vICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0TW9udGhGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuWUVBUjpcbiAgICAgICAgLy8gIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldFllYXJGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gd2Vla1xuICAgICAgICBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXRXZWVrRmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZmlsdGVyLnZhbHVlID0gcHJldmlvdXNWYWx1ZVxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKVxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IHRydWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UpXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcjogSUdsb2JhbEZpbHRlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChmaWx0ZXIudmFsdWUgPVxuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuc3RhcnREYXRlLFxuICAgICAgICBmaWx0ZXIuZm9ybWF0ID8gZmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKSArXG4gICAgICAnfCcgK1xuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuZW5kRGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkpO1xuICB9XG5cbiAgc2V0RGF0ZVZhbHVlKGZpbHRlcjogYW55KSB7XG4gICAgbGV0IHZhbHVlOiBEYXRlO1xuICAgIGlmIChmaWx0ZXIudmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoZmlsdGVyLnZhbHVlLnNwbGl0KCd8JylbMF0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnNldE1vbnRoKHZhbHVlLmdldE1vbnRoKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF5RmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50RGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxXG4gICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50RGF0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZShcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RGF0ZSgpICsgMVxuICAgICk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDYWxlbmRhclJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKTtcbiAgfVxuXG4gIHNldFllYXJGaWx0ZXIoZmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBpc05leHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBjdXJyZW50RGF0ZSA9IHRoaXMuc2V0RGF0ZVZhbHVlKGZpbHRlcik7XG4gICAgdmFyIGZpcnN0RGF0ZU9mWWVhciA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCkgKyAxLCAwLCAxKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mWWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCkgLSAxLCAwLCAxKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mWWVhcjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLCAxMSwgMzEpO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICBzZXRNb250aEZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcbiAgICB2YXIgZmlyc3REYXRlT2ZNb250aCA9IG5ldyBEYXRlKFxuICAgICAgY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIGN1cnJlbnREYXRlLmdldE1vbnRoKCksXG4gICAgICAxXG4gICAgKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICAgIDFcbiAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCkgLSAxLFxuICAgICAgICAgIDFcbiAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0V2Vla0ZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IERhdGVbXSB7XG4gICAgbGV0IGZpbHRlclZhbHVlOiBEYXRlID0gQXJyYXkuaXNBcnJheShmaWx0ZXIudmFsdWUpID8gZmlsdGVyLnZhbHVlWzBdIDogZmlsdGVyLnZhbHVlXG4gICAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoZmlsdGVyVmFsdWUgPyBmaWx0ZXJWYWx1ZSA6IG5ldyBEYXRlKCkpLy90aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIGxldCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLnNldERhdGUoZmlsdGVyVmFsdWUgPyBjdXJyZW50RGF0ZS5nZXREYXRlKCkgOiBjdXJyZW50RGF0ZS5nZXREYXRlKCkgLSBjdXJyZW50RGF0ZS5nZXREYXkoKSArIDEpKTtcbiAgICBsZXQgd2Vla1NlY29uZHMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBsZXQgdmFsdWU6IERhdGVcbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB2YWx1ZSA9IGZpbHRlclZhbHVlXG4gICAgICBmaWx0ZXIudmFsdWVcbiAgICAgICAgPyB2YWx1ZS5zZXREYXRlKGZpbHRlclZhbHVlLmdldERhdGUoKSArIDcpICAgLy9uZXcgRGF0ZShuZXcgRGF0ZShmaWx0ZXJWYWx1ZSkuZ2V0VGltZSgpICsgd2Vla1NlY29uZHMpXG4gICAgICAgIDogdmFsdWUgPSBuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gZmlsdGVyLnZhbHVlXG4gICAgICAgID8gbmV3IERhdGUoZmlsdGVyVmFsdWUuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG4gICAgICAgIDogbmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG4gICAgfVxuICAgIC8vdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgIC8vIGxldCB2YWx1ZTpEYXRlPWZpbHRlclZhbHVlP1xuICAgIC8vICAgaXNOZXh0P25ldyBEYXRlKGZpbHRlclZhbHVlLmdldFRpbWUoKSArIHdlZWtTZWNvbmRzKTpuZXcgRGF0ZShmaWx0ZXJWYWx1ZS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcyk6XG4gICAgLy8gICBpc05leHQ/bmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpKTpuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcylcblxuICAgIGxldCB2YWx1ZVR3bzogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSArIDYgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICAvLyBjb25zb2xlLmxvZygndGVzdCcsdmFsdWUsJ3Rlc3QyJyx2YWx1ZVR3bylcbiAgICByZXR1cm4gW3ZhbHVlLCB2YWx1ZVR3b11cbiAgICAvL3JldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkXG4gKi9cbiAgc2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcikge1xuXG4gICAgdGhpcy5ncmlkU2VydmljZS5zZXRMb29rVXBGaWx0ZXIoZ2xvYmFsRmlsdGVycywgdGhpcy5kaWFsb2dTZXJ2aWNlLCB0cnVlLCAoKSA9PiB7XG4gICAgICAvLyBXYWl0IGZvciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB0byBjb21wbGV0ZSBiZWZvcmUgYXBwbHlpbmcgZmlsdGVyc1xuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkxPT0tVUF9JTlBVVCAmJiBpdGVtPy52YWx1ZVR3bz8udGV4dCkge1xuICAgICAgICBpdGVtLnZhbHVlVHdvID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGl0ZW0udmFsdWUgPSBudWxsO1xuICAgIH0pXG4gICAgY29uc3QgY2xlYXJHcmlkRmlsdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsZWFyR3JpZEZpbHRlclZhbHVlc0J1dHRvbicpXG4gICAgaWYgKGNsZWFyR3JpZEZpbHRlcikge1xuICAgICAgY2xlYXJHcmlkRmlsdGVyLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICogQ2xlYXIgdmFsdWVzIG9mIERhdGUgUmFuZ2UgRmlsdGVyXG4gICovXG4gIGNsZWFyRGF0ZVJhbmdlVmFsdWUoZmlsdGVyOiBhbnkpIHtcbiAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlKGZpbHRlciwgdHJ1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBkaWFsb2cgd2l0aG91dCBhcHBseWluZyBmaWx0ZXJzXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbGVhckZpbHRlcnMoKTtcbiAgICB0aGlzLnJlZi5jbG9zZSgpO1xuICB9XG4gIHJhbmdlRGF0ZWNsb3NlKGVsZW1lbnQpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXIuaGlkZU92ZXJsYXkoKTtcbiAgICB0aGlzLmRhdGVQaWNrZXIub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGVQaWNrZXIuZGF0ZXBpY2tlckNsaWNrID0gdHJ1ZTtcbiAgICAvLyBjb25zdCBpZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0KTtcbiAgICAvLyBjb25zb2xlLmxvZyhpZCwgIGVsZW1lbnQuZWwubmF0aXZlRWxlbWVudC5maXJzdENoaWxkLmZpcnN0Q2hpbGQpLy9lbGVtZW50LCBpZCAsXG4gICAgLy8gaWQuZm9jdXMoKTtcbiAgICBlbGVtZW50LmVsLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZvY3VzKCk7XG4gICAgdGhpcy5kYXRlUGlja2VyLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kYXRlUGlja2VyLmRhdGVwaWNrZXJDbGljayA9IHRydWU7XG5cbiAgfVxuXG4gIGZpbHRlcklucHV0KCkge1xuICAgIHRoaXMuc2hvd0lucHV0ID0gIXRoaXMuc2hvd0lucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZWQgdGhlIGNhbGVuZGFyIGlucHV0XG4gICAqL1xuICBzZWxlY3REYXRlKGdsb2JhbEZpbHRlcjogYW55LCBmb2N1c2VkOiBib29sZWFuID0gZmFsc2UsIGV2ZW50PzogYW55KSB7XG4gICAgaWYgKGdsb2JhbEZpbHRlci52YWx1ZT8ubGVuZ3RoID4gMSAmJiBnbG9iYWxGaWx0ZXIudmFsdWVbMV0gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICAgIGlmIChmb2N1c2VkID09IHRydWUpIHtcbiAgICAgICAgdGhpcy5yYW5nZURhdGVjbG9zZShldmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmb2N1c2VkKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZmllbGQpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuICB0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcjogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicgKyBnbG9iYWxGaWx0ZXIuZmllbGRcbiAgICApO1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIGNsYXNzTmFtZS5jbGljaygpO1xuICAgIH1cbiAgfVxuICBkcm9wZG93bktleWRvd24oZ2xvYmFsRmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBldmVudDogYW55KSB7XG4gICAgaWYgKCFnbG9iYWxGaWx0ZXIuYWxsb3dTZWFyY2gpIHtcbiAgICAgIGdsb2JhbEZpbHRlci5maWx0ZXJlZE9wdGlvbnMgPSB0aGlzLmRyb3Bkb3duU2VydmljZS5vbkRyb3Bkb3duS2V5ZG93bihldmVudCwgZ2xvYmFsRmlsdGVyKTtcbiAgICAgIHRoaXMuc2V0RmlsdGVyID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1jb21wb25lbnQtd3JhcHBlci1kaXZcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuaGlkZGVuID8gJ2dsb2JhbEZpbHRlckhpZGRlbicgOiBnbG9iYWxGaWx0ZXIuY29sdW1uID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtbiA6ICdjb2wtMydcIlxuICAgICpuZ0Zvcj1cImxldCBnbG9iYWxGaWx0ZXIgb2YgZ2xvYmFsRmlsdGVyc1wiXG4gID5cbiAgICA8ZGl2IFtuZ1N3aXRjaF09XCJnbG9iYWxGaWx0ZXIudHlwZVwiPlxuICAgICAgPCEtLSBDYWxlbmRhciBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICAgIDxwLWRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQ6ICdmbGV4LWdyb3ctMSBncm93LTEgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QtRGF0ZSdcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3REYXRlKGdsb2JhbEZpbHRlciwgdHJ1ZSlcIlxuICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgICAgIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9wLWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZmlsdGVyaW5nXCI+XG4gICAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBDYWxlbmRhciBSYW5nZSAtLT5cbiAgICAgIDwhLS0gPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNBTEVOREFSX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1ByZXZpb3VzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlByZXZpb3VzIHt7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICAgIH19IDw8XCIgXG4gICAgICAgICAgICA+IC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwhLS0gPC9idXR0b24+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucHJlZml4PT09dHJ1ZSB8fCBnbG9iYWxGaWx0ZXIucHJlZml4PT09dW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgICAge3sgIGdsb2JhbEZpbHRlci5sYWJlbFRleHQgPyBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0IDogJycgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPiAtLT5cbiAgICAgICAgICAgICAgPCEtLSB7e1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgIDogKGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB0b1xuICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgIGVuZERhdGVcbiAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICA6IChnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5JylcbiAgICAgICAgICAgICAgfX0gLS0+XG4gICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucHJlZml4PT09ZmFsc2VcIj5cbiAgICAgICAgICAgICAgICB7eyBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0ID8gZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA6ICcnfX1cbiAgICAgICAgICAgICAgPC9zcGFuPjwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dOZXh0KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBsYWJlbD1cIk5leHQge3tcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICAgICAgfX0gPj5cIlxuICAgICAgICAgICAgPiAtLT5cbiAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgICA8IS0tIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+IC0tPlxuXG4gICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIiAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5DSEVDS0JPWFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NzaWJsZS1idWxrLXVwZGF0ZS1pbnB1dC13cmFwcGVyLWRpdlwiPlxuICAgICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknOiAnZmxleCBhbGlnbi1pdGVtcy1jZW50ZXInXCJcbiAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgID48L3AtY2hlY2tib3g+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBTcGFjZXIgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuU1BBQ0VSXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBbY2xhc3NdPVwiXG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuY29sdW1uXG4gICAgICAgICAgICAgICAgPyAnY29sLScgKyBnbG9iYWxGaWx0ZXIuY29sdW1uXG4gICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBEcm9wZG93biBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuRFJPUERPV05cIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NzaWJsZS1idWxrLXVwZGF0ZS1pbnB1dC13cmFwcGVyLWRpdlwiPlxuICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmZpZWxkXCJcbiAgICAgICAgICAgICAgKGtleXVwLlRhYik9XCJ0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0RmlsdGVyZWRPcHRpb25zKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiZ2xvYmFsRmlsdGVyLm9wdGlvbkxhYmVsXCJcbiAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImdsb2JhbEZpbHRlci5vcHRpb25WYWx1ZVwiXG4gICAgICAgICAgICAgIFtmaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyLmFsbG93U2VhcmNoXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwiZHJvcGRvd25LZXlkb3duKGdsb2JhbEZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZ2xvYmFsRmlsdGVyLnZhbHVlID4gMCA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgICAgICAgIGZpbHRlck1hdGNoTW9kZT1cInN0YXJ0c1dpdGhcIlxuICAgICAgICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuSU5QVVRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWNJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTlVNRVJJQ0lOUFVUXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW5vd3JhcCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCIgPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG4gICAgICBcbiAgICAgIDwhLS0gRGF0ZSBSYW5nZSBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuREFURV9SQU5HRVwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcmFuZ2UtY2FsZW5kYXIgZ2FwLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZGF5UmFuZ2VcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLXJhbmdlLWJ0biAgY2FsZW5kYXItcHJldmlvdXNcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1ByZXZpb3VzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBsYWJlbD1cIjw8XCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgICAgPHAtZGF0ZXBpY2tlciBcbiAgICAgICAgICAgICNyYW5nZUNhbGVuZGFyXG4gICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtpbnB1dElkXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgOiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIiBcbiAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU9XCJyYW5nZVwiIFxuICAgICAgICAgICAgW3NlbGVjdE90aGVyTW9udGhzXT1cInRydWVcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3REYXRlKGdsb2JhbEZpbHRlciwgdHJ1ZSwgcmFuZ2VDYWxlbmRhcilcIlxuICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgKG9uQ2xvc2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQ2xpY2tPdXRzaWRlKT1cInNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQmx1cik9XCJzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsZWFyQ2xpY2spPVwiY2xlYXJEYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycyh0cnVlLCBnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgID48L3AtZGF0ZXBpY2tlcj5cblxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImdsb2JhbEZpbHRlci5kYXlSYW5nZVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICBjbGFzcz1cImNhbGVuZGFyLXJhbmdlLWJ0biBjYWxlbmRhci1uZXh0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzaG93TmV4dChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIGxhYmVsPVwiPj5cIlxuICAgICAgICAgID48L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIHRvZGF5QnV0dG9uU3R5bGVDbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICBjbGVhckJ1dHRvblN0eWxlQ2xhc3M9XCJtbC1hdXRvXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWMgUmFuZ2UgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5OVU1FUklDX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgIGdyb3ctMSBpbnB1dC1udW1iZXInXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG8tbnVtZXJpYyBtci0yXCI+VG88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVUd29cIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXIsdHJ1ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTVVMVElTRUxFQ1RcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuU0VMRUNUQlVUVE9OXCJcblxuICAgICAgICA+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YVwiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlTdHlsZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICBcbiAgICAgICAgPlxuICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cbiAgICAgIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG5cblxuICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5MT09LVVBfSU5QVVRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDEwMCU7XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2xvYmFsRmlsdGVyPy52YWx1ZVR3bz8udGV4dCA/IGdsb2JhbEZpbHRlci52YWx1ZVR3by50ZXh0IDogZ2xvYmFsRmlsdGVyLnZhbHVlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZ2xvYmFsRmlsdGVyPy52YWx1ZVR3bz8udGV4dCA/IGdsb2JhbEZpbHRlci52YWx1ZVR3by50ZXh0IDogZ2xvYmFsRmlsdGVyLnZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoa2V5dXAuVGFiKT1cInNlbGVjdExvb2t1cEZpZWxkKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuYmFja3NwYWNlKT1cInJlbW92ZU51bGxMb29rdXAoJGV2ZW50LCBnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nLXJpZ2h0OiA0OHB4O1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJnbG9iYWxGaWx0ZXIudmFsdWUgfHwgZ2xvYmFsRmlsdGVyPy52YWx1ZVR3bz8udGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJsb29rdXBDbGVhclZhbHVlKGdsb2JhbEZpbHRlcik7b25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDbGVhclwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTVweDsgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiBub25lOyBjb2xvcjogIzk5OTsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAwIDJweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHotaW5kZXg6IDEwO1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdGltZXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRweDtcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hldnJvbi1yaWdodCBsb29rdXAtaW5wdXQtaWNvbiBnbG9iYWwtZmlsdGVyXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiA4cHg7XCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8c3Bhbj5cbiAgPGkgIGljb249XCJwaSBwaS10aW1lc1wiPjwvaT5cbjwvc3Bhbj4gLS0+XG5cbjwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuXG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXNlYXJjaFwiXG5baWRdPVwic2VhcmNoYnRuSWRcIlxuKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCJcbmNsYXNzPVwiZ2xvYmFsLXNlYXJjaCBhbGlnbi1nbG9iYWxGaWx0ZXItYnRuIGdsb2JhbC1idG4gaGlkZS1maWx0ZXItYnV0dG9uXCJcbj48L2J1dHRvbj5cblxuPCEtLSBDbG9zZSBidXR0b24gLS0+XG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbmlkPVwiY2xlYXJHbG9iYWxGaWx0ZXJCdG5cIlxudHlwZT1cImJ1dHRvblwiXG5pY29uPVwicGkgcGktcmVwbGF5XCJcbihjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG5jbGFzcz1cImhpZGUtZmlsdGVyLWJ1dHRvblwiXG4+PC9idXR0b24+XG4iXX0=
|