@seniorsistemas/angular-components 18.1.0-feature-sds-276-a92584d0 → 18.1.0-feature-sds-276-e3f599ca
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/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +1 -1
- package/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.d.ts +4 -4
- package/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.d.ts +2 -2
- package/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.d.ts +2 -2
- package/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.d.ts +2 -2
- package/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.d.ts +2 -2
- package/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.d.ts +2 -1
- package/esm2022/custom-fields/lib/custom-fields/custom-fields.component.mjs +5 -5
- package/esm2022/custom-fields/lib/custom-fields/models/custom-field-type.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +14 -14
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/bignumber-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/currency-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/number-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/select-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/text-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +11 -9
- package/esm2022/dynamic-form/public-api.mjs +5 -6
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs +6 -6
- package/fesm2022/seniorsistemas-angular-components-custom-fields.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +27 -26
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -420,13 +420,6 @@ export class LookupComponent {
|
|
|
420
420
|
isFunction(value) {
|
|
421
421
|
return value instanceof Function;
|
|
422
422
|
}
|
|
423
|
-
getIntegerMaskConfig(col) {
|
|
424
|
-
return {
|
|
425
|
-
scale: 0,
|
|
426
|
-
thousandsSeparator: col.numberLocaleOptions?.thousandsSeparator,
|
|
427
|
-
prefix: '',
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
423
|
getDoubleMaskConfig(col) {
|
|
431
424
|
return {
|
|
432
425
|
scale: this.getScale(col.scale),
|
|
@@ -443,6 +436,13 @@ export class LookupComponent {
|
|
|
443
436
|
prefix: col.numberLocaleOptions?.currencySymbol,
|
|
444
437
|
};
|
|
445
438
|
}
|
|
439
|
+
getIntegerMaskConfig(col) {
|
|
440
|
+
return {
|
|
441
|
+
scale: 0,
|
|
442
|
+
thousandsSeparator: col.numberLocaleOptions?.thousandsSeparator,
|
|
443
|
+
prefix: '',
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
446
|
getNumberMaskConfig(col) {
|
|
447
447
|
return {
|
|
448
448
|
scale: this.getScale(col.scale),
|
|
@@ -459,10 +459,10 @@ export class LookupComponent {
|
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
fieldHasMask(field) {
|
|
462
|
-
return (field.type === '
|
|
463
|
-
field.type === '
|
|
464
|
-
field.type === '
|
|
465
|
-
field.type === '
|
|
462
|
+
return (field.type === 'integer' ||
|
|
463
|
+
field.type === 'number' ||
|
|
464
|
+
field.type === 'double' ||
|
|
465
|
+
field.type === 'string' ||
|
|
466
466
|
field.type === 'binary');
|
|
467
467
|
}
|
|
468
468
|
onTableRowDoubleClick(rowData) {
|
|
@@ -510,7 +510,7 @@ export class LookupComponent {
|
|
|
510
510
|
useExisting: forwardRef(() => LookupComponent),
|
|
511
511
|
multi: true,
|
|
512
512
|
},
|
|
513
|
-
], viewQueries: [{ propertyName: "lookupDialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: Table, descendants: true }, { propertyName: "autocomplete", first: true, predicate: AutoComplete, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"onCompleteMethod($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\"\n >\n </p-autoComplete>\n @if (showSearch) {\n <button\n class=\"button-addon\"\n [class.button-addon--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\"\n >\n <i class=\"fa fa-search\"></i>\n </button>\n }\n</div>\n\n<s-dialog\n [(visible)]=\"dialogVisible\"\n (visibleChange)=\"onVisibleChange($event!)\"\n [header]=\"labelOptions?.searchTitle || 'platform.angular_components.advanced_search' | translate\"\n contentClassName=\"s-lookup-modal\"\n [size]=\"dialogFullScreen() ? 'fullscreen' : 'xl'\"\n>\n @if (dialogVisible) {\n <div\n class=\"s-lookup-modal-container\"\n #dialogContainer\n >\n @if (searchFields && searchFields.length) {\n <div\n class=\"filter\"\n [@collapseContent]=\"\n collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\n \"\n (@collapseContent.done)=\"onToggleDone()\"\n >\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\"\n >\n @if (!collapsed) {\n <div\n class=\"form-content\"\n [@childCollapseContent]=\"\n collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\n \"\n >\n <div class=\"filter-title sds-section-title\">\n {{ labelOptions?.filterTitle || 'platform.angular_components.filters' | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [configs]=\"searchFieldsDynamicStructure\"\n [form]=\"formGroupDialog\"\n >\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"\n labelOptions?.filterLabel || 'platform.angular_components.filter'\n | translate\n \"\n (clicked)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"\n labelOptions?.clearLabel || 'platform.angular_components.clear'\n | translate\n \"\n (clicked)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n >\n </s-button>\n </div>\n </div>\n </div>\n }\n </form>\n </div>\n }\n @if (searchFields && searchFields.length) {\n <div class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\"\n >\n <span\n class=\"fa\"\n [ngClass]=\"{ 'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed }\"\n aria-hidden=\"true\"\n >\n </span>\n </button>\n </div>\n }\n @let isEmptyContent = !searchTotalRecords && !loading;\n <div\n class=\"content\"\n #contentContainer\n [ngClass]=\"{ 'empty-content': isEmptyContent }\"\n >\n @if (isEmptyContent) {\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n [title]=\"\n labelOptions?.searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\n \"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\"\n >\n </s-empty-state>\n }\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\"\n *sLoadingState=\"{ loading: loading, indicator: indicatorLogo }\"\n >\n <ng-template pTemplate=\"caption\">\n <div>\n @if (showAddOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (clicked)=\"onAdd.emit()\"\n >\n </s-button>\n }\n @if (showEditOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (clicked)=\"onEdit.emit(this.selected[0])\"\n >\n </s-button>\n }\n @if (showRemoveOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (clicked)=\"onRemove.emit(this.selected)\"\n >\n </s-button>\n }\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"colgroup\"\n let-columns\n >\n <colgroup>\n @if (multiple) {\n <col style=\"width: 50px\" />\n }\n\n @for (col of columns; track $index) {\n <col [style.width]=\"col.width\" />\n }\n </colgroup>\n </ng-template>\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n @if (multiple) {\n <th style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\"\n >\n </s-table-header-checkbox>\n </th>\n }\n @for (col of columns; track $index) {\n <th\n [style.width]=\"col.width\"\n [pSortableColumn]=\"col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled.includes(col.name)\"\n >\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n @if (!sortableColumnsDisabled.includes(col.name)) {\n <p-sortIcon [field]=\"col.name\"> </p-sortIcon>\n }\n </div>\n </th>\n }\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\"\n >\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick\n (onDoubleClick)=\"onTableRowDoubleClick(rowData)\"\n >\n @if (multiple) {\n <td\n style=\"width: 50px\"\n tabindex=\"0\"\n >\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\"\n >\n </p-tableCheckbox>\n </td>\n }\n @for (col of searchGridFields; track $index) {\n <td\n [style.width]=\"getFieldWidth(col)\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\"\n >\n @switch (col.type) {\n @case ('boolean') {\n <ng-container\n *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getBooleanLabel(rowData, col.name, col.optionsLabel)\n }}</span>\n </ng-container>\n }\n @case ('date') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedDate\n : col.calendarLocaleOptions?.dateFormat || 'L'\n | async\n }}</span>\n </ng-container>\n }\n @case ('dateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('localDateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('time') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedTime\n : col.calendarLocaleOptions?.dateFormat || 'LTS'\n | async\n }}</span>\n </ng-container>\n }\n @case ('number') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getIntegerMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('decimal') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getDoubleMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('currency') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getMoneyMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('bigNumber') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getNumberMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('select') {\n <ng-container\n *ngIf=\"\n getLabelForValue(getFieldValue(rowData, col.name), col);\n else emptyTemplate\n \"\n >\n <ng-container\n *ngIf=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col);\n then withBadge;\n else withoutBadge\n \"\n ></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"\n getLabelForValue(getFieldValue(rowData, col.name), col)\n \"\n [color]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.color\n \"\n [type]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.type\n \"\n [iconClass]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconClass\n \"\n [iconPosition]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconPosition\n \"\n >\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span>\n {{\n getLabelForValue(getFieldValue(rowData, col.name), col)\n }}\n </span>\n </ng-template>\n </ng-container>\n }\n @default {\n @if (fieldHasMask(col) && parseValueMaskValue(col, rowData)) {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name)\n \"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | sMaskFormatter: parseValueMaskValue(col, rowData)\n }}</span>\n </ng-container>\n } @else {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name);\n else emptyTemplate\n \"\n >\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n }\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template sTemplate=\"footer\">\n <div class=\"flex w-full justify-end\">\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"labelOptions?.cancelLabel || 'platform.angular_components.cancel' | translate\"\n (clicked)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"labelOptions?.selectLabel || 'platform.angular_components.select' | translate\"\n (clicked)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n [disabled]=\"!selected.length\"\n >\n </s-button>\n </div>\n </ng-template>\n }\n</s-dialog>\n\n<ng-template #emptyTemplate>\n <span class=\"sds-empty-value\">\n {{ labelOptions?.emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n\n", styles: ["s-lookup.ng-dirty.ng-invalid .ui-inputtext{border-color:#c13018}s-lookup .p-autocomplete-input-multiple{border-top-right-radius:0!important;border-bottom-right-radius:0!important}s-lookup .inputgroup p-autocomplete+button,s-lookup p-autocomplete .ui-autocomplete-dropdown.ui-button{background-color:#fff;border-color:#ccc;border-width:1px 1px 1px 0;color:#333;min-height:35px;height:auto!important;min-width:auto;width:35px!important;overflow:hidden;border-radius:0 4px 4px 0}s-lookup p-autocomplete span.ui-autocomplete-multiple,s-lookup .inputgroup{display:flex}s-lookup .inputgroup p-autocomplete{display:inline-block}s-lookup .inputgroup p-autocomplete .p-autocomplete-input{width:100%}s-lookup .inputgroup p-autocomplete+button:enabled:hover,s-lookup .inputgroup p-autocomplete+button:focus{background-color:highlight(#ccc);border-color:#ccc}s-lookup:not(.ng-dirty.ng-invalid) .inputgroup p-autocomplete .ui-widget .ui-inputtext{border-right-width:1px;border-right-style:solid}s-lookup .ui-autocomplete-input-token{width:100%}s-lookup .ui-autocomplete-input-token input{width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token{max-width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .s-lookup-modal.p-dialog .p-dialog-content{padding:0;margin-bottom:0;max-height:none}s-lookup .p-table-scrollable-body{min-width:100%}.s-lookup-modal main{padding:0}.s-lookup-modal .s-lookup-modal-container{height:85vh;display:flex;flex-direction:row;width:100%}.s-lookup-modal .s-lookup-modal-container .filter{width:min-content;height:auto;flex-grow:0;flex-shrink:0;background-color:#e5eaea80;padding:.571rem}.s-lookup-modal .s-lookup-modal-container .filter form{width:100%;height:100%}.s-lookup-modal .s-lookup-modal-container .filter form .form-content{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .filter-title{padding-left:.5rem}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .form-fields{overflow-y:auto}.s-lookup-modal .s-lookup-modal-container .filter-toggle{margin-top:15px;flex-grow:0;flex-shrink:0;width:35px;border-radius:0 4px 4px 0}.s-lookup-modal .s-lookup-modal-container .filter-toggle button{align-items:center;position:relative;background-color:#e5eaea80;height:35px;width:100%;border:1px solid #e5eaea;outline:none;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;text-decoration:none;text-transform:none;padding:7px;transition:background-color .2s ease-out,color .2s ease-out,border-color .2s ease-out}.s-lookup-modal .s-lookup-modal-container .filter-toggle button:hover,.s-lookup-modal .s-lookup-modal-container .filter-toggle button:focus{background-color:active(rgba(229,234,234,.5));border-color:active(#e5eaea)}.s-lookup-modal .s-lookup-modal-container .content{flex-grow:1;flex-basis:auto;overflow-x:auto;display:flex;flex-direction:column;padding:.5rem}.s-lookup-modal .s-lookup-modal-container .content-child{height:100%}.s-lookup-modal .s-lookup-modal-container .content s-loading-state{height:100%;display:block}.s-lookup-modal .s-lookup-modal-container .content .s-loading-state,.s-lookup-modal .s-lookup-modal-container .content .s-loading-state .state-contents{height:100%}.s-lookup-modal .s-lookup-modal-container .content.empty-content{align-self:center}.s-lookup-modal .s-lookup-modal-container .content.empty-content .content-child{display:none}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable .p-datatable-table-container{flex:1;margin-bottom:0}.inputgroup p-autocomplete{width:calc(100% - 35px)}\n"], dependencies: [{ kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i3.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "variant", "fluid"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DialogComponent, selector: "s-dialog", inputs: ["header", "visible", "size", "contentClassName", "escapeOnEsc", "destroyClickOutside"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFormComponent, selector: "s-dynamic-form", inputs: ["id", "configs", "fields", "form", "errorMessages"] }, { kind: "component", type: ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor"], outputs: ["clicked"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: EmptyStateModule }, { kind: "component", type: i6.EmptyStateComponent, selector: "s-empty-state", inputs: ["id", "title", "iconClass", "description", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "secondaryActionLabel", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "ngmodule", type: LoadingStateModule }, { kind: "directive", type: i8.LoadingStateDirective, selector: "[sLoadingState]", inputs: ["sLoadingState"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: LocaleModule }, { kind: "pipe", type: i9.LocalizedDatePipe, name: "localizedDate" }, { kind: "pipe", type: i9.LocalizedTimePipe, name: "localizedTime" }, { kind: "pipe", type: i9.LocalizedBignumberPipe, name: "localizedBignumber" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: BadgeModule }, { kind: "component", type: i10.BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "ngmodule", type: MaskFormatterModule }, { kind: "pipe", type: i11.MaskFormatterPipe, name: "sMaskFormatter" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: TableHeaderCheckboxModule }, { kind: "component", type: i12.TableHeaderCheckboxComponent, selector: "s-table-header-checkbox", inputs: ["id", "disabled", "rowProps", "useAllObject"] }, { kind: "ngmodule", type: TemplateModule }, { kind: "directive", type: i13.TemplateDirective, selector: "[sTemplate]", inputs: ["sTemplate"] }], animations: [
|
|
513
|
+
], viewQueries: [{ propertyName: "lookupDialogContainer", first: true, predicate: ["dialogContainer"], descendants: true, isSignal: true }, { propertyName: "table", first: true, predicate: Table, descendants: true }, { propertyName: "autocomplete", first: true, predicate: AutoComplete, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"onCompleteMethod($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\"\n >\n </p-autoComplete>\n @if (showSearch) {\n <button\n class=\"button-addon\"\n [class.button-addon--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\"\n >\n <i class=\"fa fa-search\"></i>\n </button>\n }\n</div>\n\n<s-dialog\n [(visible)]=\"dialogVisible\"\n (visibleChange)=\"onVisibleChange($event!)\"\n [header]=\"labelOptions?.searchTitle || 'platform.angular_components.advanced_search' | translate\"\n contentClassName=\"s-lookup-modal\"\n [size]=\"dialogFullScreen() ? 'fullscreen' : 'xl'\"\n>\n @if (dialogVisible) {\n <div\n class=\"s-lookup-modal-container\"\n #dialogContainer\n >\n @if (searchFields && searchFields.length) {\n <div\n class=\"filter\"\n [@collapseContent]=\"\n collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\n \"\n (@collapseContent.done)=\"onToggleDone()\"\n >\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\"\n >\n @if (!collapsed) {\n <div\n class=\"form-content\"\n [@childCollapseContent]=\"\n collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\n \"\n >\n <div class=\"filter-title sds-section-title\">\n {{ labelOptions?.filterTitle || 'platform.angular_components.filters' | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [configs]=\"searchFieldsDynamicStructure\"\n [form]=\"formGroupDialog\"\n >\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"\n labelOptions?.filterLabel || 'platform.angular_components.filter'\n | translate\n \"\n (clicked)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"\n labelOptions?.clearLabel || 'platform.angular_components.clear'\n | translate\n \"\n (clicked)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n >\n </s-button>\n </div>\n </div>\n </div>\n }\n </form>\n </div>\n }\n @if (searchFields && searchFields.length) {\n <div class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\"\n >\n <span\n class=\"fa\"\n [ngClass]=\"{ 'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed }\"\n aria-hidden=\"true\"\n >\n </span>\n </button>\n </div>\n }\n @let isEmptyContent = !searchTotalRecords && !loading;\n <div\n class=\"content\"\n #contentContainer\n [ngClass]=\"{ 'empty-content': isEmptyContent }\"\n >\n @if (isEmptyContent) {\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n [title]=\"\n labelOptions?.searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\n \"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\"\n >\n </s-empty-state>\n }\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\"\n *sLoadingState=\"{ loading: loading, indicator: indicatorLogo }\"\n >\n <ng-template pTemplate=\"caption\">\n <div>\n @if (showAddOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (clicked)=\"onAdd.emit()\"\n >\n </s-button>\n }\n @if (showEditOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (clicked)=\"onEdit.emit(this.selected[0])\"\n >\n </s-button>\n }\n @if (showRemoveOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (clicked)=\"onRemove.emit(this.selected)\"\n >\n </s-button>\n }\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"colgroup\"\n let-columns\n >\n <colgroup>\n @if (multiple) {\n <col style=\"width: 50px\" />\n }\n\n @for (col of columns; track $index) {\n <col [style.width]=\"col.width\" />\n }\n </colgroup>\n </ng-template>\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n @if (multiple) {\n <th style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\"\n >\n </s-table-header-checkbox>\n </th>\n }\n @for (col of columns; track $index) {\n <th\n [style.width]=\"col.width\"\n [pSortableColumn]=\"col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled.includes(col.name)\"\n >\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n @if (!sortableColumnsDisabled.includes(col.name)) {\n <p-sortIcon [field]=\"col.name\"> </p-sortIcon>\n }\n </div>\n </th>\n }\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\"\n >\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick\n (onDoubleClick)=\"onTableRowDoubleClick(rowData)\"\n >\n @if (multiple) {\n <td\n style=\"width: 50px\"\n tabindex=\"0\"\n >\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\"\n >\n </p-tableCheckbox>\n </td>\n }\n @for (col of searchGridFields; track $index) {\n <td\n [style.width]=\"getFieldWidth(col)\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\"\n >\n @switch (col.type) {\n @case ('boolean') {\n <ng-container\n *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getBooleanLabel(rowData, col.name, col.optionsLabel)\n }}</span>\n </ng-container>\n }\n @case ('date') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedDate\n : col.calendarLocaleOptions?.dateFormat || 'L'\n | async\n }}</span>\n </ng-container>\n }\n @case ('dateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('localDateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('time') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedTime\n : col.calendarLocaleOptions?.dateFormat || 'LTS'\n | async\n }}</span>\n </ng-container>\n }\n @case ('integer') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getIntegerMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('double') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getDoubleMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('money') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getMoneyMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('number') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getNumberMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('enum') {\n <ng-container\n *ngIf=\"\n getLabelForValue(getFieldValue(rowData, col.name), col);\n else emptyTemplate\n \"\n >\n <ng-container\n *ngIf=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col);\n then withBadge;\n else withoutBadge\n \"\n ></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"\n getLabelForValue(getFieldValue(rowData, col.name), col)\n \"\n [color]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.color\n \"\n [type]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.type\n \"\n [iconClass]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconClass\n \"\n [iconPosition]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconPosition\n \"\n >\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span>\n {{\n getLabelForValue(getFieldValue(rowData, col.name), col)\n }}\n </span>\n </ng-template>\n </ng-container>\n }\n @default {\n @if (fieldHasMask(col) && parseValueMaskValue(col, rowData)) {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name)\n \"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | sMaskFormatter: parseValueMaskValue(col, rowData)\n }}</span>\n </ng-container>\n } @else {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name);\n else emptyTemplate\n \"\n >\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n }\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template sTemplate=\"footer\">\n <div class=\"flex w-full justify-end\">\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"labelOptions?.cancelLabel || 'platform.angular_components.cancel' | translate\"\n (clicked)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"labelOptions?.selectLabel || 'platform.angular_components.select' | translate\"\n (clicked)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n [disabled]=\"!selected.length\"\n >\n </s-button>\n </div>\n </ng-template>\n }\n</s-dialog>\n\n<ng-template #emptyTemplate>\n <span class=\"sds-empty-value\">\n {{ labelOptions?.emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n\n", styles: ["s-lookup.ng-dirty.ng-invalid .ui-inputtext{border-color:#c13018}s-lookup .p-autocomplete-input-multiple{border-top-right-radius:0!important;border-bottom-right-radius:0!important}s-lookup .inputgroup p-autocomplete+button,s-lookup p-autocomplete .ui-autocomplete-dropdown.ui-button{background-color:#fff;border-color:#ccc;border-width:1px 1px 1px 0;color:#333;min-height:35px;height:auto!important;min-width:auto;width:35px!important;overflow:hidden;border-radius:0 4px 4px 0}s-lookup p-autocomplete span.ui-autocomplete-multiple,s-lookup .inputgroup{display:flex}s-lookup .inputgroup p-autocomplete{display:inline-block}s-lookup .inputgroup p-autocomplete .p-autocomplete-input{width:100%}s-lookup .inputgroup p-autocomplete+button:enabled:hover,s-lookup .inputgroup p-autocomplete+button:focus{background-color:highlight(#ccc);border-color:#ccc}s-lookup:not(.ng-dirty.ng-invalid) .inputgroup p-autocomplete .ui-widget .ui-inputtext{border-right-width:1px;border-right-style:solid}s-lookup .ui-autocomplete-input-token{width:100%}s-lookup .ui-autocomplete-input-token input{width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token{max-width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .s-lookup-modal.p-dialog .p-dialog-content{padding:0;margin-bottom:0;max-height:none}s-lookup .p-table-scrollable-body{min-width:100%}.s-lookup-modal main{padding:0}.s-lookup-modal .s-lookup-modal-container{height:85vh;display:flex;flex-direction:row;width:100%}.s-lookup-modal .s-lookup-modal-container .filter{width:min-content;height:auto;flex-grow:0;flex-shrink:0;background-color:#e5eaea80;padding:.571rem}.s-lookup-modal .s-lookup-modal-container .filter form{width:100%;height:100%}.s-lookup-modal .s-lookup-modal-container .filter form .form-content{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .filter-title{padding-left:.5rem}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .form-fields{overflow-y:auto}.s-lookup-modal .s-lookup-modal-container .filter-toggle{margin-top:15px;flex-grow:0;flex-shrink:0;width:35px;border-radius:0 4px 4px 0}.s-lookup-modal .s-lookup-modal-container .filter-toggle button{align-items:center;position:relative;background-color:#e5eaea80;height:35px;width:100%;border:1px solid #e5eaea;outline:none;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;text-decoration:none;text-transform:none;padding:7px;transition:background-color .2s ease-out,color .2s ease-out,border-color .2s ease-out}.s-lookup-modal .s-lookup-modal-container .filter-toggle button:hover,.s-lookup-modal .s-lookup-modal-container .filter-toggle button:focus{background-color:active(rgba(229,234,234,.5));border-color:active(#e5eaea)}.s-lookup-modal .s-lookup-modal-container .content{flex-grow:1;flex-basis:auto;overflow-x:auto;display:flex;flex-direction:column;padding:.5rem}.s-lookup-modal .s-lookup-modal-container .content-child{height:100%}.s-lookup-modal .s-lookup-modal-container .content s-loading-state{height:100%;display:block}.s-lookup-modal .s-lookup-modal-container .content .s-loading-state,.s-lookup-modal .s-lookup-modal-container .content .s-loading-state .state-contents{height:100%}.s-lookup-modal .s-lookup-modal-container .content.empty-content{align-self:center}.s-lookup-modal .s-lookup-modal-container .content.empty-content .content-child{display:none}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable .p-datatable-table-container{flex:1;margin-bottom:0}.inputgroup p-autocomplete{width:calc(100% - 35px)}\n"], dependencies: [{ kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i3.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "variant", "fluid"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DialogComponent, selector: "s-dialog", inputs: ["header", "visible", "size", "contentClassName", "escapeOnEsc", "destroyClickOutside"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFormComponent, selector: "s-dynamic-form", inputs: ["id", "configs", "fields", "form", "errorMessages"] }, { kind: "component", type: ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor"], outputs: ["clicked"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: EmptyStateModule }, { kind: "component", type: i6.EmptyStateComponent, selector: "s-empty-state", inputs: ["id", "title", "iconClass", "description", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "secondaryActionLabel", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i7.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i7.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i7.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "component", type: i7.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i7.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "ngmodule", type: LoadingStateModule }, { kind: "directive", type: i8.LoadingStateDirective, selector: "[sLoadingState]", inputs: ["sLoadingState"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: LocaleModule }, { kind: "pipe", type: i9.LocalizedDatePipe, name: "localizedDate" }, { kind: "pipe", type: i9.LocalizedTimePipe, name: "localizedTime" }, { kind: "pipe", type: i9.LocalizedBignumberPipe, name: "localizedBignumber" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: BadgeModule }, { kind: "component", type: i10.BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "ngmodule", type: MaskFormatterModule }, { kind: "pipe", type: i11.MaskFormatterPipe, name: "sMaskFormatter" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: TableHeaderCheckboxModule }, { kind: "component", type: i12.TableHeaderCheckboxComponent, selector: "s-table-header-checkbox", inputs: ["id", "disabled", "rowProps", "useAllObject"] }, { kind: "ngmodule", type: TemplateModule }, { kind: "directive", type: i13.TemplateDirective, selector: "[sTemplate]", inputs: ["sTemplate"] }], animations: [
|
|
514
514
|
trigger('collapseContent', [
|
|
515
515
|
state('hidden', style({
|
|
516
516
|
width: '10px',
|
|
@@ -587,7 +587,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
587
587
|
})),
|
|
588
588
|
transition('* <=> *', animate('{{transitionParams}}')),
|
|
589
589
|
]),
|
|
590
|
-
], template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"onCompleteMethod($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\"\n >\n </p-autoComplete>\n @if (showSearch) {\n <button\n class=\"button-addon\"\n [class.button-addon--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\"\n >\n <i class=\"fa fa-search\"></i>\n </button>\n }\n</div>\n\n<s-dialog\n [(visible)]=\"dialogVisible\"\n (visibleChange)=\"onVisibleChange($event!)\"\n [header]=\"labelOptions?.searchTitle || 'platform.angular_components.advanced_search' | translate\"\n contentClassName=\"s-lookup-modal\"\n [size]=\"dialogFullScreen() ? 'fullscreen' : 'xl'\"\n>\n @if (dialogVisible) {\n <div\n class=\"s-lookup-modal-container\"\n #dialogContainer\n >\n @if (searchFields && searchFields.length) {\n <div\n class=\"filter\"\n [@collapseContent]=\"\n collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\n \"\n (@collapseContent.done)=\"onToggleDone()\"\n >\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\"\n >\n @if (!collapsed) {\n <div\n class=\"form-content\"\n [@childCollapseContent]=\"\n collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\n \"\n >\n <div class=\"filter-title sds-section-title\">\n {{ labelOptions?.filterTitle || 'platform.angular_components.filters' | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [configs]=\"searchFieldsDynamicStructure\"\n [form]=\"formGroupDialog\"\n >\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"\n labelOptions?.filterLabel || 'platform.angular_components.filter'\n | translate\n \"\n (clicked)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"\n labelOptions?.clearLabel || 'platform.angular_components.clear'\n | translate\n \"\n (clicked)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n >\n </s-button>\n </div>\n </div>\n </div>\n }\n </form>\n </div>\n }\n @if (searchFields && searchFields.length) {\n <div class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\"\n >\n <span\n class=\"fa\"\n [ngClass]=\"{ 'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed }\"\n aria-hidden=\"true\"\n >\n </span>\n </button>\n </div>\n }\n @let isEmptyContent = !searchTotalRecords && !loading;\n <div\n class=\"content\"\n #contentContainer\n [ngClass]=\"{ 'empty-content': isEmptyContent }\"\n >\n @if (isEmptyContent) {\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n [title]=\"\n labelOptions?.searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\n \"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\"\n >\n </s-empty-state>\n }\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\"\n *sLoadingState=\"{ loading: loading, indicator: indicatorLogo }\"\n >\n <ng-template pTemplate=\"caption\">\n <div>\n @if (showAddOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (clicked)=\"onAdd.emit()\"\n >\n </s-button>\n }\n @if (showEditOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (clicked)=\"onEdit.emit(this.selected[0])\"\n >\n </s-button>\n }\n @if (showRemoveOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (clicked)=\"onRemove.emit(this.selected)\"\n >\n </s-button>\n }\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"colgroup\"\n let-columns\n >\n <colgroup>\n @if (multiple) {\n <col style=\"width: 50px\" />\n }\n\n @for (col of columns; track $index) {\n <col [style.width]=\"col.width\" />\n }\n </colgroup>\n </ng-template>\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n @if (multiple) {\n <th style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\"\n >\n </s-table-header-checkbox>\n </th>\n }\n @for (col of columns; track $index) {\n <th\n [style.width]=\"col.width\"\n [pSortableColumn]=\"col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled.includes(col.name)\"\n >\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n @if (!sortableColumnsDisabled.includes(col.name)) {\n <p-sortIcon [field]=\"col.name\"> </p-sortIcon>\n }\n </div>\n </th>\n }\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\"\n >\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick\n (onDoubleClick)=\"onTableRowDoubleClick(rowData)\"\n >\n @if (multiple) {\n <td\n style=\"width: 50px\"\n tabindex=\"0\"\n >\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\"\n >\n </p-tableCheckbox>\n </td>\n }\n @for (col of searchGridFields; track $index) {\n <td\n [style.width]=\"getFieldWidth(col)\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\"\n >\n @switch (col.type) {\n @case ('boolean') {\n <ng-container\n *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getBooleanLabel(rowData, col.name, col.optionsLabel)\n }}</span>\n </ng-container>\n }\n @case ('date') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedDate\n : col.calendarLocaleOptions?.dateFormat || 'L'\n | async\n }}</span>\n </ng-container>\n }\n @case ('dateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('localDateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('time') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedTime\n : col.calendarLocaleOptions?.dateFormat || 'LTS'\n | async\n }}</span>\n </ng-container>\n }\n @case ('number') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getIntegerMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('decimal') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getDoubleMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('currency') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getMoneyMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('bigNumber') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getNumberMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('select') {\n <ng-container\n *ngIf=\"\n getLabelForValue(getFieldValue(rowData, col.name), col);\n else emptyTemplate\n \"\n >\n <ng-container\n *ngIf=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col);\n then withBadge;\n else withoutBadge\n \"\n ></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"\n getLabelForValue(getFieldValue(rowData, col.name), col)\n \"\n [color]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.color\n \"\n [type]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.type\n \"\n [iconClass]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconClass\n \"\n [iconPosition]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconPosition\n \"\n >\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span>\n {{\n getLabelForValue(getFieldValue(rowData, col.name), col)\n }}\n </span>\n </ng-template>\n </ng-container>\n }\n @default {\n @if (fieldHasMask(col) && parseValueMaskValue(col, rowData)) {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name)\n \"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | sMaskFormatter: parseValueMaskValue(col, rowData)\n }}</span>\n </ng-container>\n } @else {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name);\n else emptyTemplate\n \"\n >\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n }\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template sTemplate=\"footer\">\n <div class=\"flex w-full justify-end\">\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"labelOptions?.cancelLabel || 'platform.angular_components.cancel' | translate\"\n (clicked)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"labelOptions?.selectLabel || 'platform.angular_components.select' | translate\"\n (clicked)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n [disabled]=\"!selected.length\"\n >\n </s-button>\n </div>\n </ng-template>\n }\n</s-dialog>\n\n<ng-template #emptyTemplate>\n <span class=\"sds-empty-value\">\n {{ labelOptions?.emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n\n", styles: ["s-lookup.ng-dirty.ng-invalid .ui-inputtext{border-color:#c13018}s-lookup .p-autocomplete-input-multiple{border-top-right-radius:0!important;border-bottom-right-radius:0!important}s-lookup .inputgroup p-autocomplete+button,s-lookup p-autocomplete .ui-autocomplete-dropdown.ui-button{background-color:#fff;border-color:#ccc;border-width:1px 1px 1px 0;color:#333;min-height:35px;height:auto!important;min-width:auto;width:35px!important;overflow:hidden;border-radius:0 4px 4px 0}s-lookup p-autocomplete span.ui-autocomplete-multiple,s-lookup .inputgroup{display:flex}s-lookup .inputgroup p-autocomplete{display:inline-block}s-lookup .inputgroup p-autocomplete .p-autocomplete-input{width:100%}s-lookup .inputgroup p-autocomplete+button:enabled:hover,s-lookup .inputgroup p-autocomplete+button:focus{background-color:highlight(#ccc);border-color:#ccc}s-lookup:not(.ng-dirty.ng-invalid) .inputgroup p-autocomplete .ui-widget .ui-inputtext{border-right-width:1px;border-right-style:solid}s-lookup .ui-autocomplete-input-token{width:100%}s-lookup .ui-autocomplete-input-token input{width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token{max-width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .s-lookup-modal.p-dialog .p-dialog-content{padding:0;margin-bottom:0;max-height:none}s-lookup .p-table-scrollable-body{min-width:100%}.s-lookup-modal main{padding:0}.s-lookup-modal .s-lookup-modal-container{height:85vh;display:flex;flex-direction:row;width:100%}.s-lookup-modal .s-lookup-modal-container .filter{width:min-content;height:auto;flex-grow:0;flex-shrink:0;background-color:#e5eaea80;padding:.571rem}.s-lookup-modal .s-lookup-modal-container .filter form{width:100%;height:100%}.s-lookup-modal .s-lookup-modal-container .filter form .form-content{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .filter-title{padding-left:.5rem}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .form-fields{overflow-y:auto}.s-lookup-modal .s-lookup-modal-container .filter-toggle{margin-top:15px;flex-grow:0;flex-shrink:0;width:35px;border-radius:0 4px 4px 0}.s-lookup-modal .s-lookup-modal-container .filter-toggle button{align-items:center;position:relative;background-color:#e5eaea80;height:35px;width:100%;border:1px solid #e5eaea;outline:none;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;text-decoration:none;text-transform:none;padding:7px;transition:background-color .2s ease-out,color .2s ease-out,border-color .2s ease-out}.s-lookup-modal .s-lookup-modal-container .filter-toggle button:hover,.s-lookup-modal .s-lookup-modal-container .filter-toggle button:focus{background-color:active(rgba(229,234,234,.5));border-color:active(#e5eaea)}.s-lookup-modal .s-lookup-modal-container .content{flex-grow:1;flex-basis:auto;overflow-x:auto;display:flex;flex-direction:column;padding:.5rem}.s-lookup-modal .s-lookup-modal-container .content-child{height:100%}.s-lookup-modal .s-lookup-modal-container .content s-loading-state{height:100%;display:block}.s-lookup-modal .s-lookup-modal-container .content .s-loading-state,.s-lookup-modal .s-lookup-modal-container .content .s-loading-state .state-contents{height:100%}.s-lookup-modal .s-lookup-modal-container .content.empty-content{align-self:center}.s-lookup-modal .s-lookup-modal-container .content.empty-content .content-child{display:none}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable .p-datatable-table-container{flex:1;margin-bottom:0}.inputgroup p-autocomplete{width:calc(100% - 35px)}\n"] }]
|
|
590
|
+
], template: "<div [ngClass]=\"{ inputgroup: showSearch }\">\n <p-autoComplete\n #autocomplete\n [(ngModel)]=\"value\"\n [disabled]=\"disabled\"\n [dataKey]=\"dataKey\"\n [multiple]=\"multiple\"\n [inputId]=\"id + '-autocomplete'\"\n [forceSelection]=\"autocompleteForceSelection\"\n [suggestions]=\"getLookupSuggestions()\"\n (completeMethod)=\"onCompleteMethod($event)\"\n (onSelect)=\"onSelect.next($event)\"\n (onBlur)=\"onBlur.next($event)\"\n (onFocus)=\"onFocus.next($event)\"\n (onUnselect)=\"onUnselect.next($event)\"\n (onClear)=\"onClear.next($event)\"\n (onKeyUp)=\"onKeyUp.next($event)\"\n [field]=\"lookupDisplayField\"\n [emptyMessage]=\"lookupEmptyMessage\"\n [dropdown]=\"!showSearch\"\n [appendTo]=\"lookupAppendTo\"\n [placeholder]=\"placeholder || ' '\"\n [autoHighlight]=\"true\"\n inputStyleClass=\"mousetrap\"\n >\n </p-autoComplete>\n @if (showSearch) {\n <button\n class=\"button-addon\"\n [class.button-addon--disabled]=\"disabled\"\n [disabled]=\"disabled\"\n (click)=\"showDialog()\"\n >\n <i class=\"fa fa-search\"></i>\n </button>\n }\n</div>\n\n<s-dialog\n [(visible)]=\"dialogVisible\"\n (visibleChange)=\"onVisibleChange($event!)\"\n [header]=\"labelOptions?.searchTitle || 'platform.angular_components.advanced_search' | translate\"\n contentClassName=\"s-lookup-modal\"\n [size]=\"dialogFullScreen() ? 'fullscreen' : 'xl'\"\n>\n @if (dialogVisible) {\n <div\n class=\"s-lookup-modal-container\"\n #dialogContainer\n >\n @if (searchFields && searchFields.length) {\n <div\n class=\"filter\"\n [@collapseContent]=\"\n collapsed\n ? { value: 'hidden', params: { transitionParams: transitionOptions } }\n : { value: 'visible', params: { transitionParams: transitionOptions } }\n \"\n (@collapseContent.done)=\"onToggleDone()\"\n >\n <form\n [formGroup]=\"formGroupDialog\"\n novalidate\n autocomplete=\"off\"\n >\n @if (!collapsed) {\n <div\n class=\"form-content\"\n [@childCollapseContent]=\"\n collapsed\n ? { value: ':leave', params: { transitionParams: transitionOptions } }\n : { value: ':enter', params: { transitionParams: transitionOptions } }\n \"\n >\n <div class=\"filter-title sds-section-title\">\n {{ labelOptions?.filterTitle || 'platform.angular_components.filters' | translate }}\n </div>\n <div class=\"form-fields\">\n <s-dynamic-form\n [configs]=\"searchFieldsDynamicStructure\"\n [form]=\"formGroupDialog\"\n >\n </s-dynamic-form>\n </div>\n <div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <s-button\n [id]=\"id + '-filter-button'\"\n type=\"submit\"\n [label]=\"\n labelOptions?.filterLabel || 'platform.angular_components.filter'\n | translate\n \"\n (clicked)=\"search()\"\n sTooltip=\"(ALT + SHIFT + F)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-clear-button'\"\n type=\"button\"\n [label]=\"\n labelOptions?.clearLabel || 'platform.angular_components.clear'\n | translate\n \"\n (clicked)=\"clear()\"\n priority=\"link\"\n sTooltip=\"(ALT + SHIFT + L)\"\n >\n </s-button>\n </div>\n </div>\n </div>\n }\n </form>\n </div>\n }\n @if (searchFields && searchFields.length) {\n <div class=\"filter-toggle\">\n <button\n [id]=\"id + '-filter-toggle-button'\"\n type=\"button\"\n (click)=\"filterToggle()\"\n >\n <span\n class=\"fa\"\n [ngClass]=\"{ 'fa-chevron-left': !collapsed, 'fa-chevron-right': collapsed }\"\n aria-hidden=\"true\"\n >\n </span>\n </button>\n </div>\n }\n @let isEmptyContent = !searchTotalRecords && !loading;\n <div\n class=\"content\"\n #contentContainer\n [ngClass]=\"{ 'empty-content': isEmptyContent }\"\n >\n @if (isEmptyContent) {\n <s-empty-state\n [id]=\"id + '-empty-state'\"\n [title]=\"\n labelOptions?.searchEmptyTitle || 'platform.angular_components.no_records_found' | translate\n \"\n [description]=\"searchEmptyDescription\"\n iconClass=\"fa fa-search\"\n >\n </s-empty-state>\n }\n <div class=\"content-child\">\n <p-table\n [dataKey]=\"dataKey\"\n [value]=\"getGridData()\"\n [columns]=\"searchGridFields\"\n [lazy]=\"true\"\n [scrollable]=\"true\"\n [paginator]=\"true\"\n sortMode=\"multiple\"\n [totalRecords]=\"searchTotalRecords\"\n [rows]=\"10\"\n [selection]=\"selected\"\n (onLazyLoad)=\"lazyLoadGrid($event)\"\n [multiSortMeta]=\"multiSortMeta\"\n [attr.data-hidden]=\"!searchTotalRecords && !loading\"\n [selectionMode]=\"multiple ? 'multiple' : 'single'\"\n (selectionChange)=\"onSelectionChange($event)\"\n *sLoadingState=\"{ loading: loading, indicator: indicatorLogo }\"\n >\n <ng-template pTemplate=\"caption\">\n <div>\n @if (showAddOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.add' | translate\"\n (clicked)=\"onAdd.emit()\"\n >\n </s-button>\n }\n @if (showEditOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.edit' | translate\"\n [disabled]=\"selected.length !== 1\"\n (clicked)=\"onEdit.emit(this.selected[0])\"\n >\n </s-button>\n }\n @if (showRemoveOption) {\n <s-button\n priority=\"default\"\n [label]=\"'platform.angular_components.remove' | translate\"\n [disabled]=\"!selected.length\"\n (clicked)=\"onRemove.emit(this.selected)\"\n >\n </s-button>\n }\n </div>\n </ng-template>\n <ng-template\n pTemplate=\"colgroup\"\n let-columns\n >\n <colgroup>\n @if (multiple) {\n <col style=\"width: 50px\" />\n }\n\n @for (col of columns; track $index) {\n <col [style.width]=\"col.width\" />\n }\n </colgroup>\n </ng-template>\n <ng-template\n pTemplate=\"header\"\n let-columns\n >\n <tr>\n @if (multiple) {\n <th style=\"width: 50px\">\n <s-table-header-checkbox\n [useAllObject]=\"lookupRowProps ? false : true\"\n [rowProps]=\"lookupRowProps\"\n >\n </s-table-header-checkbox>\n </th>\n }\n @for (col of columns; track $index) {\n <th\n [style.width]=\"col.width\"\n [pSortableColumn]=\"col.name\"\n [pSortableColumnDisabled]=\"sortableColumnsDisabled.includes(col.name)\"\n >\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.label }}</span>\n @if (!sortableColumnsDisabled.includes(col.name)) {\n <p-sortIcon [field]=\"col.name\"> </p-sortIcon>\n }\n </div>\n </th>\n }\n </tr>\n </ng-template>\n <ng-template\n pTemplate=\"body\"\n let-rowData\n let-columns\n let-rowIndex=\"rowIndex\"\n >\n <tr\n sNavigation\n [pSelectableRow]=\"rowData\"\n [pSelectableRowIndex]=\"rowIndex\"\n sDoubleClick\n (onDoubleClick)=\"onTableRowDoubleClick(rowData)\"\n >\n @if (multiple) {\n <td\n style=\"width: 50px\"\n tabindex=\"0\"\n >\n <p-tableCheckbox\n [value]=\"rowData\"\n [pSelectableRow]=\"rowData\"\n >\n </p-tableCheckbox>\n </td>\n }\n @for (col of searchGridFields; track $index) {\n <td\n [style.width]=\"getFieldWidth(col)\"\n [ngSwitch]=\"col.type\"\n tabindex=\"0\"\n >\n @switch (col.type) {\n @case ('boolean') {\n <ng-container\n *ngIf=\"isBooleanValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getBooleanLabel(rowData, col.name, col.optionsLabel)\n }}</span>\n </ng-container>\n }\n @case ('date') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedDate\n : col.calendarLocaleOptions?.dateFormat || 'L'\n | async\n }}</span>\n </ng-container>\n }\n @case ('dateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('localDateTime') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name) | localizedDate | async\n }}</span>\n </ng-container>\n }\n @case ('time') {\n <ng-container\n *ngIf=\"getFieldValue(rowData, col.name); else emptyTemplate\"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | localizedTime\n : col.calendarLocaleOptions?.dateFormat || 'LTS'\n | async\n }}</span>\n </ng-container>\n }\n @case ('integer') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getIntegerMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('double') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getDoubleMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('money') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getMoneyMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('number') {\n <ng-container *ngIf=\"isNumber(rowData, col.name); else emptyTemplate\">\n <span>\n {{\n getFieldValue(rowData, col.name)\n | localizedBignumber: getNumberMaskConfig(col)\n | async\n }}\n </span>\n </ng-container>\n }\n @case ('enum') {\n <ng-container\n *ngIf=\"\n getLabelForValue(getFieldValue(rowData, col.name), col);\n else emptyTemplate\n \"\n >\n <ng-container\n *ngIf=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col);\n then withBadge;\n else withoutBadge\n \"\n ></ng-container>\n <ng-template #withBadge>\n <s-badge\n [text]=\"\n getLabelForValue(getFieldValue(rowData, col.name), col)\n \"\n [color]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.color\n \"\n [type]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.type\n \"\n [iconClass]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconClass\n \"\n [iconPosition]=\"\n getBadgeFromValue(getFieldValue(rowData, col.name), col)\n ?.iconPosition\n \"\n >\n </s-badge>\n </ng-template>\n <ng-template #withoutBadge>\n <span>\n {{\n getLabelForValue(getFieldValue(rowData, col.name), col)\n }}\n </span>\n </ng-template>\n </ng-container>\n }\n @default {\n @if (fieldHasMask(col) && parseValueMaskValue(col, rowData)) {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name)\n \"\n >\n <span>{{\n getFieldValue(rowData, col.name)\n | sMaskFormatter: parseValueMaskValue(col, rowData)\n }}</span>\n </ng-container>\n } @else {\n <ng-container\n *ngIf=\"\n isNumber(rowData, col.name) ||\n getFieldValue(rowData, col.name);\n else emptyTemplate\n \"\n >\n <span>{{ getFieldValue(rowData, col.name) }}</span>\n </ng-container>\n }\n }\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <span [attr.data-hidden]=\"loading\">\n {{ printRecordTotalizer() }}\n </span>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template sTemplate=\"footer\">\n <div class=\"flex w-full justify-end\">\n <s-button\n [id]=\"id + '-cancel-button'\"\n type=\"button\"\n priority=\"link\"\n [label]=\"labelOptions?.cancelLabel || 'platform.angular_components.cancel' | translate\"\n (clicked)=\"hideDialog()\"\n sTooltip=\"(ALT + SHIFT + C)\"\n >\n </s-button>\n <s-button\n [id]=\"id + '-select-button'\"\n type=\"button\"\n [label]=\"labelOptions?.selectLabel || 'platform.angular_components.select' | translate\"\n (clicked)=\"select()\"\n sTooltip=\"(ALT + SHIFT + S)\"\n [disabled]=\"!selected.length\"\n >\n </s-button>\n </div>\n </ng-template>\n }\n</s-dialog>\n\n<ng-template #emptyTemplate>\n <span class=\"sds-empty-value\">\n {{ labelOptions?.emptyFieldLabel || 'platform.angular_components.not_informed' | translate }}\n </span>\n</ng-template>\n\n", styles: ["s-lookup.ng-dirty.ng-invalid .ui-inputtext{border-color:#c13018}s-lookup .p-autocomplete-input-multiple{border-top-right-radius:0!important;border-bottom-right-radius:0!important}s-lookup .inputgroup p-autocomplete+button,s-lookup p-autocomplete .ui-autocomplete-dropdown.ui-button{background-color:#fff;border-color:#ccc;border-width:1px 1px 1px 0;color:#333;min-height:35px;height:auto!important;min-width:auto;width:35px!important;overflow:hidden;border-radius:0 4px 4px 0}s-lookup p-autocomplete span.ui-autocomplete-multiple,s-lookup .inputgroup{display:flex}s-lookup .inputgroup p-autocomplete{display:inline-block}s-lookup .inputgroup p-autocomplete .p-autocomplete-input{width:100%}s-lookup .inputgroup p-autocomplete+button:enabled:hover,s-lookup .inputgroup p-autocomplete+button:focus{background-color:highlight(#ccc);border-color:#ccc}s-lookup:not(.ng-dirty.ng-invalid) .inputgroup p-autocomplete .ui-widget .ui-inputtext{border-right-width:1px;border-right-style:solid}s-lookup .ui-autocomplete-input-token{width:100%}s-lookup .ui-autocomplete-input-token input{width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token{max-width:100%}s-lookup .ui-autocomplete .ui-autocomplete-token-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body .s-lookup-modal.p-dialog .p-dialog-content{padding:0;margin-bottom:0;max-height:none}s-lookup .p-table-scrollable-body{min-width:100%}.s-lookup-modal main{padding:0}.s-lookup-modal .s-lookup-modal-container{height:85vh;display:flex;flex-direction:row;width:100%}.s-lookup-modal .s-lookup-modal-container .filter{width:min-content;height:auto;flex-grow:0;flex-shrink:0;background-color:#e5eaea80;padding:.571rem}.s-lookup-modal .s-lookup-modal-container .filter form{width:100%;height:100%}.s-lookup-modal .s-lookup-modal-container .filter form .form-content{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .filter-title{padding-left:.5rem}.s-lookup-modal .s-lookup-modal-container .filter form .form-content .form-fields{overflow-y:auto}.s-lookup-modal .s-lookup-modal-container .filter-toggle{margin-top:15px;flex-grow:0;flex-shrink:0;width:35px;border-radius:0 4px 4px 0}.s-lookup-modal .s-lookup-modal-container .filter-toggle button{align-items:center;position:relative;background-color:#e5eaea80;height:35px;width:100%;border:1px solid #e5eaea;outline:none;border-left:none;border-radius:0 4px 4px 0;cursor:pointer;text-decoration:none;text-transform:none;padding:7px;transition:background-color .2s ease-out,color .2s ease-out,border-color .2s ease-out}.s-lookup-modal .s-lookup-modal-container .filter-toggle button:hover,.s-lookup-modal .s-lookup-modal-container .filter-toggle button:focus{background-color:active(rgba(229,234,234,.5));border-color:active(#e5eaea)}.s-lookup-modal .s-lookup-modal-container .content{flex-grow:1;flex-basis:auto;overflow-x:auto;display:flex;flex-direction:column;padding:.5rem}.s-lookup-modal .s-lookup-modal-container .content-child{height:100%}.s-lookup-modal .s-lookup-modal-container .content s-loading-state{height:100%;display:block}.s-lookup-modal .s-lookup-modal-container .content .s-loading-state,.s-lookup-modal .s-lookup-modal-container .content .s-loading-state .state-contents{height:100%}.s-lookup-modal .s-lookup-modal-container .content.empty-content{align-self:center}.s-lookup-modal .s-lookup-modal-container .content.empty-content .content-child{display:none}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable{height:100%;display:flex;flex-direction:column}.s-lookup-modal .s-lookup-modal-container .content p-table>.p-datatable .p-datatable-table-container{flex:1;margin-bottom:0}.inputgroup p-autocomplete{width:calc(100% - 35px)}\n"] }]
|
|
591
591
|
}], ctorParameters: () => [{ type: i1.HotkeysService }, { type: i2.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { formControlName: [{
|
|
592
592
|
type: Input
|
|
593
593
|
}], id: [{
|
|
@@ -685,4 +685,4 @@ export class BooleanOptionsLabel {
|
|
|
685
685
|
this.clear = config.clear;
|
|
686
686
|
}
|
|
687
687
|
}
|
|
688
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vY29tcG9uZW50cy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vY29tcG9uZW50cy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdHLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUgsV0FBVyxFQUNYLFNBQVMsRUFDVCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFFckMsT0FBTyxFQUFFLFlBQVksRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVB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TUFBTTtzQkFGWixNQUFNO2dCQU1BLE9BQU87c0JBRmIsTUFBTTtnQkFNQSxRQUFRO3NCQUZkLE1BQU07Z0JBTUEsVUFBVTtzQkFGaEIsTUFBTTtnQkFNQSxPQUFPO3NCQUZiLE1BQU07Z0JBTUEsS0FBSztzQkFGWCxNQUFNO2dCQU1BLE1BQU07c0JBRlosTUFBTTtnQkFNQSxRQUFRO3NCQUZkLE1BQU07Z0JBTUEsa0JBQWtCO3NCQUZ4QixNQUFNO2dCQUtBLEtBQUs7c0JBRFgsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QixZQUFZO3NCQURsQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSW5DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBK01PLFVBQVU7QUEyUzNCLE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsSUFBSSxDQUFTO0lBQ2IsS0FBSyxDQUFTO0lBQ2QsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFVO0lBRXRCLFlBQVksTUFBaUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIGFuaW1hdGVDaGlsZCwgZ3JvdXAsIHF1ZXJ5LCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5wdXQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgdmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWFza0NvbmZpZyB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9uZzItY3VycmVuY3ktbWFzayc7XG5pbXBvcnQgeyBIb3RrZXksIEhvdGtleXNTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhcjItaG90a2V5cyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTb3J0TWV0YSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEF1dG9Db21wbGV0ZSwgQXV0b0NvbXBsZXRlQ29tcGxldGVFdmVudCwgQXV0b0NvbXBsZXRlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgVGFibGUsIFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIgfSBmcm9tICcuL3R5cGVzL2RlZmF1bHQtZmlsdGVyJztcbmltcG9ydCB7IExhYmVsT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMvbGFiZWwtb3B0aW9ucyc7XG5cbmltcG9ydCB7IExvYWRpbmdTdGF0ZUluZGljYXRvcnMsIExvYWRpbmdTdGF0ZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9hZGluZy1zdGF0ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckxvY2FsZU9wdGlvbnMsIExvY2FsZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9jYWxlJztcbmltcG9ydCB7IENoZWNrRGlzYWJsZWQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3NoYXJlZCc7XG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RpYWxvZyc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYsIE5nU3dpdGNoIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVtcHR5U3RhdGVNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2VtcHR5LXN0YXRlJztcbmltcG9ydCB7IEJhZGdlTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9iYWRnZSc7XG5pbXBvcnQgeyBNYXNrRm9ybWF0dGVyTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9tYXNrJztcbmltcG9ydCB7IFRhYmxlSGVhZGVyQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3RhYmxlLWhlYWRlcic7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCwgZHluYW1pY1R5cGVUb0R5bmFtaWNTdHJ1Y3R1cmUgfSBmcm9tICcuLi8uLi9keW5hbWljLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEV4cGFuZGVkRHluYW1pY1R5cGUgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9ucy9zdHJ1Y3R1cmUvcm93JztcbmltcG9ydCB7IFNlbGVjdEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvc2VsZWN0LWZpZWxkJztcbmltcG9ydCB7IEJpZ251bWJlckZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvYmlnbnVtYmVyLWZpZWxkJztcbmltcG9ydCB7IE51bWJlckZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvbnVtYmVyLWZpZWxkJztcbmltcG9ydCB7IEN1cnJlbmN5RmllbGRDb25maWcgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkL2NvbmZpZ3VyYXRpb25zL2ZpZWxkcy9jdXJyZW5jeS1maWVsZCc7XG5pbXBvcnQgeyBUZXh0RmllbGRDb25maWcgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkL2NvbmZpZ3VyYXRpb25zL2ZpZWxkcy90ZXh0LWZpZWxkJztcbmltcG9ydCB7IER5bmFtaWNUeXBlIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvZmllbGQnO1xuaW1wb3J0IHsgRHluYW1pY1N0cnVjdHVyZSB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb25zL3N0cnVjdHVyZS9zdHJ1Y3R1cmUnO1xuaW1wb3J0IHsgVGVtcGxhdGVNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3RlbXBsYXRlJztcbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBdXRvQ29tcGxldGVNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXG4gICAgICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgRW1wdHlTdGF0ZU1vZHVsZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIExvYWRpbmdTdGF0ZU1vZHVsZSxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBMb2NhbGVNb2R1bGUsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIEJhZGdlTW9kdWxlLFxuICAgICAgICBNYXNrRm9ybWF0dGVyTW9kdWxlLFxuICAgICAgICBOZ1N3aXRjaCxcbiAgICAgICAgVGFibGVIZWFkZXJDaGVja2JveE1vZHVsZSxcbiAgICAgICAgVGVtcGxhdGVNb2R1bGUsXG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ3MtbG9va3VwJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbG9va3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9sb29rdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb29rdXBDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignY29sbGFwc2VDb250ZW50JywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwcHgnLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnKicsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA8PT4gaGlkZGVuJywgW1xuICAgICAgICAgICAgICAgIGdyb3VwKFtxdWVyeSgnQGNoaWxkQ29sbGFwc2VDb250ZW50JywgYW5pbWF0ZUNoaWxkKCkpLCBhbmltYXRlKCd7e3RyYW5zaXRpb25QYXJhbXN9fScpXSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgXSksXG4gICAgICAgIHRyaWdnZXIoJ2NoaWxkQ29sbGFwc2VDb250ZW50JywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJzpsZWF2ZScsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICc6ZW50ZXInLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCcqIDw9PiAqJywgYW5pbWF0ZSgne3t0cmFuc2l0aW9uUGFyYW1zfX0nKSksXG4gICAgICAgIF0pLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIExvb2t1cENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cERpYWxvZ0NvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2RpYWxvZ0NvbnRhaW5lcicpO1xuICAgIHByb3RlY3RlZCByb3dUeXBlID0gJ1Jvdyc7XG4gICAgcHVibGljIGluZGljYXRvckxvZ28gPSBMb2FkaW5nU3RhdGVJbmRpY2F0b3JzLkxvZ287XG4gICAgcHVibGljIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9ybUNvbnRyb2xOYW1lPzogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgcy1sb29rdXAtJHtMb29rdXBDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9jb21wbGV0ZUZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkYXRhS2V5ITogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dTZWFyY2ggPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9va3VwU3VnZ2VzdGlvbnM6IGFueVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBEaXNwbGF5RmllbGQ/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBEaXNwbGF5RmllbGRUb29sdGlwID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBFbXB0eU1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB2YWx1ZSA/PyAnYm9keScgfSlcbiAgICBwdWJsaWMgbG9va3VwQXBwZW5kVG8/ID0gJ2JvZHknO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoRW1wdHlEZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaEdyaWREYXRhOiBhbnlbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoVG90YWxSZWNvcmRzID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaEZpZWxkczogRHluYW1pY1R5cGVbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoR3JpZEZpZWxkczogRHluYW1pY1R5cGVbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzb3J0YWJsZUNvbHVtbnNEaXNhYmxlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvb2t1cFJvd1Byb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVmYXVsdEZpbHRlcjogRGVmYXVsdEZpbHRlcltdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93QWRkT3B0aW9uID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93RWRpdE9wdGlvbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd1JlbW92ZU9wdGlvbiA9IGZhbHNlO1xuXG4gICAgZGlhbG9nRnVsbFNjcmVlbiA9IGlucHV0KGZhbHNlKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvbkxvb2t1cFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25TZWFyY2hSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uS2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25VbnNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uQWRkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bj4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvblJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bltdPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uQ2xlYXJCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyB0YWJsZTogVGFibGUgfCBudWxsID0gbnVsbDtcblxuICAgIEBWaWV3Q2hpbGQoQXV0b0NvbXBsZXRlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlOiBBdXRvQ29tcGxldGUgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxhYmVsT3B0aW9ucz86IFBhcnRpYWw8TGFiZWxPcHRpb25zPjtcblxuICAgIHB1YmxpYyB2YWx1ZTogYW55O1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGFuaW1hdGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBkaWFsb2dWaXNpYmxlID0gZmFsc2U7XG4gICAgcHVibGljIGNvbGxhcHNlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZDogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgZm9ybUdyb3VwRGlhbG9nITogRm9ybUdyb3VwPGFueT47XG4gICAgcHVibGljIHRyYW5zaXRpb25PcHRpb25zID0gJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKSc7XG5cbiAgICBwcm90ZWN0ZWQgc2VhcmNoRmllbGRzRHluYW1pY1N0cnVjdHVyZTogRHluYW1pY1N0cnVjdHVyZVtdID0gW107XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ/OiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIG9yaWdpbmFsRm9ybVZhbHVlcyA9IHt9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBob3RrZXlzU2VydmljZTogSG90a2V5c1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaEdyaWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXJjaEZpZWxkc0R5bmFtaWNTdHJ1Y3R1cmUgPSBkeW5hbWljVHlwZVRvRHluYW1pY1N0cnVjdHVyZShcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRmllbGRzLm1hcCgoc2VhcmNoRmllbGQ6IEV4cGFuZGVkRHluYW1pY1R5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZC5zaXplID0geyBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zZWFyY2hGaWVsZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hHcmlkRmllbGRzID0gdGhpcy5zZWFyY2hHcmlkRmllbGRzLm1hcCgoZ3JpZEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBncmlkVHlwZSA9IGdyaWRGaWVsZC50eXBlO1xuICAgICAgICAgICAgaWYgKGdyaWRGaWVsZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIChncmlkRmllbGQgYXMgYW55KVsnd2lkdGgnXSA9IHRoaXMuZ2V0Q29sV2lkdGgoZ3JpZEZpZWxkLmxhYmVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyaWRUeXBlID09PSAnY2FsZW5kYXInIHx8IGdyaWRUeXBlID09PSAnZGF0ZScgfHwgZ3JpZFR5cGUgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGVuZGFyT3B0aW9ucyA9IG5ldyBDYWxlbmRhckxvY2FsZU9wdGlvbnMoeyAuLi5ncmlkRmllbGQuY2FsZW5kYXJMb2NhbGVPcHRpb25zIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyT3B0aW9ucz8uZGF0ZUZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdyaWRGaWVsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMuZGF0ZUZvcm1hdCA9IHRoaXMuX2NvbnZlcnRUb01vbWVudERhdGVGb3JtYXQoY2FsZW5kYXJPcHRpb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJPcHRpb25zLmRhdGVGb3JtYXQgPSB0aGlzLl9jb252ZXJ0VG9Nb21lbnRIb3VyRm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMuaG91ckZvcm1hdCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyT3B0aW9ucy5kYXRlRm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ3JpZEZpZWxkLmNhbGVuZGFyTG9jYWxlT3B0aW9ucyA9IGNhbGVuZGFyT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBncmlkRmllbGQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhc0ZpZWxkV2l0aERvdEluTmFtZSA9IHRoaXMuc2VhcmNoRmllbGRzLnNvbWUoKGZpZWxkKSA9PiBmaWVsZC5uYW1lLmluY2x1ZGVzKCcuJykpO1xuICAgICAgICBpZiAoaGFzRmllbGRXaXRoRG90SW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNXaXRoRG90ID0gdGhpcy5zZWFyY2hGaWVsZHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUuaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBmaWVsZHM6IFske2ZpZWxkc1dpdGhEb3R9XSAgY2FuJ3QgaGF2ZSBkb3QgaW4gdGhlaXIgbmFtZXMsIHBsZWFzZSByZXBsYWNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuc2VhcmNoRmllbGRzLnJlZHVjZSgocmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIH0sIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9ICdkZWZhdWx0VmFsdWUnIGluIGZpZWxkID8gZmllbGQuZGVmYXVsdFZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtmaWVsZC5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgICh0aGlzLm9yaWdpbmFsRm9ybVZhbHVlcyBhcyBhbnkpW2ZpZWxkLm5hbWVdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwRGlhbG9nID0gbmV3IEZvcm1Hcm91cChmb3JtR3JvdXApO1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZUV2ZW50cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludFJlY29yZFRvdGFsaXplcigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5sYWJlbE9wdGlvbnM/LnNlYXJjaFRvdGFsUmVjb3Jkc0xhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYWJlbE9wdGlvbnM/LnNlYXJjaFRvdGFsUmVjb3Jkc0xhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkTGFiZWwgPSB0aGlzLmxhYmVsT3B0aW9ucz8ucmVjb3JkTGFiZWxcbiAgICAgICAgICAgID8gYCR7dGhpcy5zZWFyY2hUb3RhbFJlY29yZHN9ICR7dGhpcy5sYWJlbE9wdGlvbnM/LnJlY29yZExhYmVsfWBcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmQnLCB7XG4gICAgICAgICAgICAgICAgICBjb3VudDogdGhpcy5zZWFyY2hUb3RhbFJlY29yZHMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZHNMYWJlbCA9IHRoaXMubGFiZWxPcHRpb25zPy5yZWNvcmRzTGFiZWxcbiAgICAgICAgICAgID8gYCR7dGhpcy5zZWFyY2hUb3RhbFJlY29yZHN9ICR7dGhpcy5sYWJlbE9wdGlvbnM/LnJlY29yZHNMYWJlbH1gXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudG90YWxfcmVjb3JkcycsIHtcbiAgICAgICAgICAgICAgICAgIGNvdW50OiB0aGlzLnNlYXJjaFRvdGFsUmVjb3JkcyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVG90YWxSZWNvcmRzID09PSAxID8gcmVjb3JkTGFiZWwgOiByZWNvcmRzTGFiZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29udmVydFRvTW9tZW50SG91ckZvcm1hdChob3VyRm9ybWF0OiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkZC9tbS95eScpIHtcbiAgICAgICAgICAgIC8vIHZhbG9yIHBhZHLDo28gcGFyYSBvIGZvcm1hdC5cbiAgICAgICAgICAgIHJldHVybiAnTFRTJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3VyRm9ybWF0ID09PSAnMTInKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcYkhcXGIvLCAnaCcpIC8vIGhvdXIgKDEyIGhvdXIgdGltZSkgKG5vIGxlYWRpbmcgemVybylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxiSEhcXGIvLCAnaGgnKTsgLy8gaG91ciAoMTIgaG91ciB0aW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdXJGb3JtYXQgPT09ICcyNCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxiaFxcYi8sICdIJykgLy8gaG91ciAoMjQgaG91ciB0aW1lKSAobm8gbGVhZGluZyB6ZXJvKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJoaFxcYi8sICdISCcpOyAvLyBob3VyICgyNCBob3VyIHRpbWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbnZlcnRUb01vbWVudERhdGVGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBBIG9yZGVtIGRvcyByZXBsYWNlcyDDqSBpbXBvcnRhbnRlLlxuICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiZFxcYi8sICdEJykgLy8gZGF5IG9mIG1vbnRoIChubyBsZWFkaW5nIHplcm8pXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiZGRcXGIvLCAnREQnKSAvLyBkYXkgb2YgbW9udGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJvXFxiLywgJ0RERCcpIC8vIGRheSBvZiB0aGUgeWVhciAobm8gbGVhZGluZyB6ZXJvKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYm9vXFxiLywgJ0REREQnKSAvLyBkYXkgb2YgdGhlIHllYXJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJNXFxiLywgJ01NTScpIC8vIG1vbnRoIG5hbWUgc2hvcnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJNTVxcYi8sICdNTU1NJykgLy8gbW9udGggbmFtZSBsb25nXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxibVxcYi8sICdNJykgLy8gbW9udGggb2YgeWVhciAobm8gbGVhZGluZylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJtbVxcYi8sICdNTScpIC8vIG1vbnRoIG9mIHllYXJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJ5XFxiLywgJ1lZJykgLy8geWVhciAodHdvIGRpZ2l0cylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJ5eVxcYi8sICdZWVlZJyk7IC8vIHllYXIgKGZvdXIgZGlnaXRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ1Zpc2libGUgJiYgY2hhbmdlc1snc2VhcmNoR3JpZERhdGEnXSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRGb2N1c0ZpbHRlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdyaWREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hHcmlkRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9va3VwU3VnZ2VzdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cFN1Z2dlc3Rpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtYWtlU2VhcmNoUmVxdWVzdFBhcmFtcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZvcm1Hcm91cERpYWxvZz8uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi5ldmVudCwgZmlsdGVyRGF0YTogZmlsdGVycyB9O1xuICAgICAgICBjb25zdCB7IG11bHRpU29ydE1ldGEgfSA9IGV2ZW50O1xuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBtdWx0aVNvcnRNZXRhIHx8IHRoaXMubXVsdGlTb3J0TWV0YTtcblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBsYXp5TG9hZEdyaWQoZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBBbyBkZWZpbmlyIHVtYSBvcmRlbmHDp8OjbyBuYSB0YWJlbGEgZG8gbG9va3VwIGVzc2UgbcOpdG9kbyDDqSBjaGFtYWRvIDIgdmV6ZXMgaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVuZy9pc3N1ZXMvNTQ4MFxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLm1ha2VTZWFyY2hSZXF1ZXN0UGFyYW1zKGV2ZW50KTtcbiAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QubmV4dChwYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbXBsZXRlTWV0aG9kKGV2ZW50OiBBdXRvQ29tcGxldGVDb21wbGV0ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hdXRvY29tcGxldGVGb3JjZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZT8uKHRoaXMudmFsdWUgPT09ICcnID8gbnVsbCA6IHRoaXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkxvb2t1cFJlcXVlc3QubmV4dChldmVudC5xdWVyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERlZmF1bHRGaWx0ZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdEZpbHRlcikgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclxuICAgICAgICAgICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiB0aGlzLmZvcm1Hcm91cERpYWxvZz8uY29udGFpbnMoZmllbGQpICYmICF0aGlzLmZvcm1Hcm91cERpYWxvZz8uZ2V0KFtmaWVsZF0pPy5kaXJ0eSlcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IHZhbHVlLCBmaWVsZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBEaWFsb2c/LmdldChbZmllbGRdKT8ucGF0Y2hWYWx1ZSh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdmFsdWUoKSA6IHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIEBDaGVja0Rpc2FibGVkKClcbiAgICBwdWJsaWMgYXN5bmMgc2hvd0RpYWxvZygpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RmlsdGVycygpO1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWREYXRhID0gW107XG4gICAgICAgIHRoaXMub25Ub3VjaGVkPy4oKTtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5wYXVzZShbLi4udGhpcy5ob3RrZXlzU2VydmljZS5ob3RrZXlzXSk7XG4gICAgICAgIHRoaXMuc2V0SG90a2V5cygpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZDogYW55ID0gW107XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY29uY2F0KHRoaXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gW3RoaXMudmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHNldElucHV0cyhjb21wb25lbnRSZWY6IGFueSwgY29uZmlnczogYW55LCBmb3JtOiBhbnkpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZ3MgPSBjb25maWdzO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuZm9ybSA9IGZvcm07XG5cbiAgICAgICAgLy8gY2hhbWUgbmdPbkNoYW5nZXMgbWFudWFsbWVudGUgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRSZWYuaW5zdGFuY2UubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5uZ09uQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25WaXNpYmxlQ2hhbmdlKHZpc2liaWxpdHlTdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmlzaWJpbGl0eVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlRGlhbG9nKCk7XG4gICAgfVxuICAgIHB1YmxpYyBoaWRlRGlhbG9nKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbnB1dEVMLCBtdWx0aUlucHV0RWwgfSA9IHRoaXMuYXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS51bnBhdXNlKFsuLi50aGlzLmhvdGtleXNTZXJ2aWNlLnBhdXNlZEhvdGtleXNdKTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIG11bHRpSW5wdXRFbD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0RUw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKCkge1xuICAgICAgICB0aGlzLnJlc2V0VGFibGUoKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBkaWFsb2dDb250YWluZXIgPSB0aGlzLmxvb2t1cERpYWxvZ0NvbnRhaW5lcigpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZGlhbG9nQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBkaWFsb2dDb250YWluZXIuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwRGlhbG9nPy5yZXNldCh0aGlzLm9yaWdpbmFsRm9ybVZhbHVlcyk7XG4gICAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xuICAgICAgICB0aGlzLm9uQ2xlYXJCdXR0b25DbGljay5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0VGFibGUoKSB7XG4gICAgICAgIHRoaXMudGFibGU/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWQgOiB0aGlzLnNlbGVjdGVkWzBdKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkO1xuICAgICAgICB0aGlzLm9uU2VsZWN0Lm5leHQoc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmhpZGVEaWFsb2coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQ6IGFueSkge1xuICAgICAgICBpZiAoIXNlbGVjdGVkKSByZXR1cm47XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgICBlbHNlIHRoaXMuc2VsZWN0ZWQgPSBbc2VsZWN0ZWRdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKHJlc3VsdCwgcHJvcCkgPT4gKHJlc3VsdFtwcm9wXSA9PT0gdW5kZWZpbmVkID8gJycgOiByZXN1bHRbcHJvcF0pLCBvYmopO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCYWRnZUZyb21WYWx1ZSh2YWx1ZTogdW5rbm93biwgZmllbGQ6IFNlbGVjdEZpZWxkQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgZmllbGQub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IGZpZWxkLm9wdGlvbnMoKSA6IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiBvcHRpb25zPy5maW5kKChvcHQpID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpPy5iYWRnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZTogdW5rbm93biwgZmllbGQ6IFNlbGVjdEZpZWxkQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgZmllbGQub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IGZpZWxkLm9wdGlvbnMoKSA6IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQpID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmxhYmVsIDogYCR7dmFsdWV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNCb29sZWFuVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0RmllbGRWYWx1ZShvYmosIHBhdGgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkV2lkdGgoY29sOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGNvbC53aWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbkxhYmVsKG9iajogYW55LCBwYXRoOiBzdHJpbmcsIG9wdGlvbnNMYWJlbDogQm9vbGVhbk9wdGlvbnNMYWJlbCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIW9wdGlvbnNMYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldEZpZWxkVmFsdWUob2JqLCBwYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNMYWJlbC50cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNMYWJlbC5mYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc051bWJlcihvYmo6IGFueSwgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAhbmV3IEJpZ051bWJlcih0aGlzLmdldEZpZWxkVmFsdWUob2JqLCBwYXRoKSkuaXNOYU4oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG90a2V5cygpIHtcbiAgICAgICAgY29uc3QgY2xlYXJIb3RrZXkgPSB0aGlzLm5ld0hvdGtleSgnYWx0K3NoaWZ0K2wnLCB0aGlzLmNsZWFyLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmaW5kSG90a2V5ID0gdGhpcy5uZXdIb3RrZXkoJ2FsdCtzaGlmdCtmJywgdGhpcy5zZWFyY2guYmluZCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGhpZGVIb3RrZXkgPSB0aGlzLm5ld0hvdGtleSgnYWx0K3NoaWZ0K2MnLCB0aGlzLmhpZGVEaWFsb2cuYmluZCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEhvdGtleSA9IHRoaXMubmV3SG90a2V5KCdhbHQrc2hpZnQrcycsIHRoaXMuc2VsZWN0LmJpbmQodGhpcykpO1xuXG4gICAgICAgIGNvbnN0IGJpbmRlZEhvdGtleXMgPSBbY2xlYXJIb3RrZXksIGZpbmRIb3RrZXksIGhpZGVIb3RrZXksIHNlbGVjdEhvdGtleV07XG4gICAgICAgIGJpbmRlZEhvdGtleXMuZm9yRWFjaCgoaG90a2V5OiBIb3RrZXkpID0+IHRoaXMuaG90a2V5c1NlcnZpY2UuYWRkKGhvdGtleSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmV3SG90a2V5KGNvbWJvOiBzdHJpbmcsIGZuOiBGdW5jdGlvbik6IEhvdGtleSB7XG4gICAgICAgIHJldHVybiBuZXcgSG90a2V5KGNvbWJvLCAoKSA9PiB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LCBbJ0lOUFVUJywgJ1NFTEVDVCcsICdURVhUQVJFQSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyVG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpbmcpIHJldHVybjtcblxuICAgICAgICB0aGlzLmFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRvZ2dsZURvbmUoKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBjb2x1bW4gc2l6ZS4gVGhlIG1pbmltdW0gdmFsdWUgaXMgMTQuMjg2ZW0sIHdoaWNoIGlzIGVxdWFscyB0byAyMDBweCBkdW8gdG8gdGhlIGN1cnJlbnQgZm9udCBzaXplLlxuICAgICAqIEBwYXJhbSBsYWJlbCBDb2x1bW4gbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sV2lkdGgobGFiZWw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzaXplID0gbGFiZWwubGVuZ3RoO1xuICAgICAgICBpZiAoc2l6ZSA8IDE0LjI4NikgcmV0dXJuIGAxNC4yODZlbWA7XG4gICAgICAgIHJldHVybiBgJHtzaXplfWVtYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2NhbGUoc2NhbGU6IGFueSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRnVuY3Rpb24oc2NhbGUpID8gc2NhbGUoKSA6IHNjYWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNGdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbnRlZ2VyTWFza0NvbmZpZyhjb2w6IEJpZ251bWJlckZpZWxkQ29uZmlnIHwgTnVtYmVyRmllbGRDb25maWcpOiBNYXNrQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNjYWxlOiAwLFxuICAgICAgICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8udGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RG91YmxlTWFza0NvbmZpZyhjb2w6IE51bWJlckZpZWxkQ29uZmlnIHwgQmlnbnVtYmVyRmllbGRDb25maWcpOiBNYXNrQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLmdldFNjYWxlKGNvbC5zY2FsZSksXG4gICAgICAgICAgICBkZWNpbWFsU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8uZGVjaW1hbFNlcGFyYXRvcixcbiAgICAgICAgICAgIHRob3VzYW5kc1NlcGFyYXRvcjogY29sLm51bWJlckxvY2FsZU9wdGlvbnM/LnRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIHByZWZpeDogJycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vbmV5TWFza0NvbmZpZyhjb2w6IEN1cnJlbmN5RmllbGRDb25maWcpOiBNYXNrQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNjYWxlOiB0aGlzLmdldFNjYWxlKGNvbC5zY2FsZSksXG4gICAgICAgICAgICBkZWNpbWFsU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8uZGVjaW1hbFNlcGFyYXRvcixcbiAgICAgICAgICAgIHRob3VzYW5kc1NlcGFyYXRvcjogY29sLm51bWJlckxvY2FsZU9wdGlvbnM/LnRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIHByZWZpeDogY29sLm51bWJlckxvY2FsZU9wdGlvbnM/LmN1cnJlbmN5U3ltYm9sLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROdW1iZXJNYXNrQ29uZmlnKGNvbDogTnVtYmVyRmllbGRDb25maWcgfCBCaWdudW1iZXJGaWVsZENvbmZpZyk6IE1hc2tDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IHRoaXMuZ2V0U2NhbGUoY29sLnNjYWxlKSxcbiAgICAgICAgICAgIGRlY2ltYWxTZXBhcmF0b3I6IGNvbC5udW1iZXJMb2NhbGVPcHRpb25zPy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8udGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJlZml4OiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8uY3VycmVuY3lTeW1ib2wsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sOiBEeW5hbWljVHlwZSwgcm93RGF0YTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkSGFzTWFzayhjb2wpKSB7XG4gICAgICAgICAgICBjb25zdCBfbWFzayA9IGNvbC5tYXNrO1xuICAgICAgICAgICAgY29uc3QgaXNGdW5jdGlvbiA9IHRoaXMuaXNGdW5jdGlvbihfbWFzayk7XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbiA/IChfbWFzayBhcyBGdW5jdGlvbikoeyB2YWx1ZTogcm93RGF0YSB9KSA6IF9tYXNrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkSGFzTWFzayhmaWVsZDogRHluYW1pY1R5cGUpOiBmaWVsZCBpcyBOdW1iZXJGaWVsZENvbmZpZyB8IEJpZ251bWJlckZpZWxkQ29uZmlnIHwgVGV4dEZpZWxkQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBmaWVsZC50eXBlID09PSAnYmlnTnVtYmVyJyB8fFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2RlY2ltYWwnIHx8XG4gICAgICAgICAgICBmaWVsZC50eXBlID09PSAndGV4dCcgfHxcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdiaW5hcnknXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVSb3dEb3VibGVDbGljayhyb3dEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IFtyb3dEYXRhXTtcbiAgICAgICAgdGhpcy5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRGb2N1c0ZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlhbG9nVmlzaWJsZSAmJiAhdGhpcy5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5sb29rdXBEaWFsb2dDb250YWluZXIoKT8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgICAgKGlucHV0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9zdWJzY3JpYmVFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25TZWFyY2hSZXF1ZXN0LnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gdHJ1ZSkpO1xuXG4gICAgICAgIHRoaXMub25TZWxlY3QucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25DaGFuZ2U/Lih0aGlzLnZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5vblVuc2VsZWN0LnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uQ2hhbmdlPy4odGhpcy52YWx1ZSkpO1xuXG4gICAgICAgIHRoaXMub25DbGVhci5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlPy4obnVsbCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25Gb2N1cy5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQ/LigpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uQmx1ci5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHRoaXMubG9va3VwRGlzcGxheUZpZWxkKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZVt0aGlzLmxvb2t1cERpc3BsYXlGaWVsZF07XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSB0YXJnZXQ7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlIHx8ICFjdXJyZW50VmFsdWUgfHwgY3VycmVudFZhbHVlID09IHZhbHVlKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gJyc7XG4gICAgICAgICAgICB0YXJnZXQudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2U/LihuZXdWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb29sZWFuT3B0aW9uc0xhYmVsQ29uZmlnIHtcbiAgICB0cnVlOiBzdHJpbmc7XG4gICAgZmFsc2U6IHN0cmluZztcbiAgICBlbXB0eT86IHN0cmluZztcbiAgICBjbGVhcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEJvb2xlYW5PcHRpb25zTGFiZWwge1xuICAgIHB1YmxpYyB0cnVlOiBzdHJpbmc7XG4gICAgcHVibGljIGZhbHNlOiBzdHJpbmc7XG4gICAgcHVibGljIGVtcHR5Pzogc3RyaW5nO1xuICAgIHB1YmxpYyBjbGVhcj86IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogQm9vbGVhbk9wdGlvbnNMYWJlbENvbmZpZykge1xuICAgICAgICB0aGlzLnRydWUgPSBjb25maWcudHJ1ZTtcbiAgICAgICAgdGhpcy5mYWxzZSA9IGNvbmZpZy5mYWxzZTtcbiAgICAgICAgdGhpcy5lbXB0eSA9IGNvbmZpZy5lbXB0eTtcbiAgICAgICAgdGhpcy5jbGVhciA9IGNvbmZpZy5jbGVhcjtcbiAgICB9XG59XG5cbiIsIjxkaXYgW25nQ2xhc3NdPVwieyBpbnB1dGdyb3VwOiBzaG93U2VhcmNoIH1cIj5cbiAgICA8cC1hdXRvQ29tcGxldGVcbiAgICAgICAgI2F1dG9jb21wbGV0ZVxuICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW2RhdGFLZXldPVwiZGF0YUtleVwiXG4gICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgIFtpbnB1dElkXT1cImlkICsgJy1hdXRvY29tcGxldGUnXCJcbiAgICAgICAgW2ZvcmNlU2VsZWN0aW9uXT1cImF1dG9jb21wbGV0ZUZvcmNlU2VsZWN0aW9uXCJcbiAgICAgICAgW3N1Z2dlc3Rpb25zXT1cImdldExvb2t1cFN1Z2dlc3Rpb25zKClcIlxuICAgICAgICAoY29tcGxldGVNZXRob2QpPVwib25Db21wbGV0ZU1ldGhvZCgkZXZlbnQpXCJcbiAgICAgICAgKG9uU2VsZWN0KT1cIm9uU2VsZWN0Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgIChvbkJsdXIpPVwib25CbHVyLm5leHQoJGV2ZW50KVwiXG4gICAgICAgIChvbkZvY3VzKT1cIm9uRm9jdXMubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgKG9uVW5zZWxlY3QpPVwib25VbnNlbGVjdC5uZXh0KCRldmVudClcIlxuICAgICAgICAob25DbGVhcik9XCJvbkNsZWFyLm5leHQoJGV2ZW50KVwiXG4gICAgICAgIChvbktleVVwKT1cIm9uS2V5VXAubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW2ZpZWxkXT1cImxvb2t1cERpc3BsYXlGaWVsZFwiXG4gICAgICAgIFtlbXB0eU1lc3NhZ2VdPVwibG9va3VwRW1wdHlNZXNzYWdlXCJcbiAgICAgICAgW2Ryb3Bkb3duXT1cIiFzaG93U2VhcmNoXCJcbiAgICAgICAgW2FwcGVuZFRvXT1cImxvb2t1cEFwcGVuZFRvXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8ICcgJ1wiXG4gICAgICAgIFthdXRvSGlnaGxpZ2h0XT1cInRydWVcIlxuICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJtb3VzZXRyYXBcIlxuICAgID5cbiAgICA8L3AtYXV0b0NvbXBsZXRlPlxuICAgIEBpZiAoc2hvd1NlYXJjaCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvbi1hZGRvblwiXG4gICAgICAgICAgICBbY2xhc3MuYnV0dG9uLWFkZG9uLS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEaWFsb2coKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cblxuPHMtZGlhbG9nXG4gICAgWyh2aXNpYmxlKV09XCJkaWFsb2dWaXNpYmxlXCJcbiAgICAodmlzaWJsZUNoYW5nZSk9XCJvblZpc2libGVDaGFuZ2UoJGV2ZW50ISlcIlxuICAgIFtoZWFkZXJdPVwibGFiZWxPcHRpb25zPy5zZWFyY2hUaXRsZSB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmFkdmFuY2VkX3NlYXJjaCcgfCB0cmFuc2xhdGVcIlxuICAgIGNvbnRlbnRDbGFzc05hbWU9XCJzLWxvb2t1cC1tb2RhbFwiXG4gICAgW3NpemVdPVwiZGlhbG9nRnVsbFNjcmVlbigpID8gJ2Z1bGxzY3JlZW4nIDogJ3hsJ1wiXG4+XG4gICAgQGlmIChkaWFsb2dWaXNpYmxlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwicy1sb29rdXAtbW9kYWwtY29udGFpbmVyXCJcbiAgICAgICAgICAgICNkaWFsb2dDb250YWluZXJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChzZWFyY2hGaWVsZHMgJiYgc2VhcmNoRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBbQGNvbGxhcHNlQ29udGVudF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyB2YWx1ZTogJ2hpZGRlbicsIHBhcmFtczogeyB0cmFuc2l0aW9uUGFyYW1zOiB0cmFuc2l0aW9uT3B0aW9ucyB9IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6ICd2aXNpYmxlJywgcGFyYW1zOiB7IHRyYW5zaXRpb25QYXJhbXM6IHRyYW5zaXRpb25PcHRpb25zIH0gfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoQGNvbGxhcHNlQ29udGVudC5kb25lKT1cIm9uVG9nZ2xlRG9uZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBub3ZhbGlkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0BjaGlsZENvbGxhcHNlQ29udGVudF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyB2YWx1ZTogJzpsZWF2ZScsIHBhcmFtczogeyB0cmFuc2l0aW9uUGFyYW1zOiB0cmFuc2l0aW9uT3B0aW9ucyB9IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6ICc6ZW50ZXInLCBwYXJhbXM6IHsgdHJhbnNpdGlvblBhcmFtczogdHJhbnNpdGlvbk9wdGlvbnMgfSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXRpdGxlIHNkcy1zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbE9wdGlvbnM/LmZpbHRlclRpdGxlIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtZHluYW1pYy1mb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbmZpZ3NdPVwic2VhcmNoRmllbGRzRHluYW1pY1N0cnVjdHVyZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybUdyb3VwRGlhbG9nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1keW5hbWljLWZvcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWctMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1maWx0ZXItYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9wdGlvbnM/LmZpbHRlckxhYmVsIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZmlsdGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1Rvb2x0aXA9XCIoQUxUICsgU0hJRlQgKyBGKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctY2xlYXItYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9wdGlvbnM/LmNsZWFyTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5jbGVhcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJjbGVhcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJsaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1Rvb2x0aXA9XCIoQUxUICsgU0hJRlQgKyBMKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoc2VhcmNoRmllbGRzICYmIHNlYXJjaEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWQgKyAnLWZpbHRlci10b2dnbGUtYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJUb2dnbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZmEtY2hldnJvbi1sZWZ0JzogIWNvbGxhcHNlZCwgJ2ZhLWNoZXZyb24tcmlnaHQnOiBjb2xsYXBzZWQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAbGV0IGlzRW1wdHlDb250ZW50ID0gIXNlYXJjaFRvdGFsUmVjb3JkcyAmJiAhbG9hZGluZztcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICNjb250ZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZW1wdHktY29udGVudCc6IGlzRW1wdHlDb250ZW50IH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAoaXNFbXB0eUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctZW1wdHktc3RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9wdGlvbnM/LnNlYXJjaEVtcHR5VGl0bGUgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCJzZWFyY2hFbXB0eURlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzcz1cImZhIGZhLXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9zLWVtcHR5LXN0YXRlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jaGlsZFwiPlxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFLZXldPVwiZGF0YUtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0R3JpZERhdGEoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJzZWFyY2hHcmlkRmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYXp5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFnaW5hdG9yXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc29ydE1vZGU9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInNlYXJjaFRvdGFsUmVjb3Jkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkR3JpZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aVNvcnRNZXRhXT1cIm11bHRpU29ydE1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1oaWRkZW5dPVwiIXNlYXJjaFRvdGFsUmVjb3JkcyAmJiAhbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJtdWx0aXBsZSA/ICdtdWx0aXBsZScgOiAnc2luZ2xlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKnNMb2FkaW5nU3RhdGU9XCJ7IGxvYWRpbmc6IGxvYWRpbmcsIGluZGljYXRvcjogaW5kaWNhdG9yTG9nbyB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dBZGRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYWRkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25BZGQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RWRpdE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGVkLmxlbmd0aCAhPT0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25FZGl0LmVtaXQodGhpcy5zZWxlY3RlZFswXSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dSZW1vdmVPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5PVwiZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMucmVtb3ZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWxlY3RlZC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uUmVtb3ZlLmVtaXQodGhpcy5zZWxlY3RlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImNvbGdyb3VwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCBzdHlsZT1cIndpZHRoOiA1MHB4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA1MHB4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtdGFibGUtaGVhZGVyLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VBbGxPYmplY3RdPVwibG9va3VwUm93UHJvcHMgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm93UHJvcHNdPVwibG9va3VwUm93UHJvcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3MtdGFibGUtaGVhZGVyLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cImNvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwic29ydGFibGVDb2x1bW5zRGlzYWJsZWQuaW5jbHVkZXMoY29sLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VuaW9yLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbmlvci1oZWFkZXItdGl0bGVcIj57eyBjb2wubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIXNvcnRhYmxlQ29sdW1uc0Rpc2FibGVkLmluY2x1ZGVzKGNvbC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5uYW1lXCI+IDwvcC1zb3J0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0RhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc05hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93XT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3dJbmRleF09XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNEb3VibGVDbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Eb3VibGVDbGljayk9XCJvblRhYmxlUm93RG91YmxlQ2xpY2socm93RGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNTBweFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10YWJsZUNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJyb3dEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93XT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtdGFibGVDaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIHNlYXJjaEdyaWRGaWVsZHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldEZpZWxkV2lkdGgoY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3dpdGNoXT1cImNvbC50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKGNvbC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQm9vbGVhblZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCb29sZWFuTGFiZWwocm93RGF0YSwgY29sLm5hbWUsIGNvbC5vcHRpb25zTGFiZWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWREYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wuY2FsZW5kYXJMb2NhbGVPcHRpb25zPy5kYXRlRm9ybWF0IHx8ICdMJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdkYXRlVGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpIHwgbG9jYWxpemVkRGF0ZSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2xvY2FsRGF0ZVRpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKSB8IGxvY2FsaXplZERhdGUgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSk7IGVsc2UgZW1wdHlUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9jYWxpemVkVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmNhbGVuZGFyTG9jYWxlT3B0aW9ucz8uZGF0ZUZvcm1hdCB8fCAnTFRTJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOdW1iZXIocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWRCaWdudW1iZXI6IGdldEludGVnZXJNYXNrQ29uZmlnKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdkZWNpbWFsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9jYWxpemVkQmlnbnVtYmVyOiBnZXREb3VibGVNYXNrQ29uZmlnKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdjdXJyZW5jeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc051bWJlcihyb3dEYXRhLCBjb2wubmFtZSk7IGVsc2UgZW1wdHlUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaXplZEJpZ251bWJlcjogZ2V0TW9uZXlNYXNrQ29uZmlnKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdiaWdOdW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOdW1iZXIocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWRCaWdudW1iZXI6IGdldE51bWJlck1hc2tDb25maWcoY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYWJlbEZvclZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGVtcHR5VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB3aXRoQmFkZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHdpdGhvdXRCYWRnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhCYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhYmVsRm9yVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFkZ2VGcm9tVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8udHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFkZ2VGcm9tVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5pY29uQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uaWNvblBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aG91dEJhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFiZWxGb3JWYWx1ZShnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKSwgY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkSGFzTWFzayhjb2wpICYmIHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sLCByb3dEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc01hc2tGb3JtYXR0ZXI6IHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sLCByb3dEYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBlbXB0eVRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLmRhdGEtaGlkZGVuXT1cImxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJpbnRSZWNvcmRUb3RhbGl6ZXIoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgc1RlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1jYW5jZWwtYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxPcHRpb25zPy5jYW5jZWxMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNhbmNlbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJoaWRlRGlhbG9nKClcIlxuICAgICAgICAgICAgICAgICAgICBzVG9vbHRpcD1cIihBTFQgKyBTSElGVCArIEMpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1zZWxlY3QtYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxPcHRpb25zPy5zZWxlY3RMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHNUb29sdGlwPVwiKEFMVCArIFNISUZUICsgUylcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICB9XG48L3MtZGlhbG9nPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VGVtcGxhdGU+XG4gICAgPHNwYW4gY2xhc3M9XCJzZHMtZW1wdHktdmFsdWVcIj5cbiAgICAgICAge3sgbGFiZWxPcHRpb25zPy5lbXB0eUZpZWxkTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub3RfaW5mb3JtZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
|
|
688
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vY29tcG9uZW50cy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9keW5hbWljLWZvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vY29tcG9uZW50cy9sb29rdXAvbG9va3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdHLE9BQU8sRUFFSCxTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxFQUlMLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUgsV0FBVyxFQUNYLFNBQVMsRUFDVCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUN0QixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFFckMsT0FBTyxFQUFFLFlBQVksRUFBNkIsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVB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TUFBTTtzQkFGWixNQUFNO2dCQU1BLE9BQU87c0JBRmIsTUFBTTtnQkFNQSxRQUFRO3NCQUZkLE1BQU07Z0JBTUEsVUFBVTtzQkFGaEIsTUFBTTtnQkFNQSxPQUFPO3NCQUZiLE1BQU07Z0JBTUEsS0FBSztzQkFGWCxNQUFNO2dCQU1BLE1BQU07c0JBRlosTUFBTTtnQkFNQSxRQUFRO3NCQUZkLE1BQU07Z0JBTUEsa0JBQWtCO3NCQUZ4QixNQUFNO2dCQUtBLEtBQUs7c0JBRFgsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QixZQUFZO3NCQURsQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSW5DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBK01PLFVBQVU7QUEyUzNCLE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsSUFBSSxDQUFTO0lBQ2IsS0FBSyxDQUFTO0lBQ2QsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFVO0lBRXRCLFlBQVksTUFBaUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIGFuaW1hdGVDaGlsZCwgZ3JvdXAsIHF1ZXJ5LCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5wdXQsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgdmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1Db250cm9sLFxuICAgIEZvcm1Hcm91cCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWFza0NvbmZpZyB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9uZzItY3VycmVuY3ktbWFzayc7XG5pbXBvcnQgeyBIb3RrZXksIEhvdGtleXNTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhcjItaG90a2V5cyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTb3J0TWV0YSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEF1dG9Db21wbGV0ZSwgQXV0b0NvbXBsZXRlQ29tcGxldGVFdmVudCwgQXV0b0NvbXBsZXRlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgVGFibGUsIFRhYmxlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIgfSBmcm9tICcuL3R5cGVzL2RlZmF1bHQtZmlsdGVyJztcbmltcG9ydCB7IExhYmVsT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMvbGFiZWwtb3B0aW9ucyc7XG5cbmltcG9ydCB7IExvYWRpbmdTdGF0ZUluZGljYXRvcnMsIExvYWRpbmdTdGF0ZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9hZGluZy1zdGF0ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckxvY2FsZU9wdGlvbnMsIExvY2FsZU1vZHVsZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvbG9jYWxlJztcbmltcG9ydCB7IENoZWNrRGlzYWJsZWQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3NoYXJlZCc7XG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RpYWxvZyc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYsIE5nU3dpdGNoIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVtcHR5U3RhdGVNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2VtcHR5LXN0YXRlJztcbmltcG9ydCB7IEJhZGdlTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9iYWRnZSc7XG5pbXBvcnQgeyBNYXNrRm9ybWF0dGVyTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9tYXNrJztcbmltcG9ydCB7IFRhYmxlSGVhZGVyQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3RhYmxlLWhlYWRlcic7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbXBvbmVudCwgZHluYW1pY1R5cGVUb0R5bmFtaWNTdHJ1Y3R1cmUgfSBmcm9tICcuLi8uLi9keW5hbWljLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEV4cGFuZGVkRHluYW1pY1R5cGUgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9ucy9zdHJ1Y3R1cmUvcm93JztcbmltcG9ydCB7IFNlbGVjdEZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvc2VsZWN0LWZpZWxkJztcbmltcG9ydCB7IEJpZ251bWJlckZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvYmlnbnVtYmVyLWZpZWxkJztcbmltcG9ydCB7IE51bWJlckZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvbnVtYmVyLWZpZWxkJztcbmltcG9ydCB7IEN1cnJlbmN5RmllbGRDb25maWcgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkL2NvbmZpZ3VyYXRpb25zL2ZpZWxkcy9jdXJyZW5jeS1maWVsZCc7XG5pbXBvcnQgeyBUZXh0RmllbGRDb25maWcgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkL2NvbmZpZ3VyYXRpb25zL2ZpZWxkcy90ZXh0LWZpZWxkJztcbmltcG9ydCB7IER5bmFtaWNUeXBlIH0gZnJvbSAnLi4vLi4vZm9ybS1maWVsZC9jb25maWd1cmF0aW9ucy9maWVsZHMvZmllbGQnO1xuaW1wb3J0IHsgRHluYW1pY1N0cnVjdHVyZSB9IGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb25zL3N0cnVjdHVyZS9zdHJ1Y3R1cmUnO1xuaW1wb3J0IHsgVGVtcGxhdGVNb2R1bGUgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL3RlbXBsYXRlJztcbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBdXRvQ29tcGxldGVNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBEaWFsb2dDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXG4gICAgICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgRW1wdHlTdGF0ZU1vZHVsZSxcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIExvYWRpbmdTdGF0ZU1vZHVsZSxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBMb2NhbGVNb2R1bGUsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIEJhZGdlTW9kdWxlLFxuICAgICAgICBNYXNrRm9ybWF0dGVyTW9kdWxlLFxuICAgICAgICBOZ1N3aXRjaCxcbiAgICAgICAgVGFibGVIZWFkZXJDaGVja2JveE1vZHVsZSxcbiAgICAgICAgVGVtcGxhdGVNb2R1bGUsXG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ3MtbG9va3VwJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbG9va3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9sb29rdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBMb29rdXBDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignY29sbGFwc2VDb250ZW50JywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwcHgnLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnKicsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA8PT4gaGlkZGVuJywgW1xuICAgICAgICAgICAgICAgIGdyb3VwKFtxdWVyeSgnQGNoaWxkQ29sbGFwc2VDb250ZW50JywgYW5pbWF0ZUNoaWxkKCkpLCBhbmltYXRlKCd7e3RyYW5zaXRpb25QYXJhbXN9fScpXSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgXSksXG4gICAgICAgIHRyaWdnZXIoJ2NoaWxkQ29sbGFwc2VDb250ZW50JywgW1xuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJzpsZWF2ZScsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICc6ZW50ZXInLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCcqIDw9PiAqJywgYW5pbWF0ZSgne3t0cmFuc2l0aW9uUGFyYW1zfX0nKSksXG4gICAgICAgIF0pLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIExvb2t1cENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cERpYWxvZ0NvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ2RpYWxvZ0NvbnRhaW5lcicpO1xuICAgIHByb3RlY3RlZCByb3dUeXBlID0gJ1Jvdyc7XG4gICAgcHVibGljIGluZGljYXRvckxvZ28gPSBMb2FkaW5nU3RhdGVJbmRpY2F0b3JzLkxvZ287XG4gICAgcHVibGljIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZm9ybUNvbnRyb2xOYW1lPzogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgcy1sb29rdXAtJHtMb29rdXBDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9jb21wbGV0ZUZvcmNlU2VsZWN0aW9uID0gdHJ1ZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlID0gZmFsc2U7XG5cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIHB1YmxpYyBkYXRhS2V5ITogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dTZWFyY2ggPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9va3VwU3VnZ2VzdGlvbnM6IGFueVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBEaXNwbGF5RmllbGQ/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBEaXNwbGF5RmllbGRUb29sdGlwID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb29rdXBFbXB0eU1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB2YWx1ZSA/PyAnYm9keScgfSlcbiAgICBwdWJsaWMgbG9va3VwQXBwZW5kVG8/ID0gJ2JvZHknO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoRW1wdHlEZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaEdyaWREYXRhOiBhbnlbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoVG90YWxSZWNvcmRzID0gMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaEZpZWxkczogRHluYW1pY1R5cGVbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2VhcmNoR3JpZEZpZWxkczogRHluYW1pY1R5cGVbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbXVsdGlTb3J0TWV0YTogU29ydE1ldGFbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzb3J0YWJsZUNvbHVtbnNEaXNhYmxlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxvb2t1cFJvd1Byb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVmYXVsdEZpbHRlcjogRGVmYXVsdEZpbHRlcltdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93QWRkT3B0aW9uID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93RWRpdE9wdGlvbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2hvd1JlbW92ZU9wdGlvbiA9IGZhbHNlO1xuXG4gICAgZGlhbG9nRnVsbFNjcmVlbiA9IGlucHV0KGZhbHNlKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvbkxvb2t1cFJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25TZWFyY2hSZXF1ZXN0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uS2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgICBwdWJsaWMgb25VbnNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvbkNsZWFyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uQWRkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bj4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICAgIHB1YmxpYyBvblJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dW5rbm93bltdPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gICAgcHVibGljIG9uQ2xlYXJCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxuICAgIHB1YmxpYyB0YWJsZTogVGFibGUgfCBudWxsID0gbnVsbDtcblxuICAgIEBWaWV3Q2hpbGQoQXV0b0NvbXBsZXRlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICBwdWJsaWMgYXV0b2NvbXBsZXRlOiBBdXRvQ29tcGxldGUgfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxhYmVsT3B0aW9ucz86IFBhcnRpYWw8TGFiZWxPcHRpb25zPjtcblxuICAgIHB1YmxpYyB2YWx1ZTogYW55O1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGFuaW1hdGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBkaWFsb2dWaXNpYmxlID0gZmFsc2U7XG4gICAgcHVibGljIGNvbGxhcHNlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZDogYW55W10gPSBbXTtcbiAgICBwdWJsaWMgZm9ybUdyb3VwRGlhbG9nITogRm9ybUdyb3VwPGFueT47XG4gICAgcHVibGljIHRyYW5zaXRpb25PcHRpb25zID0gJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKSc7XG5cbiAgICBwcm90ZWN0ZWQgc2VhcmNoRmllbGRzRHluYW1pY1N0cnVjdHVyZTogRHluYW1pY1N0cnVjdHVyZVtdID0gW107XG5cbiAgICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBvblRvdWNoZWQ/OiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIG9yaWdpbmFsRm9ybVZhbHVlcyA9IHt9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBob3RrZXlzU2VydmljZTogSG90a2V5c1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICkge31cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaEdyaWRGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEdyaWRGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNlYXJjaEZpZWxkc0R5bmFtaWNTdHJ1Y3R1cmUgPSBkeW5hbWljVHlwZVRvRHluYW1pY1N0cnVjdHVyZShcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoRmllbGRzLm1hcCgoc2VhcmNoRmllbGQ6IEV4cGFuZGVkRHluYW1pY1R5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZC5zaXplID0geyBzbTogMTIsIG1kOiAxMiwgbGc6IDEyLCB4bDogMTIgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5zZWFyY2hGaWVsZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hHcmlkRmllbGRzID0gdGhpcy5zZWFyY2hHcmlkRmllbGRzLm1hcCgoZ3JpZEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBncmlkVHlwZSA9IGdyaWRGaWVsZC50eXBlO1xuICAgICAgICAgICAgaWYgKGdyaWRGaWVsZC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIChncmlkRmllbGQgYXMgYW55KVsnd2lkdGgnXSA9IHRoaXMuZ2V0Q29sV2lkdGgoZ3JpZEZpZWxkLmxhYmVsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyaWRUeXBlID09PSAnY2FsZW5kYXInIHx8IGdyaWRUeXBlID09PSAnZGF0ZScgfHwgZ3JpZFR5cGUgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGVuZGFyT3B0aW9ucyA9IG5ldyBDYWxlbmRhckxvY2FsZU9wdGlvbnMoeyAuLi5ncmlkRmllbGQuY2FsZW5kYXJMb2NhbGVPcHRpb25zIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhbGVuZGFyT3B0aW9ucz8uZGF0ZUZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGdyaWRGaWVsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMuZGF0ZUZvcm1hdCA9IHRoaXMuX2NvbnZlcnRUb01vbWVudERhdGVGb3JtYXQoY2FsZW5kYXJPcHRpb25zLmRhdGVGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGltZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJPcHRpb25zLmRhdGVGb3JtYXQgPSB0aGlzLl9jb252ZXJ0VG9Nb21lbnRIb3VyRm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMuaG91ckZvcm1hdCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyT3B0aW9ucy5kYXRlRm9ybWF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZ3JpZEZpZWxkLmNhbGVuZGFyTG9jYWxlT3B0aW9ucyA9IGNhbGVuZGFyT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBncmlkRmllbGQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhc0ZpZWxkV2l0aERvdEluTmFtZSA9IHRoaXMuc2VhcmNoRmllbGRzLnNvbWUoKGZpZWxkKSA9PiBmaWVsZC5uYW1lLmluY2x1ZGVzKCcuJykpO1xuICAgICAgICBpZiAoaGFzRmllbGRXaXRoRG90SW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNXaXRoRG90ID0gdGhpcy5zZWFyY2hGaWVsZHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLm5hbWUuaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLm5hbWUpXG4gICAgICAgICAgICAgICAgLmpvaW4oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhpcyBmaWVsZHM6IFske2ZpZWxkc1dpdGhEb3R9XSAgY2FuJ3QgaGF2ZSBkb3QgaW4gdGhlaXIgbmFtZXMsIHBsZWFzZSByZXBsYWNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuc2VhcmNoRmllbGRzLnJlZHVjZSgocmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IEZvcm1Db250cm9sIH0sIGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9ICdkZWZhdWx0VmFsdWUnIGluIGZpZWxkID8gZmllbGQuZGVmYXVsdFZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtmaWVsZC5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgICh0aGlzLm9yaWdpbmFsRm9ybVZhbHVlcyBhcyBhbnkpW2ZpZWxkLm5hbWVdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwRGlhbG9nID0gbmV3IEZvcm1Hcm91cChmb3JtR3JvdXApO1xuXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZUV2ZW50cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludFJlY29yZFRvdGFsaXplcigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5sYWJlbE9wdGlvbnM/LnNlYXJjaFRvdGFsUmVjb3Jkc0xhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYWJlbE9wdGlvbnM/LnNlYXJjaFRvdGFsUmVjb3Jkc0xhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkTGFiZWwgPSB0aGlzLmxhYmVsT3B0aW9ucz8ucmVjb3JkTGFiZWxcbiAgICAgICAgICAgID8gYCR7dGhpcy5zZWFyY2hUb3RhbFJlY29yZHN9ICR7dGhpcy5sYWJlbE9wdGlvbnM/LnJlY29yZExhYmVsfWBcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmQnLCB7XG4gICAgICAgICAgICAgICAgICBjb3VudDogdGhpcy5zZWFyY2hUb3RhbFJlY29yZHMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZHNMYWJlbCA9IHRoaXMubGFiZWxPcHRpb25zPy5yZWNvcmRzTGFiZWxcbiAgICAgICAgICAgID8gYCR7dGhpcy5zZWFyY2hUb3RhbFJlY29yZHN9ICR7dGhpcy5sYWJlbE9wdGlvbnM/LnJlY29yZHNMYWJlbH1gXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudG90YWxfcmVjb3JkcycsIHtcbiAgICAgICAgICAgICAgICAgIGNvdW50OiB0aGlzLnNlYXJjaFRvdGFsUmVjb3JkcyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVG90YWxSZWNvcmRzID09PSAxID8gcmVjb3JkTGFiZWwgOiByZWNvcmRzTGFiZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY29udmVydFRvTW9tZW50SG91ckZvcm1hdChob3VyRm9ybWF0OiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdkZC9tbS95eScpIHtcbiAgICAgICAgICAgIC8vIHZhbG9yIHBhZHLDo28gcGFyYSBvIGZvcm1hdC5cbiAgICAgICAgICAgIHJldHVybiAnTFRTJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChob3VyRm9ybWF0ID09PSAnMTInKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcYkhcXGIvLCAnaCcpIC8vIGhvdXIgKDEyIGhvdXIgdGltZSkgKG5vIGxlYWRpbmcgemVybylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxiSEhcXGIvLCAnaGgnKTsgLy8gaG91ciAoMTIgaG91ciB0aW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvdXJGb3JtYXQgPT09ICcyNCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxiaFxcYi8sICdIJykgLy8gaG91ciAoMjQgaG91ciB0aW1lKSAobm8gbGVhZGluZyB6ZXJvKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJoaFxcYi8sICdISCcpOyAvLyBob3VyICgyNCBob3VyIHRpbWUpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NvbnZlcnRUb01vbWVudERhdGVGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBBIG9yZGVtIGRvcyByZXBsYWNlcyDDqSBpbXBvcnRhbnRlLlxuICAgICAgICByZXR1cm4gZm9ybWF0XG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiZFxcYi8sICdEJykgLy8gZGF5IG9mIG1vbnRoIChubyBsZWFkaW5nIHplcm8pXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxiZGRcXGIvLCAnREQnKSAvLyBkYXkgb2YgbW9udGhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJvXFxiLywgJ0RERCcpIC8vIGRheSBvZiB0aGUgeWVhciAobm8gbGVhZGluZyB6ZXJvKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYm9vXFxiLywgJ0REREQnKSAvLyBkYXkgb2YgdGhlIHllYXJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJNXFxiLywgJ01NTScpIC8vIG1vbnRoIG5hbWUgc2hvcnRcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJNTVxcYi8sICdNTU1NJykgLy8gbW9udGggbmFtZSBsb25nXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxibVxcYi8sICdNJykgLy8gbW9udGggb2YgeWVhciAobm8gbGVhZGluZylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJtbVxcYi8sICdNTScpIC8vIG1vbnRoIG9mIHllYXJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJ5XFxiLywgJ1lZJykgLy8geWVhciAodHdvIGRpZ2l0cylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJ5eVxcYi8sICdZWVlZJyk7IC8vIHllYXIgKGZvdXIgZGlnaXRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ1Zpc2libGUgJiYgY2hhbmdlc1snc2VhcmNoR3JpZERhdGEnXSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRGb2N1c0ZpbHRlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEdyaWREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hHcmlkRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9va3VwU3VnZ2VzdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvb2t1cFN1Z2dlc3Rpb25zO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtYWtlU2VhcmNoUmVxdWVzdFBhcmFtcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZvcm1Hcm91cERpYWxvZz8uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyAuLi5ldmVudCwgZmlsdGVyRGF0YTogZmlsdGVycyB9O1xuICAgICAgICBjb25zdCB7IG11bHRpU29ydE1ldGEgfSA9IGV2ZW50O1xuICAgICAgICB0aGlzLm11bHRpU29ydE1ldGEgPSBtdWx0aVNvcnRNZXRhIHx8IHRoaXMubXVsdGlTb3J0TWV0YTtcblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIHB1YmxpYyBsYXp5TG9hZEdyaWQoZXZlbnQ6IGFueSkge1xuICAgICAgICAvLyBBbyBkZWZpbmlyIHVtYSBvcmRlbmHDp8OjbyBuYSB0YWJlbGEgZG8gbG9va3VwIGVzc2UgbcOpdG9kbyDDqSBjaGFtYWRvIDIgdmV6ZXMgaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVuZy9pc3N1ZXMvNTQ4MFxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLm1ha2VTZWFyY2hSZXF1ZXN0UGFyYW1zKGV2ZW50KTtcbiAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QubmV4dChwYXJhbXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNvbXBsZXRlTWV0aG9kKGV2ZW50OiBBdXRvQ29tcGxldGVDb21wbGV0ZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hdXRvY29tcGxldGVGb3JjZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZT8uKHRoaXMudmFsdWUgPT09ICcnID8gbnVsbCA6IHRoaXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkxvb2t1cFJlcXVlc3QubmV4dChldmVudC5xdWVyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERlZmF1bHRGaWx0ZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdEZpbHRlcikgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclxuICAgICAgICAgICAgLmZpbHRlcigoeyBmaWVsZCB9KSA9PiB0aGlzLmZvcm1Hcm91cERpYWxvZz8uY29udGFpbnMoZmllbGQpICYmICF0aGlzLmZvcm1Hcm91cERpYWxvZz8uZ2V0KFtmaWVsZF0pPy5kaXJ0eSlcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IHZhbHVlLCBmaWVsZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBEaWFsb2c/LmdldChbZmllbGRdKT8ucGF0Y2hWYWx1ZSh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uID8gdmFsdWUoKSA6IHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIEBDaGVja0Rpc2FibGVkKClcbiAgICBwdWJsaWMgYXN5bmMgc2hvd0RpYWxvZygpIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0RmlsdGVycygpO1xuICAgICAgICB0aGlzLnNlYXJjaEdyaWREYXRhID0gW107XG4gICAgICAgIHRoaXMub25Ub3VjaGVkPy4oKTtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5wYXVzZShbLi4udGhpcy5ob3RrZXlzU2VydmljZS5ob3RrZXlzXSk7XG4gICAgICAgIHRoaXMuc2V0SG90a2V5cygpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZDogYW55ID0gW107XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWQuY29uY2F0KHRoaXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gW3RoaXMudmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHNldElucHV0cyhjb21wb25lbnRSZWY6IGFueSwgY29uZmlnczogYW55LCBmb3JtOiBhbnkpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNvbmZpZ3MgPSBjb25maWdzO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuZm9ybSA9IGZvcm07XG5cbiAgICAgICAgLy8gY2hhbWUgbmdPbkNoYW5nZXMgbWFudWFsbWVudGUgc2UgbmVjZXNzw6FyaW9cbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRSZWYuaW5zdGFuY2UubmdPbkNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5uZ09uQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25WaXNpYmxlQ2hhbmdlKHZpc2liaWxpdHlTdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmlzaWJpbGl0eVN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlRGlhbG9nKCk7XG4gICAgfVxuICAgIHB1YmxpYyBoaWRlRGlhbG9nKCkge1xuICAgICAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbnB1dEVMLCBtdWx0aUlucHV0RWwgfSA9IHRoaXMuYXV0b2NvbXBsZXRlO1xuICAgICAgICB0aGlzLmRpYWxvZ1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS51bnBhdXNlKFsuLi50aGlzLmhvdGtleXNTZXJ2aWNlLnBhdXNlZEhvdGtleXNdKTtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIG11bHRpSW5wdXRFbD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0RUw/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoKCkge1xuICAgICAgICB0aGlzLnJlc2V0VGFibGUoKTtcbiAgICAgICAgdGhpcy5jb2xsYXBzZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBkaWFsb2dDb250YWluZXIgPSB0aGlzLmxvb2t1cERpYWxvZ0NvbnRhaW5lcigpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZGlhbG9nQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBkaWFsb2dDb250YWluZXIuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwRGlhbG9nPy5yZXNldCh0aGlzLm9yaWdpbmFsRm9ybVZhbHVlcyk7XG4gICAgICAgIHRoaXMucmVzZXRUYWJsZSgpO1xuICAgICAgICB0aGlzLm9uQ2xlYXJCdXR0b25DbGljay5lbWl0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0VGFibGUoKSB7XG4gICAgICAgIHRoaXMudGFibGU/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWQgOiB0aGlzLnNlbGVjdGVkWzBdKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkO1xuICAgICAgICB0aGlzLm9uU2VsZWN0Lm5leHQoc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmhpZGVEaWFsb2coKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQ6IGFueSkge1xuICAgICAgICBpZiAoIXNlbGVjdGVkKSByZXR1cm47XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgICBlbHNlIHRoaXMuc2VsZWN0ZWQgPSBbc2VsZWN0ZWRdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICBvbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKHJlc3VsdCwgcHJvcCkgPT4gKHJlc3VsdFtwcm9wXSA9PT0gdW5kZWZpbmVkID8gJycgOiByZXN1bHRbcHJvcF0pLCBvYmopO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCYWRnZUZyb21WYWx1ZSh2YWx1ZTogdW5rbm93biwgZmllbGQ6IFNlbGVjdEZpZWxkQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgZmllbGQub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IGZpZWxkLm9wdGlvbnMoKSA6IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIHJldHVybiBvcHRpb25zPy5maW5kKChvcHQpID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpPy5iYWRnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZTogdW5rbm93biwgZmllbGQ6IFNlbGVjdEZpZWxkQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2YgZmllbGQub3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IGZpZWxkLm9wdGlvbnMoKSA6IGZpZWxkLm9wdGlvbnM7XG4gICAgICAgIGlmICghb3B0aW9ucykgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQpID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmxhYmVsIDogYCR7dmFsdWV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNCb29sZWFuVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0RmllbGRWYWx1ZShvYmosIHBhdGgpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkV2lkdGgoY29sOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIGNvbC53aWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbkxhYmVsKG9iajogYW55LCBwYXRoOiBzdHJpbmcsIG9wdGlvbnNMYWJlbDogQm9vbGVhbk9wdGlvbnNMYWJlbCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoIW9wdGlvbnNMYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmdldEZpZWxkVmFsdWUob2JqLCBwYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNMYWJlbC50cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnNMYWJlbC5mYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBpc051bWJlcihvYmo6IGFueSwgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAhbmV3IEJpZ051bWJlcih0aGlzLmdldEZpZWxkVmFsdWUob2JqLCBwYXRoKSkuaXNOYU4oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SG90a2V5cygpIHtcbiAgICAgICAgY29uc3QgY2xlYXJIb3RrZXkgPSB0aGlzLm5ld0hvdGtleSgnYWx0K3NoaWZ0K2wnLCB0aGlzLmNsZWFyLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmaW5kSG90a2V5ID0gdGhpcy5uZXdIb3RrZXkoJ2FsdCtzaGlmdCtmJywgdGhpcy5zZWFyY2guYmluZCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGhpZGVIb3RrZXkgPSB0aGlzLm5ld0hvdGtleSgnYWx0K3NoaWZ0K2MnLCB0aGlzLmhpZGVEaWFsb2cuYmluZCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdEhvdGtleSA9IHRoaXMubmV3SG90a2V5KCdhbHQrc2hpZnQrcycsIHRoaXMuc2VsZWN0LmJpbmQodGhpcykpO1xuXG4gICAgICAgIGNvbnN0IGJpbmRlZEhvdGtleXMgPSBbY2xlYXJIb3RrZXksIGZpbmRIb3RrZXksIGhpZGVIb3RrZXksIHNlbGVjdEhvdGtleV07XG4gICAgICAgIGJpbmRlZEhvdGtleXMuZm9yRWFjaCgoaG90a2V5OiBIb3RrZXkpID0+IHRoaXMuaG90a2V5c1NlcnZpY2UuYWRkKGhvdGtleSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmV3SG90a2V5KGNvbWJvOiBzdHJpbmcsIGZuOiBGdW5jdGlvbik6IEhvdGtleSB7XG4gICAgICAgIHJldHVybiBuZXcgSG90a2V5KGNvbWJvLCAoKSA9PiB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LCBbJ0lOUFVUJywgJ1NFTEVDVCcsICdURVhUQVJFQSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyVG9nZ2xlKCkge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRpbmcpIHJldHVybjtcblxuICAgICAgICB0aGlzLmFuaW1hdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRvZ2dsZURvbmUoKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBjb2x1bW4gc2l6ZS4gVGhlIG1pbmltdW0gdmFsdWUgaXMgMTQuMjg2ZW0sIHdoaWNoIGlzIGVxdWFscyB0byAyMDBweCBkdW8gdG8gdGhlIGN1cnJlbnQgZm9udCBzaXplLlxuICAgICAqIEBwYXJhbSBsYWJlbCBDb2x1bW4gbmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29sV2lkdGgobGFiZWw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzaXplID0gbGFiZWwubGVuZ3RoO1xuICAgICAgICBpZiAoc2l6ZSA8IDE0LjI4NikgcmV0dXJuIGAxNC4yODZlbWA7XG4gICAgICAgIHJldHVybiBgJHtzaXplfWVtYDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2NhbGUoc2NhbGU6IGFueSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRnVuY3Rpb24oc2NhbGUpID8gc2NhbGUoKSA6IHNjYWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNGdW5jdGlvbih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREb3VibGVNYXNrQ29uZmlnKGNvbDogTnVtYmVyRmllbGRDb25maWcgfCBCaWdudW1iZXJGaWVsZENvbmZpZyk6IE1hc2tDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IHRoaXMuZ2V0U2NhbGUoY29sLnNjYWxlKSxcbiAgICAgICAgICAgIGRlY2ltYWxTZXBhcmF0b3I6IGNvbC5udW1iZXJMb2NhbGVPcHRpb25zPy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8udGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9uZXlNYXNrQ29uZmlnKGNvbDogQ3VycmVuY3lGaWVsZENvbmZpZyk6IE1hc2tDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IHRoaXMuZ2V0U2NhbGUoY29sLnNjYWxlKSxcbiAgICAgICAgICAgIGRlY2ltYWxTZXBhcmF0b3I6IGNvbC5udW1iZXJMb2NhbGVPcHRpb25zPy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8udGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJlZml4OiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8uY3VycmVuY3lTeW1ib2wsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludGVnZXJNYXNrQ29uZmlnKGNvbDogQmlnbnVtYmVyRmllbGRDb25maWcgfCBOdW1iZXJGaWVsZENvbmZpZyk6IE1hc2tDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IDAsXG4gICAgICAgICAgICB0aG91c2FuZHNTZXBhcmF0b3I6IGNvbC5udW1iZXJMb2NhbGVPcHRpb25zPy50aG91c2FuZHNTZXBhcmF0b3IsXG4gICAgICAgICAgICBwcmVmaXg6ICcnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROdW1iZXJNYXNrQ29uZmlnKGNvbDogTnVtYmVyRmllbGRDb25maWcgfCBCaWdudW1iZXJGaWVsZENvbmZpZyk6IE1hc2tDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2NhbGU6IHRoaXMuZ2V0U2NhbGUoY29sLnNjYWxlKSxcbiAgICAgICAgICAgIGRlY2ltYWxTZXBhcmF0b3I6IGNvbC5udW1iZXJMb2NhbGVPcHRpb25zPy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzU2VwYXJhdG9yOiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8udGhvdXNhbmRzU2VwYXJhdG9yLFxuICAgICAgICAgICAgcHJlZml4OiBjb2wubnVtYmVyTG9jYWxlT3B0aW9ucz8uY3VycmVuY3lTeW1ib2wsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sOiBEeW5hbWljVHlwZSwgcm93RGF0YTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmZpZWxkSGFzTWFzayhjb2wpKSB7XG4gICAgICAgICAgICBjb25zdCBfbWFzayA9IGNvbC5tYXNrO1xuICAgICAgICAgICAgY29uc3QgaXNGdW5jdGlvbiA9IHRoaXMuaXNGdW5jdGlvbihfbWFzayk7XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbiA/IChfbWFzayBhcyBGdW5jdGlvbikoeyB2YWx1ZTogcm93RGF0YSB9KSA6IF9tYXNrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkSGFzTWFzayhmaWVsZDogRHluYW1pY1R5cGUpOiBmaWVsZCBpcyBOdW1iZXJGaWVsZENvbmZpZyB8IEJpZ251bWJlckZpZWxkQ29uZmlnIHwgVGV4dEZpZWxkQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdpbnRlZ2VyJyB8fFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIGZpZWxkLnR5cGUgPT09ICdkb3VibGUnIHx8XG4gICAgICAgICAgICBmaWVsZC50eXBlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgZmllbGQudHlwZSA9PT0gJ2JpbmFyeSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWJsZVJvd0RvdWJsZUNsaWNrKHJvd0RhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gW3Jvd0RhdGFdO1xuICAgICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEZvY3VzRmlsdGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kaWFsb2dWaXNpYmxlICYmICF0aGlzLmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmxvb2t1cERpYWxvZ0NvbnRhaW5lcigpPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAoaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudCkuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3N1YnNjcmliZUV2ZW50cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblNlYXJjaFJlcXVlc3QucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+ICh0aGlzLmxvYWRpbmcgPSB0cnVlKSk7XG5cbiAgICAgICAgdGhpcy5vblNlbGVjdC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkNoYW5nZT8uKHRoaXMudmFsdWUpKTtcblxuICAgICAgICB0aGlzLm9uVW5zZWxlY3QucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25DaGFuZ2U/Lih0aGlzLnZhbHVlKSk7XG5cbiAgICAgICAgdGhpcy5vbkNsZWFyLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2U/LihudWxsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbkZvY3VzLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVG91Y2hlZD8uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub25CbHVyLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQodGhpcy5sb29rdXBEaXNwbGF5RmllbGQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlW3RoaXMubG9va3VwRGlzcGxheUZpZWxkXTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRhcmdldDtcblxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgfHwgIWN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWUgPT0gdmFsdWUpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRhcmdldC52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZT8uKG5ld1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb2xlYW5PcHRpb25zTGFiZWxDb25maWcge1xuICAgIHRydWU6IHN0cmluZztcbiAgICBmYWxzZTogc3RyaW5nO1xuICAgIGVtcHR5Pzogc3RyaW5nO1xuICAgIGNsZWFyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQm9vbGVhbk9wdGlvbnNMYWJlbCB7XG4gICAgcHVibGljIHRydWU6IHN0cmluZztcbiAgICBwdWJsaWMgZmFsc2U6IHN0cmluZztcbiAgICBwdWJsaWMgZW1wdHk/OiBzdHJpbmc7XG4gICAgcHVibGljIGNsZWFyPzogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBCb29sZWFuT3B0aW9uc0xhYmVsQ29uZmlnKSB7XG4gICAgICAgIHRoaXMudHJ1ZSA9IGNvbmZpZy50cnVlO1xuICAgICAgICB0aGlzLmZhbHNlID0gY29uZmlnLmZhbHNlO1xuICAgICAgICB0aGlzLmVtcHR5ID0gY29uZmlnLmVtcHR5O1xuICAgICAgICB0aGlzLmNsZWFyID0gY29uZmlnLmNsZWFyO1xuICAgIH1cbn1cblxuIiwiPGRpdiBbbmdDbGFzc109XCJ7IGlucHV0Z3JvdXA6IHNob3dTZWFyY2ggfVwiPlxuICAgIDxwLWF1dG9Db21wbGV0ZVxuICAgICAgICAjYXV0b2NvbXBsZXRlXG4gICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbZGF0YUtleV09XCJkYXRhS2V5XCJcbiAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgW2lucHV0SWRdPVwiaWQgKyAnLWF1dG9jb21wbGV0ZSdcIlxuICAgICAgICBbZm9yY2VTZWxlY3Rpb25dPVwiYXV0b2NvbXBsZXRlRm9yY2VTZWxlY3Rpb25cIlxuICAgICAgICBbc3VnZ2VzdGlvbnNdPVwiZ2V0TG9va3VwU3VnZ2VzdGlvbnMoKVwiXG4gICAgICAgIChjb21wbGV0ZU1ldGhvZCk9XCJvbkNvbXBsZXRlTWV0aG9kKCRldmVudClcIlxuICAgICAgICAob25TZWxlY3QpPVwib25TZWxlY3QubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgKG9uQmx1cik9XCJvbkJsdXIubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgKG9uRm9jdXMpPVwib25Gb2N1cy5uZXh0KCRldmVudClcIlxuICAgICAgICAob25VbnNlbGVjdCk9XCJvblVuc2VsZWN0Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsZWFyKT1cIm9uQ2xlYXIubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgKG9uS2V5VXApPVwib25LZXlVcC5uZXh0KCRldmVudClcIlxuICAgICAgICBbZmllbGRdPVwibG9va3VwRGlzcGxheUZpZWxkXCJcbiAgICAgICAgW2VtcHR5TWVzc2FnZV09XCJsb29rdXBFbXB0eU1lc3NhZ2VcIlxuICAgICAgICBbZHJvcGRvd25dPVwiIXNob3dTZWFyY2hcIlxuICAgICAgICBbYXBwZW5kVG9dPVwibG9va3VwQXBwZW5kVG9cIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJyAnXCJcbiAgICAgICAgW2F1dG9IaWdobGlnaHRdPVwidHJ1ZVwiXG4gICAgICAgIGlucHV0U3R5bGVDbGFzcz1cIm1vdXNldHJhcFwiXG4gICAgPlxuICAgIDwvcC1hdXRvQ29tcGxldGU+XG4gICAgQGlmIChzaG93U2VhcmNoKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uLWFkZG9uXCJcbiAgICAgICAgICAgIFtjbGFzcy5idXR0b24tYWRkb24tLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0RpYWxvZygpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvZGl2PlxuXG48cy1kaWFsb2dcbiAgICBbKHZpc2libGUpXT1cImRpYWxvZ1Zpc2libGVcIlxuICAgICh2aXNpYmxlQ2hhbmdlKT1cIm9uVmlzaWJsZUNoYW5nZSgkZXZlbnQhKVwiXG4gICAgW2hlYWRlcl09XCJsYWJlbE9wdGlvbnM/LnNlYXJjaFRpdGxlIHx8ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgY29udGVudENsYXNzTmFtZT1cInMtbG9va3VwLW1vZGFsXCJcbiAgICBbc2l6ZV09XCJkaWFsb2dGdWxsU2NyZWVuKCkgPyAnZnVsbHNjcmVlbicgOiAneGwnXCJcbj5cbiAgICBAaWYgKGRpYWxvZ1Zpc2libGUpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzLWxvb2t1cC1tb2RhbC1jb250YWluZXJcIlxuICAgICAgICAgICAgI2RpYWxvZ0NvbnRhaW5lclxuICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHNlYXJjaEZpZWxkcyAmJiBzZWFyY2hGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtAY29sbGFwc2VDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHZhbHVlOiAnaGlkZGVuJywgcGFyYW1zOiB7IHRyYW5zaXRpb25QYXJhbXM6IHRyYW5zaXRpb25PcHRpb25zIH0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyB2YWx1ZTogJ3Zpc2libGUnLCBwYXJhbXM6IHsgdHJhbnNpdGlvblBhcmFtczogdHJhbnNpdGlvbk9wdGlvbnMgfSB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIChAY29sbGFwc2VDb250ZW50LmRvbmUpPVwib25Ub2dnbGVEb25lKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwRGlhbG9nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdmFsaWRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQGNoaWxkQ29sbGFwc2VDb250ZW50XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHZhbHVlOiAnOmxlYXZlJywgcGFyYW1zOiB7IHRyYW5zaXRpb25QYXJhbXM6IHRyYW5zaXRpb25PcHRpb25zIH0gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyB2YWx1ZTogJzplbnRlcicsIHBhcmFtczogeyB0cmFuc2l0aW9uUGFyYW1zOiB0cmFuc2l0aW9uT3B0aW9ucyB9IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdGl0bGUgc2RzLXNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhYmVsT3B0aW9ucz8uZmlsdGVyVGl0bGUgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cy1keW5hbWljLWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnc109XCJzZWFyY2hGaWVsZHNEeW5hbWljU3RydWN0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtR3JvdXBEaWFsb2dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWR5bmFtaWMtZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZy0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWQgKyAnLWZpbHRlci1idXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT3B0aW9ucz8uZmlsdGVyTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5maWx0ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVG9vbHRpcD1cIihBTFQgKyBTSElGVCArIEYpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1jbGVhci1idXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT3B0aW9ucz8uY2xlYXJMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNsZWFyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImNsZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzVG9vbHRpcD1cIihBTFQgKyBTSElGVCArIEwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChzZWFyY2hGaWVsZHMgJiYgc2VhcmNoRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZCArICctZmlsdGVyLXRvZ2dsZS1idXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbHRlclRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdmYS1jaGV2cm9uLWxlZnQnOiAhY29sbGFwc2VkLCAnZmEtY2hldnJvbi1yaWdodCc6IGNvbGxhcHNlZCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBsZXQgaXNFbXB0eUNvbnRlbnQgPSAhc2VhcmNoVG90YWxSZWNvcmRzICYmICFsb2FkaW5nO1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgI2NvbnRlbnRDb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdlbXB0eS1jb250ZW50JzogaXNFbXB0eUNvbnRlbnQgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChpc0VtcHR5Q29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICA8cy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1lbXB0eS1zdGF0ZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsT3B0aW9ucz8uc2VhcmNoRW1wdHlUaXRsZSB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cInNlYXJjaEVtcHR5RGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzPVwiZmEgZmEtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L3MtZW1wdHktc3RhdGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNoaWxkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF0YUtleV09XCJkYXRhS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRHcmlkRGF0YSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cInNlYXJjaEdyaWRGaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhenldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0TW9kZT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b3RhbFJlY29yZHNdPVwic2VhcmNoVG90YWxSZWNvcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25dPVwic2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uTGF6eUxvYWQpPVwibGF6eUxvYWRHcmlkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpU29ydE1ldGFdPVwibXVsdGlTb3J0TWV0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWhpZGRlbl09XCIhc2VhcmNoVG90YWxSZWNvcmRzICYmICFsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cIm11bHRpcGxlID8gJ211bHRpcGxlJyA6ICdzaW5nbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqc0xvYWRpbmdTdGF0ZT1cInsgbG9hZGluZzogbG9hZGluZywgaW5kaWNhdG9yOiBpbmRpY2F0b3JMb2dvIH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0FkZE9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5hZGQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkFkZC5lbWl0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dFZGl0T3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWQubGVuZ3RoICE9PSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkVkaXQuZW1pdCh0aGlzLnNlbGVjdGVkWzBdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3MtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1JlbW92ZU9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk9XCJkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5yZW1vdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwib25SZW1vdmUuZW1pdCh0aGlzLnNlbGVjdGVkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3MtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiY29sZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sIHN0eWxlPVwid2lkdGg6IDUwcHhcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHVtbnM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDUwcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cy10YWJsZS1oZWFkZXItY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUFsbE9iamVjdF09XCJsb29rdXBSb3dQcm9wcyA/IGZhbHNlIDogdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dQcm9wc109XCJsb29rdXBSb3dQcm9wc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy10YWJsZS1oZWFkZXItY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5EaXNhYmxlZF09XCJzb3J0YWJsZUNvbHVtbnNEaXNhYmxlZC5pbmNsdWRlcyhjb2wubmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZW5pb3ItaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VuaW9yLWhlYWRlci10aXRsZVwiPnt7IGNvbC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghc29ydGFibGVDb2x1bW5zRGlzYWJsZWQuaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1zb3J0SWNvbiBbZmllbGRdPVwiY29sLm5hbWVcIj4gPC9wLXNvcnRJY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQtcm93RGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldC1jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzTmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwU2VsZWN0YWJsZVJvd0luZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0RvdWJsZUNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkRvdWJsZUNsaWNrKT1cIm9uVGFibGVSb3dEb3VibGVDbGljayhyb3dEYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1MHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvd0RhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZUNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2Ygc2VhcmNoR3JpZEZpZWxkczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiZ2V0RmllbGRXaWR0aChjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiY29sLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoY29sLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNCb29sZWFuVmFsdWUocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJvb2xlYW5MYWJlbChyb3dEYXRhLCBjb2wubmFtZSwgY29sLm9wdGlvbnNMYWJlbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaXplZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC5jYWxlbmRhckxvY2FsZU9wdGlvbnM/LmRhdGVGb3JtYXQgfHwgJ0wnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2RhdGVUaW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSk7IGVsc2UgZW1wdHlUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSkgfCBsb2NhbGl6ZWREYXRlIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnbG9jYWxEYXRlVGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpIHwgbG9jYWxpemVkRGF0ZSB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWRUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wuY2FsZW5kYXJMb2NhbGVPcHRpb25zPy5kYXRlRm9ybWF0IHx8ICdMVFMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ2ludGVnZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOdW1iZXIocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWRCaWdudW1iZXI6IGdldEludGVnZXJNYXNrQ29uZmlnKGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdkb3VibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNOdW1iZXIocm93RGF0YSwgY29sLm5hbWUpOyBlbHNlIGVtcHR5VGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGl6ZWRCaWdudW1iZXI6IGdldERvdWJsZU1hc2tDb25maWcoY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ21vbmV5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKTsgZWxzZSBlbXB0eVRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9jYWxpemVkQmlnbnVtYmVyOiBnZXRNb25leU1hc2tDb25maWcoY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc051bWJlcihyb3dEYXRhLCBjb2wubmFtZSk7IGVsc2UgZW1wdHlUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaXplZEJpZ251bWJlcjogZ2V0TnVtYmVyTWFza0NvbmZpZyhjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZW51bScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYWJlbEZvclZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGVtcHR5VGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB3aXRoQmFkZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHdpdGhvdXRCYWRnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhCYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHMtYmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhYmVsRm9yVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFkZ2VGcm9tVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5jb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8udHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmFkZ2VGcm9tVmFsdWUoZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSksIGNvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5pY29uQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJhZGdlRnJvbVZhbHVlKGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpLCBjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uaWNvblBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcy1iYWRnZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aG91dEJhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFiZWxGb3JWYWx1ZShnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKSwgY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpZWxkSGFzTWFzayhjb2wpICYmIHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sLCByb3dEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmllbGRWYWx1ZShyb3dEYXRhLCBjb2wubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc01hc2tGb3JtYXR0ZXI6IHBhcnNlVmFsdWVNYXNrVmFsdWUoY29sLCByb3dEYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKHJvd0RhdGEsIGNvbC5uYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkVmFsdWUocm93RGF0YSwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBlbXB0eVRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRGaWVsZFZhbHVlKHJvd0RhdGEsIGNvbC5uYW1lKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJwYWdpbmF0b3JyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFthdHRyLmRhdGEtaGlkZGVuXT1cImxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJpbnRSZWNvcmRUb3RhbGl6ZXIoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgc1RlbXBsYXRlPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1jYW5jZWwtYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBwcmlvcml0eT1cImxpbmtcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxPcHRpb25zPy5jYW5jZWxMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNhbmNlbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJoaWRlRGlhbG9nKClcIlxuICAgICAgICAgICAgICAgICAgICBzVG9vbHRpcD1cIihBTFQgKyBTSElGVCArIEMpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9zLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8cy1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkICsgJy1zZWxlY3QtYnV0dG9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWxPcHRpb25zPy5zZWxlY3RMYWJlbCB8fCAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnNlbGVjdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgIHNUb29sdGlwPVwiKEFMVCArIFNISUZUICsgUylcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvcy1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICB9XG48L3MtZGlhbG9nPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VGVtcGxhdGU+XG4gICAgPHNwYW4gY2xhc3M9XCJzZHMtZW1wdHktdmFsdWVcIj5cbiAgICAgICAge3sgbGFiZWxPcHRpb25zPy5lbXB0eUZpZWxkTGFiZWwgfHwgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub3RfaW5mb3JtZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
|