@tsi-developpement/tsi-shared-ui 1.8.3 → 1.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +3 -3
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +2 -2
- package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
- package/lib/consts/app-providers.d.ts +1 -1
- package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
- package/package.json +1 -1
package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs
CHANGED
|
@@ -1745,7 +1745,7 @@ export class TsiGenericGridComponent {
|
|
|
1745
1745
|
}
|
|
1746
1746
|
}
|
|
1747
1747
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiGenericGridComponent, deps: [{ token: i1.StatusColorService }, { token: i2.FichierService }, { token: i3.HtmlTemplateGeneratorService }, { token: i4.DatePipe }, { token: i5.TsiNotificationService }, { token: i6.LocalizePipe }, { token: i7.LayoutHelperService }, { token: i8.LayoutService }, { token: i9.PrimeNGConfig }, { token: i10.AppSettingsService }, { token: i11.ErrorResponseManagerService }, { token: i0.EnvironmentInjector }, { token: i12.DynamicDialogConfig }, { token: i12.DynamicDialogRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1748
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: { cudComponent: "cudComponent", modalSize: "modalSize", entityInfo: "entityInfo", formName: "formName", id: "id", pagedRequest: "pagedRequest", configuration: "configuration", page: "page", key: "key", columns: "columns", isSearchButtonDisabled: "isSearchButtonDisabled", filteredColumns: "filteredColumns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSearchBox: "showSearchBox", showActionColumn: "showActionColumn", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", isGridDataPagedInApi: "isGridDataPagedInApi", header: "header", ShowFilterColumns: "ShowFilterColumns", showImportExportButton: "showImportExportButton", crudService: "crudService", searchFields: "searchFields", sortMode: "sortMode", filtersHtmlTemplate: "filtersHtmlTemplate", presentationSettings: "presentationSettings", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", searchOnInit: "searchOnInit", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showSearchField: "showSearchField", showCalenderView: "showCalenderView", calenderSchema: "calenderSchema", showCardView: "showCardView", showKanbanView: "showKanbanView", showKanbanViewOfWorkFlowEtat: "showKanbanViewOfWorkFlowEtat", businessClass: "businessClass", page$: "page$", checkedByField: "checkedByField", selectAll: "selectAll", targetBusinessClass: "targetBusinessClass", descriminatorValue: "descriminatorValue" }, outputs: { onSave: "onSave", editRow: "editRow", deleteRow: "deleteRow", load: "load", buttonColumnClicked: "buttonColumnClicked", filtersHtmlTemplateChange: "filtersHtmlTemplateChange", selectedItemsChange: "selectedItemsChange", searchFieldsValueChanged: "searchFieldsValueChanged", calendarEventClick: "calendarEventClick", statusFilterChanged: "statusFilterChanged" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }, { propertyName: "tableHeaderCheckbox", first: true, predicate: ["tableHeaderCheckbox"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-index-checkbox'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content; background: white;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i14.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i15.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", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], 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: i15.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i15.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i15.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i15.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i15.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i15.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i15.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i16.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i17.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i18.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i19.BadgeDirective, selector: "[pBadge]", inputs: ["badgeDisabled", "badgeSize", "size", "severity", "value", "badgeStyle", "badgeStyleClass"] }, { kind: "component", type: i20.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i21.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i22.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i23.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i24.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i25.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i26.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i27.TsiModalFooterComponent, selector: "Tsi-Modal-Footer", inputs: ["cancelDisabled", "saveDisabled", "cancelLabel", "saveLabel", "isConsult", "isDuplicate", "isOnlyCreate", "additionalButtonLabel", "additionalButtonIcon", "additionalButtonDisabled", "showAdditionalButton", "showSaveAndCloseButton"], outputs: ["onCancelClick", "onSaveClick", "onAdditionalButtonClick"] }, { kind: "component", type: i28.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i29.TsiSearchBoxComponent, selector: "tsi-search-box", inputs: ["searchFields", "businessClass", "descriminatorValue", "isRtlMode", "isSearchButtonDisabled", "entityInfo", "statusMetadata"], outputs: ["searchFieldsChange", "searchFieldsApplied", "keywordValueChanged", "statusFilterChanged", "workflowEtatFilterChanged", "comboBoxLabelChanged"] }, { kind: "component", type: i30.TsiCardListComponent, selector: "Tsi-card-list", inputs: ["cardBusinessClass", "header", "id", "page", "page$"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i31.TsiImageDisplayComponent, selector: "tsi-image-display", inputs: ["src", "alt", "width", "height", "isRounded", "headerTitles"] }, { kind: "component", type: i32.TsiKanbanComponent, selector: "Tsi-kanban", inputs: ["cardBusinessClass", "header", "id", "page$", "crudService", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i33.TsiCalenderComponent, selector: "tsi-calender", inputs: ["crudService", "schema", "eventsData"], outputs: ["eventClick", "dateRangeChange"] }, { kind: "component", type: i34.TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: ["cardBusinessClass", "header", "id", "page$", "descriminatorValue", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "directive", type: i35.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "component", type: i36.DisplayNestedPropComponent, selector: "Tsi-Display-Nested-Prop", inputs: ["id", "displayValue", "sourceUrl"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
|
|
1748
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiGenericGridComponent, selector: "Tsi-Generic-Grid", inputs: { cudComponent: "cudComponent", modalSize: "modalSize", entityInfo: "entityInfo", formName: "formName", id: "id", pagedRequest: "pagedRequest", configuration: "configuration", page: "page", key: "key", columns: "columns", isSearchButtonDisabled: "isSearchButtonDisabled", filteredColumns: "filteredColumns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", showSearchBox: "showSearchBox", showActionColumn: "showActionColumn", showHeaderFilters: "showHeaderFilters", showFilterButton: "showFilterButton", isGridDataPagedInApi: "isGridDataPagedInApi", header: "header", ShowFilterColumns: "ShowFilterColumns", showImportExportButton: "showImportExportButton", crudService: "crudService", searchFields: "searchFields", sortMode: "sortMode", filtersHtmlTemplate: "filtersHtmlTemplate", presentationSettings: "presentationSettings", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", selectedItems: "selectedItems", searchOnInit: "searchOnInit", showGlobalSearch: "showGlobalSearch", showExportButton: "showExportButton", showSearchField: "showSearchField", showCalenderView: "showCalenderView", calenderSchema: "calenderSchema", showCardView: "showCardView", showKanbanView: "showKanbanView", showKanbanViewOfWorkFlowEtat: "showKanbanViewOfWorkFlowEtat", businessClass: "businessClass", page$: "page$", checkedByField: "checkedByField", selectAll: "selectAll", targetBusinessClass: "targetBusinessClass", descriminatorValue: "descriminatorValue" }, outputs: { onSave: "onSave", editRow: "editRow", deleteRow: "deleteRow", load: "load", buttonColumnClicked: "buttonColumnClicked", filtersHtmlTemplateChange: "filtersHtmlTemplateChange", selectedItemsChange: "selectedItemsChange", searchFieldsValueChanged: "searchFieldsValueChanged", calendarEventClick: "calendarEventClick", statusFilterChanged: "statusFilterChanged" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }, { propertyName: "tableHeaderCheckbox", first: true, predicate: ["tableHeaderCheckbox"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i13.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i13.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i14.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i9.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i15.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", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], 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: i15.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i15.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i15.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i15.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i15.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i15.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i15.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i15.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i16.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i17.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i18.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i19.BadgeDirective, selector: "[pBadge]", inputs: ["badgeDisabled", "badgeSize", "size", "severity", "value", "badgeStyle", "badgeStyleClass"] }, { kind: "component", type: i20.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i21.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i22.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i23.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i24.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i25.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i26.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i27.TsiModalFooterComponent, selector: "Tsi-Modal-Footer", inputs: ["cancelDisabled", "saveDisabled", "cancelLabel", "saveLabel", "isConsult", "isDuplicate", "isOnlyCreate", "additionalButtonLabel", "additionalButtonIcon", "additionalButtonDisabled", "showAdditionalButton", "showSaveAndCloseButton"], outputs: ["onCancelClick", "onSaveClick", "onAdditionalButtonClick"] }, { kind: "component", type: i28.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i29.TsiSearchBoxComponent, selector: "tsi-search-box", inputs: ["searchFields", "businessClass", "descriminatorValue", "isRtlMode", "isSearchButtonDisabled", "entityInfo", "statusMetadata"], outputs: ["searchFieldsChange", "searchFieldsApplied", "keywordValueChanged", "statusFilterChanged", "workflowEtatFilterChanged", "comboBoxLabelChanged"] }, { kind: "component", type: i30.TsiCardListComponent, selector: "Tsi-card-list", inputs: ["cardBusinessClass", "header", "id", "page", "page$"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i31.TsiImageDisplayComponent, selector: "tsi-image-display", inputs: ["src", "alt", "width", "height", "isRounded", "headerTitles"] }, { kind: "component", type: i32.TsiKanbanComponent, selector: "Tsi-kanban", inputs: ["cardBusinessClass", "header", "id", "page$", "crudService", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "component", type: i33.TsiCalenderComponent, selector: "tsi-calender", inputs: ["crudService", "schema", "eventsData"], outputs: ["eventClick", "dateRangeChange"] }, { kind: "component", type: i34.TsiKanbanWorkflowEtatComponent, selector: "Tsi-kanban-workflow-etat", inputs: ["cardBusinessClass", "header", "id", "page$", "descriminatorValue", "page"], outputs: ["buttonClicked", "callSearch"] }, { kind: "directive", type: i35.PresentationDesignerDirectiveBase, selector: "[presentationDesignerBase]", inputs: ["presentationDesigner", "presentationDesignerBase"] }, { kind: "component", type: i36.DisplayNestedPropComponent, selector: "Tsi-Display-Nested-Prop", inputs: ["id", "displayValue", "sourceUrl"] }, { kind: "pipe", type: i6.LocalizePipe, name: "localize" }], animations: [
|
|
1749
1749
|
trigger('slideInOut', [
|
|
1750
1750
|
state('in', style({
|
|
1751
1751
|
height: '*',
|
|
@@ -1777,7 +1777,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1777
1777
|
})),
|
|
1778
1778
|
transition('in <=> out', animate('600ms cubic-bezier(0.25, 0.8, 0.25, 1)'))
|
|
1779
1779
|
])
|
|
1780
|
-
], template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-index-checkbox'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content; background: white;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"] }]
|
|
1780
|
+
], template: "<div class=\"grid\">\r\n\r\n <div class=\"col-12\" [@slideInOut]=\"showSearchField ? 'in' : 'out'\" *ngIf=\"showGlobalSearch\">\r\n <tsi-search-box \r\n [isRtlMode]=\"isRtlMode\" \r\n [(searchFields)]=\"searchFields\" \r\n [businessClass]=\"businessClass\"\r\n [entityInfo]=\"entityInfo\"\r\n [statusMetadata]=\"statusMetadata\"\r\n [descriminatorValue]=\"descriminatorValue\"\r\n (searchFieldsChange)=\"searchFieldsValueChanges($event)\" \r\n (keywordValueChanged)=\"keywordValueChanged($event)\"\r\n (searchFieldsApplied)=\"search($event)\"\r\n (statusFilterChanged)=\"onStatusFilterChanged($event)\"\r\n (workflowEtatFilterChanged)=\"onWorkflowEtatFilterChanged($event)\"\r\n (comboBoxLabelChanged)=\"comboBoxLabelChanged($event)\">\r\n </tsi-search-box>\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === false && _showCardView === false && _showKanbanView === false\" class=\"col-12\">\r\n \r\n <p-table #dt \r\n [lazy]=\"isGridDataPagedInApi\" \r\n [lazyLoadOnInit]=\"searchOnInit\" \r\n [totalRecords]=\"page.totalCount\" \r\n [loading]=\"page.loading\" \r\n [reorderableColumns]=\"true\"\r\n [resizableColumns]=\"true\" \r\n [columns]=\"selectedColumns\" \r\n [value]=\"page.items\"\r\n [paginator]=\"true\" \r\n [scrollable]=\"true\" \r\n [(rows)]=\"page.pageSize\"\r\n [showCurrentPageReport]=\"true\" \r\n [globalFilterFields]=\"fields()\" \r\n [tableStyle]=\"{ 'min-width': '50rem' }\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\" \r\n [sortMode]=\"sortMode\"\r\n [multiSortMeta]=\"sortMetas\" \r\n [selectAll]=\"selectAll\"\r\n [selectionMode]=\"selectionMode\" \r\n [(selection)]=\"selection\" \r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n (onRowUnselect)=\"onSelectedItemsChanged()\"\r\n (selectAllChange)=\"onSelectAllChange($event)\" \r\n (onRowSelect)=\"onSelectedItemsChanged()\"\r\n columnResizeMode=\"expand\" \r\n dataKey=\"{{ key }}\" \r\n scrollHeight=\"600px\" \r\n styleClass=\"p-datatable-gridlines\" \r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {{getFirstElementIndex()}} {{\r\n 'to' | localize\r\n }} {last} {{ 'of' | localize }} \r\n {totalRecords} {{ 'entries' | localize }}\" \r\n >\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex justify-content-between align-items-center\">\r\n <div class=\"ml-2\">\r\n {{ header | localize }}\r\n </div>\r\n\r\n <div class=\"p-1 flex align-items-center\">\r\n <div *ngIf=\"showFilterButton\" presentationDesignerBase=\"grid_toggle_header_filters\">\r\n <Tsi-Button [icon]=\"filterIcon\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"filterTooltip\"\r\n styleClass=\"p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"toggleHeaderFilters()\"></Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showHeaderFilters\" presentationDesignerBase=\"grid_toggle_header_filter_mode\">\r\n <Tsi-Button [icon]=\"filterModeIcon\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n [tooltipText]=\"filterModeTooltip\" [styleClass]=\"'ml-1 p-button-primary p-button-icon-only'\"\r\n (click)=\"toggleHeaderFiltersMode()\"></Tsi-Button>\r\n </div>\r\n\r\n <div presentationDesignerBase=\"grid_clear_filter_button\">\r\n <Tsi-Button [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"'icon-clear-filter'\"\r\n styleClass=\"ml-1 p-element hover:shadow-6 p-button-primary p-button p-component p-button-icon-only\"\r\n (click)=\"onClearFilters()\" [iconSrc]=\"'assets/layout/images/icon/icon-clear-filter.svg'\">\r\n </Tsi-Button>\r\n </div>\r\n\r\n <div *ngIf=\"showExportButton\" presentationDesignerBase=\"grid_export_button\">\r\n <Tsi-Button icon=\"p-button-icon pi pi-file-excel\" (onClick)=\"exportExcel()\"\r\n styleClass=\"p-element p-button-success hover:shadow-6 ml-2 p-1 p-button p-component p-button-icon-only\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"XLS\"></Tsi-Button>\r\n </div>\r\n\r\n <p-multiSelect class=\"ml-1\" [options]=\"columns\" [ngModel]=\"selectedColumns\" optionLabel=\"translatedHeader\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" [style]=\"{ 'min-width': '180px' }\"\r\n placeholder=\"{{ 'choose_columns' | localize }}\" (ngModelChange)=\"onSelectedColumnsChange($event)\">\r\n </p-multiSelect>\r\n </div>\r\n\r\n <!-- <div> -->\r\n <!-- <button *ngIf=\"showGlobalSearch\" type=\"button\" pButton pRipple icon=\"pi pi-search\" (click)=\"search()\"></button> -->\r\n <!-- </div> -->\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : 'z-1'\" *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </div>\r\n </th>\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\"\r\n scope=\"col\" [style]=\"col.style\" pTooltip=\"{{ col.toolTipText | localize }}\" tooltipPosition=\"top\"\r\n [pSortableColumn]=\"(!col.isButton || !isOverflowColumn(col.field) || !(col.type == displayTypes.IMAGE_DISPLAY)) ? \r\n col.field : null\"\r\n [pResizableColumnDisabled]=\"col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)\"\r\n [tooltipDisabled]=\"col.isButton || isOverflowColumn(col.field)\" \r\n [pReorderableColumnDisabled]=\"col.isButton || isOverflowColumn(col.field)\" pReorderableColumn\r\n pResizableColumn [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\"\r\n [class.disabled-column]=\"col.isButton || isOverflowColumn(col.field) || col.type === displayTypes.IMAGE_DISPLAY\" \r\n [ngClass]=\"[\r\n getHeaderClassColor(col.type),\r\n (col.isButton || isOverflowColumn(col.field)) ? 'w-1rem' : '',\r\n (col.isButton || col.type === displayTypes.IMAGE_DISPLAY || isOverflowColumn(col.field)) ? 'non-resizable-column' : '',\r\n ]\"\r\n [ngStyle]=\"page.items.length > 0 ? col.headerColumnStyle : {}\">\r\n\r\n <ng-container *ngIf=\"notInSpecifiedColumn(col.field)\">\r\n <span>\r\n <table class=\"p-0 m-0\">\r\n <tr>\r\n <td class=\"col p-0 m-0\" [ngClass]=\"{'w-1rem': col.isButton}\">\r\n {{ col.header | localize }}\r\n </td>\r\n <td class=\"col-fixed p-0 m-0\" style=\"width: 1rem\">\r\n <p-sortIcon \r\n *ngIf=\"col.type !== displayTypes.IMAGE_DISPLAY\"\r\n class=\"w-1rem m-0 p-0\"\r\n field=\"{{ col.field }}\"\r\n ></p-sortIcon>\r\n </td>\r\n </tr>\r\n </table>\r\n </span>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr>\r\n\r\n <tr *ngIf=\"showHeaderFilters\">\r\n <!-- <th scope=\"col\" style=\"width:3rem\"></th>\r\n <th scope=\"col\" style=\"width:3rem\"></th> -->\r\n <th [ngClass]=\"page.loading ? 'no-z-index' : ''\" *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"width: 4rem\"></th>\r\n <th style=\"overflow: inherit\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <p-columnFilter [type]=\"col.filterInputType\" [field]=\"col.field\" [display]=\"changeHeaderFiltersMode\"\r\n [minFractionDigits]=\"col.numOfDecimal\" [maxFractionDigits]=\"col.numOfDecimal\" [showButtons]=\"false\"\r\n [matchMode]=\"filterMatchMode.EQUALS\">\r\n </p-columnFilter>\r\n </th>\r\n </tr>\r\n \r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-columns=\"columns\" let-index=\"rowIndex\">\r\n\r\n <!-- CASE : multiple selection -->\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\" *ngIf=\"\r\n selectionMode == multipleGridSelectionMode;\r\n else notMultipleSelectionModeBlock\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event,item)\" (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <td [ngStyle]=\"page.items.length > 0 ? getCheckboxStyle() : {}\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\r\n </div>\r\n </td>\r\n <!-- <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-pencil\" class=\"p-button-rounded p-button-text\"\r\n (click)=\"edit(item)\"></button>\r\n </div>\r\n </td>\r\n <td class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <button pButton pRipple type=\"button\" icon=\"pi pi-trash\"\r\n class=\"p-button-rounded p-button-text p-button-danger\" (click)=\"delete(item)\"></button>\r\n </div>\r\n </td> -->\r\n \r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n >\r\n\r\n <!-- style=\"height: min-content; margin-left: -.5rem;\" -->\r\n <!-- Tsi-Currency-Societe-Input -->\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div> \r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-column -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayTextEyeBlock\" >\r\n <div class=\"align-items-center frozen-column-rtl-mode justify-content-center p-2\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\"\r\n icon=\"{{ col.buttonIcon }}\" [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n [text]=\"col.buttonLabel ? col.buttonLabel : item[col.field]\"\r\n (click)=\"buttonClicked(item, col.field)\" ></Tsi-Button>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n </tr>\r\n \r\n <!-- CASE : single or none selection -->\r\n <ng-template #notMultipleSelectionModeBlock>\r\n <ng-container>\r\n <tr [ngStyle]=\"item.color && item.color !== '' ? {'background-color': item.color} : {}\"\r\n [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"index\" id=\"tsi-grid-row-{{index}}\">\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <td *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\" [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\" \r\n style=\"height: min-content;\"\r\n [ngClass]=\"{\r\n 'w-1rem': col.isButton,\r\n 'bg-white': col.isButton\r\n }\">\r\n\r\n <div *ngIf=\"\r\n col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY;\r\n else currencyOtherOutputBlock\r\n \">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CURRENCY_OTHER_DISPLAY;\r\n else datePickerOutputBlock\r\n \">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATE_DISPLAY;\r\n else dateTimePickerOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #dateTimePickerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DATETIME_DISPLAY;\r\n else checkBoxOutputBlock\r\n \">\r\n <Tsi-Date-Display [inputData]=\"item[col.field]\" [showTime]=\"true\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.CHECKBOX_DISPLAY;\r\n else decimalOutputBlock\r\n \">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.DECIMAL_DISPLAY;\r\n else integerOutputBlock\r\n \">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.INTEGER_DISPLAY;\r\n else rateOutputBlock\r\n \">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.RATE_DISPLAY;\r\n else displayNestedPropOutputBlock\r\n \">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-nested-prop -->\r\n <ng-template #displayNestedPropOutputBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.NESTED_PROP_DISPLAY;\r\n else displayStatusColorBlock\r\n \">\r\n <Tsi-Display-Nested-Prop [sourceUrl]=\"col.displayNestedPropertySourceUrl\" [id]=\"item[col.field]\"\r\n [displayValue]=\"col.displayNestedPropertylabelField\">\r\n </Tsi-Display-Nested-Prop>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #displayStatusColorBlock>\r\n <ng-container *ngIf=\"col.isStatusColor; else displayStatusValueColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <span\r\n class=\"px-2 py-1 rounded text-white text-sm\"\r\n [style.background-color]=\"item[col.field]\">\r\n {{item[col.field]}}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n\r\n <ng-template #displayStatusValueColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumnValue; else displayStatusColumnBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && getStatusOptionForStatusHistory(item[col.field]) as opt\"\r\n class=\"px-2 py-1 font-bold status-badge\"\r\n [style.background-color]=\"opt.colorHex\"\r\n [style.color]=\"opt.colorHex ? 'white' : 'black'\"\r\n [ngClass]=\"{\r\n 'text-black bg-white': !opt.colorHex,\r\n 'text-white': opt.colorHex\r\n }\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadataForStatusHistory && !getStatusOptionForStatusHistory(item[col.field])\"\r\n class=\"px-2 py-1 font-bold status-badge\">\r\n {{ item[col.field] }}\r\n </span>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-status-prop -->\r\n <ng-template #displayStatusColumnBlock>\r\n <ng-container *ngIf=\"col.isStatusColumn; else displayButtonBlock\">\r\n <div class=\"align-items-center justify-content-center p-2\">\r\n <!--<p-tag \r\n [value]=\"item[col.field]\"\r\n [style.backgroundColor]=\"getStatusColor(item[col.field])\">\r\n </p-tag>-->\r\n\r\n <span\r\n *ngIf=\"statusMetadata && getStatusOption(item[col.field]) as opt\"\r\n class=\"status-badge font-bold\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{ opt.translatedLabel }}\r\n </span>\r\n <span\r\n *ngIf=\"statusMetadata && !getStatusOption(item[col.field])\"\r\n class=\"status-badge font-bold\">\r\n {{ item[col.field] }}\r\n </span>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n \r\n <!-- display-nested-prop -->\r\n <ng-template #displayButtonBlock>\r\n <ng-container *ngIf=\"col.isButton; else displayImage\">\r\n <div [ngStyle]=\"page.items.length > 0 ? col.ngStyle : {}\"\r\n [ngClass]=\"page.loading ? 'no-z-index' : ''\"\r\n class=\"flex align-items-center frozen-column-rtl-mode justify-content-center p-0\">\r\n <Tsi-Button [styleClass]=\"col.styleClass\" type=\"button\" icon=\"{{ col.buttonIcon }}\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" [tooltipText]=\"col.toolTipText\"\r\n (click)=\"buttonClicked(item, col.field)\"\r\n [text]=\"col.isIconButton ? '' : (col.buttonLabel ?? item[col.field])\"></Tsi-Button>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-image -->\r\n <ng-template #displayImage>\r\n <ng-container *ngIf=\"col.type == displayTypes.IMAGE_DISPLAY; else displayTextEyeBlock\">\r\n <div class=\"h-2rem\">\r\n <tsi-image-display [headerTitles]=\"getHeaderTitles(col.headerTitles, item)\"\r\n [isRounded]=\"col.isRounded\" [src]=\"item[col.field]\" [alt]=\"col.header || 'image'\"\r\n [width]=\"'100%'\" [height]=\"'100%'\">\r\n </tsi-image-display>\r\n </div>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- display-text-eye -->\r\n <ng-template #displayTextEyeBlock>\r\n <ng-container *ngIf=\"\r\n col.type == displayTypes.TEXT_DISPLAY;\r\n else moreActionsBlock\r\n \">\r\n <span>\r\n <span class=\"cursor-pointer pi pi-eye\" (click)=\"eyeClicked(item[col.field])\"></span>\r\n {{ truncateString(item[col.field], 50) }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- more actions -->\r\n <ng-template #moreActionsBlock>\r\n <ng-container *ngIf=\"col.field == overflowColumnField; else defaultTextOutputBlock\">\r\n\r\n <p-menu \r\n appendTo=\"body\" \r\n #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\"\r\n styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n \r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a \r\n pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(item, menuItem)\">\r\n <i\r\n *ngIf=\"menuItem.id === 'notes'\"\r\n class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\"\r\n pBadge\r\n severity=\"danger\"\r\n [value]=\"item.notesCount\"\r\n [badgeDisabled]=\"item.notesCount == null\"\r\n badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i\r\n *ngIf=\"menuItem.id !== 'notes'\"\r\n class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n <div class=\"flex align-items-center justify-content-center p-0\">\r\n <p-button \r\n type=\"button\"\r\n icon=\"{{col.buttonIcon}}\"\r\n styleClass=\"{{col.styleClass}} overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, item)\">\r\n </p-button> \r\n </div>\r\n \r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{ item[col.field] }}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </td>\r\n\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <tr>\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"></td>\r\n\r\n <ng-container *ngFor=\"let col of selectedColumns\">\r\n <td class=\"pr-0\" *ngIf=\"!(col.isButton && col.actionDisplay == actionPlacement.Overflow)\">\r\n <div *ngIf=\"col.showSummary\">\r\n <!-- CURRENCY_SOCIETE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_SOCIETE_DISPLAY\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- INTEGER_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.INTEGER_DISPLAY\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Integer-Display>\r\n </div>\r\n\r\n <!-- RATE_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.RATE_DISPLAY\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction ?? false\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Rate-Display>\r\n </div>\r\n\r\n <!-- DECIMAL_DISPLAY -->\r\n <div *ngIf=\"col.type == displayTypes.DECIMAL_DISPLAY\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col.field)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </div>\r\n\r\n <div *ngIf=\"col.type == displayTypes.CURRENCY_OTHER_DISPLAY\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"getSummary(col.field)\">\r\n </Tsi-Currency-Other-Display>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container> \r\n </tr>\r\n </ng-template>\r\n \r\n <ng-template pTemplate=\"summary\">\r\n {{ page.totalCount }} {{ \"records_label\" | localize }}\r\n <span *ngIf=\"colorful\">\r\n <span>View Grid</span>\r\n <span class=\"pl-2\">| SearchOnInit : {{ searchOnInit }}</span>\r\n <span class=\"pl-2\">| Pagination In Api : {{ isGridDataPagedInApi }}</span>\r\n </span>\r\n </ng-template>\r\n </p-table>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"_showCalenderView === true\" class=\"col-12\">\r\n <tsi-calender [schema]=\"calenderSchema\" [eventsData]=\"page.items\" [crudService]=\"crudService\"\r\n (dateRangeChange)=\"handleDateRangeChange($event)\" (eventClick)=\"handleCalendarEventClick($event)\"></tsi-calender>\r\n </div>\r\n\r\n <div *ngIf=\"_showCardView === true\" class=\"col-12\">\r\n <Tsi-card-list [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-card-list>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && !_showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" (callSearch)=\"callSearchHandler($event)\" [crudService]=\"crudService\">\r\n </Tsi-kanban>\r\n </div>\r\n\r\n <div *ngIf=\"_showKanbanView === true && _showKanbanViewOfWorkFlowEtat\" class=\"col-12\">\r\n <Tsi-kanban-workflow-etat [cardBusinessClass]=\"businessClass\" [id]=\"id\" (buttonClicked)=\"buttonColumnClicked.emit($event)\"\r\n [page$]=\"page$\" [page]=\"page\" [descriminatorValue]=\"descriminatorValue\" (callSearch)=\"callSearchHandler($event)\">\r\n </Tsi-kanban-workflow-etat>\r\n </div>\r\n\r\n <div *ngIf=\"isAdvancedSearch && selectionMode == multipleGridSelectionMode\">\r\n <Tsi-Modal-Footer [showSaveAndCloseButton]=\"false\" (onSaveClick)=\"onConfirmSelection()\" (onCancelClick)=\"onCancelSelection()\" />\r\n </div>\r\n</div>", styles: [".p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:1rem}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.p-inputgroup.rtl-mode .p-inputgroup-addon:last-child,.p-inputgroup.rtl-mode button:last-child,.p-inputgroup.rtl-mode input:last-child,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.rtl-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:6px 0 0 6px/6px 0px 0px 6px!important}.p-inputgroup.ltr-mode .p-inputgroup-addon:last-child,.p-inputgroup.ltr-mode button:last-child,.p-inputgroup.ltr-mode input:last-child,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component,.p-inputgroup.ltr-mode>.p-inputwrapper:last-child>.p-component>.p-inputtext{border-radius:0 6px 6px 0/0px 6px 6px 0px!important}.p-paginator .p-dropdown{height:auto;border:none;border-bottom:1px solid}.p-datatable .frozen-column{position:sticky;left:0;z-index:1;background:#fff}.frozen-column-ltr-mode{min-width:2rem;position:sticky;left:0;background-color:#fff}.frozen-column-rtl-mode{min-width:2rem;position:sticky;right:0;background-color:#fff}.disabled-column{background-color:#f5f5f5;color:#d3d3d3;pointer-events:none}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}td span,td div{padding:0 .5rem}.custom-button{display:flex;align-items:center;justify-content:center;padding:0;border:none;background:none;cursor:pointer}.button-icon{width:1.5rem;height:1.5rem}.custom-button:hover{background-color:#f0f0f0}table{width:100%!important}.right-to-left{text-align:start}::ng-deep th.non-resizable-column .p-column-resizer{display:none!important;pointer-events:none!important}::ng-deep .cursor-follow{position:fixed;background-color:#333;color:#fff;padding:6px 10px;border-radius:4px;font-size:.85rem;z-index:1000;pointer-events:none;white-space:nowrap}::ng-deep .overflow-menu.p-menu-overlay{border-radius:8px;border:none;padding:.4rem;min-width:0!important;background:#fff;box-shadow:0 8px 24px #0000001f;animation:fadeScaleIn .12s ease-out}::ng-deep .overflow-menu .p-menuitem-link{overflow:visible!important;position:relative;padding:0}::ng-deep .overflow-menu-item{padding:.55rem .75rem;border-radius:8px;gap:.5rem;font-size:.85rem;white-space:nowrap;transition:all .15s ease}::ng-deep .overflow-menu-item:hover{background-color:#f5f7fa}::ng-deep .menu-icon{font-size:.9rem;width:18px;text-align:center;opacity:.8}::ng-deep .menu-label{font-weight:400}::ng-deep .overflow-btn{width:28px;height:28px;padding:0}@keyframes fadeScaleIn{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}::ng-deep .overflow-menu .p-badge{font-size:.55rem;min-width:.9rem;height:.9rem;line-height:.9rem;font-family:inherit}::ng-deep .badge-icon.has-badge{transition:transform .2s ease-in-out;display:inline-block;position:relative;z-index:2}::ng-deep .badge-icon.has-badge:hover{transform:scale(1.4);z-index:10}\n"] }]
|
|
1781
1781
|
}], ctorParameters: () => [{ type: i1.StatusColorService }, { type: i2.FichierService }, { type: i3.HtmlTemplateGeneratorService }, { type: i4.DatePipe }, { type: i5.TsiNotificationService }, { type: i6.LocalizePipe }, { type: i7.LayoutHelperService }, { type: i8.LayoutService }, { type: i9.PrimeNGConfig }, { type: i10.AppSettingsService }, { type: i11.ErrorResponseManagerService }, { type: i0.EnvironmentInjector }, { type: i12.DynamicDialogConfig }, { type: i12.DynamicDialogRef }], propDecorators: { cudComponent: [{
|
|
1782
1782
|
type: Input
|
|
1783
1783
|
}], modalSize: [{
|
|
@@ -1897,4 +1897,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1897
1897
|
}], statusFilterChanged: [{
|
|
1898
1898
|
type: Output
|
|
1899
1899
|
}] } });
|
|
1900
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRixPQUFPLEVBQWlCLFNBQVMsRUFBdUIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUF1RixNQUFNLGFBQWEsQ0FBQztBQUduSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZMLE9BQU8sRUFBRSwrQkFBK0Is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QUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBY0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR08sYUFBYTtzQkFBekIsS0FBSztnQkFhRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBWUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFXRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBS08sY0FBYztzQkFBMUIsS0FBSztnQkFLTyw0QkFBNEI7c0JBQXhDLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFJRixTQUFTO3NCQURaLEtBQUs7Z0JBYUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFPSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRW52aXJvbm1lbnRJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGEsIE1lbnVJdGVtLCBNZW51SXRlbUNvbW1hbmRFdmVudCwgUHJpbWVOR0NvbmZpZywgU29ydE1ldGEsIFRhYmxlU3RhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBUYWJsZSwgVGFibGVIZWFkZXJDaGVja2JveCwgVGFibGVMYXp5TG9hZEV2ZW50LCBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U29jaWV0ZURldmlzZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy90c2ktY29uc3RzJztcclxuaW1wb3J0IHsgRGlzcGxheVR5cGVDb2xvcnMsIERpc3BsYXlUeXBlcywgRmlsdGVyT3BlcmF0b3JUeXBlLCBHcmlkU2VsZWN0aW9uTW9kZSwgR3JpZFNvcnRNb2RlLCBJbnB1dFR5cGVzLCBNb2RhbFNpemVFbnVtLCBOdW1lcmljRGlzcGxheVR5cGVzLCBUb29sdGlwUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IG9wZW5Uc2lQb3B1cFRleHRWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvbW9kYWwtb3Blbi5mdW5jdGlvbic7XHJcbmltcG9ydCB7IEJ1dHRvbkNsaWNrUmVzdWx0LCBEaWN0aW9uYXJ5LCBHcmlkQ29sdW1uLCBJRmlsdGVyZWRSZXF1ZXN0LCBJR3JpZENvbmZpZ3VyYXRpb24sIElQYWdlLCBJUGFnZWRSZXF1ZXN0LCBJUGFnZWRSZXNwb25zZSwgSVNvcnRCeVByb3ByZXR5LCBJU29ydE1ldGEgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRXZlbnRTY2hlbWEsIEZpY2hpZXIsIFByZXNlbnRhdGlvblNldHRpbmcsIFNlYXJjaEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRW50aXR5SW5mbyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lbnRpdHktaW5mby9lbnRpdHktaW5mbyc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb24vYXBwLmxheW91dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS9jcnVkLWJhc2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpY2hpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmljaGllci9maWNoaWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJhdG9yL2h0bWwtdGVtcGxhdGUtZ2VuZXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYXlvdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0L2xheW91dC1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi9lcnJvci1yZXNwb25zZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NldHRpbmdzL2FwcC1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdHVzQ29sb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RhdHVzL3N0YXR1cy1jb2xvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXhwb3J0RXhjZWxIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9leHBvcnQtZXhjZWwuaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVySGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZmlsdGVyLWhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQgeyBBY3Rpb25QbGFjZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9hY3Rpb24tcGxhY2VtZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kcm9wZG93bi9kcm9wZG93bi1leHRlcm5hbC1zZWxlY3Rpb24tb3V0cHV0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnVHNpLUdlbmVyaWMtR3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzbGlkZUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnKicsXHJcbiAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnMHB4JyxcclxuICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTIwcHgpJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2luIDw9PiBvdXQnLCBhbmltYXRlKCc2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKScpKVxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lHZW5lcmljR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG92ZXJmbG93Q29sdW1uRmllbGQgPSAnb3ZlcmZsb3ctY29sdW1uLWZpZWxkJztcclxuXHJcbiAgQElucHV0KCkgY3VkQ29tcG9uZW50OiBhbnk7XHJcbiAgQElucHV0KCkgbW9kYWxTaXplOiBhbnk7XHJcbiAgQElucHV0KCkgZW50aXR5SW5mbzogRW50aXR5SW5mbyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBmaWx0ZXJNYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGU7XHJcbiAgdG9vbHRpcFBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgYXN5bmMgZXllQ2xpY2tlZCh0ZXh0OiBhbnkpIHtcclxuXHJcbiAgICBsZXQgbW9kYWxTaXplID0gTW9kYWxTaXplRW51bS5FeHRyYUxhcmdlO1xyXG4gICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgIGRhdGE6IHRleHQsXHJcbiAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogbW9kYWxTaXplLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IG1vZGFsU2l6ZS5oZWlnaHRcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nUmVmID0gYXdhaXQgb3BlblRzaVBvcHVwVGV4dFZpZXdlckNvbXBvbmVudCh0aGlzLl9pbmplY3RvciwgY29uZik7XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCh2YWw/OiBhbnkpID0+IHRoaXMuX2Nsb3NlTW9kYWwodmFsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbG9zZU1vZGFsKHZhbD86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9kaWFsb2dSZWY/LmRlc3Ryb3koKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZj8uZGVzdHJveSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZVN0cmluZyh2YWx1ZTogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gNTApOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGltaXQgPyB2YWx1ZS5zdWJzdHIoMCwgbGltaXQpICsgJy4uLicgOiB2YWx1ZTtcclxuICB9XHJcbiAgLy8jcmVnaW9uIGxvY2FsIHZhcnNcclxuICBAVmlld0NoaWxkKFwiZHRcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBkdDogVGFibGUgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZChcInRhYmxlSGVhZGVyQ2hlY2tib3hcIikgdGFibGVIZWFkZXJDaGVja2JveDogVGFibGVIZWFkZXJDaGVja2JveCB8IHVuZGVmaW5lZFxyXG4gIGZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHJvd3MgPSAxO1xyXG4gIGRpc3BsYXlUeXBlcyA9IERpc3BsYXlUeXBlcztcclxuICBrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgc3VtbWFyaWVzOiBEaWN0aW9uYXJ5PHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG4gIGlzUnRsTW9kZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gIG1lc3NhZ2VQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xyXG4gIHByaXZhdGUgZHJhZ0VudGVyQ291bnQgPSAwO1xyXG4gIC8vIHByaXZhdGUgX3NlYXJjaEJveEZpbHRlcnM6IEFycmF5PEZpbHRlckJ5UHJvcHJldHk+ID0gW107XHJcbiAgLy8gcHJpdmF0ZSBfZ3JpZEhlYWRlckZpbHRlcnM6IEFycmF5PEZpbHRlckJ5UHJvcHJldHk+ID0gW107XHJcbiAgcHJpdmF0ZSBfc2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc2VhcmNoQm94RmlsdGVyczogQXJyYXk8SUZpbHRlcmVkUmVxdWVzdD4gPSBbXTtcclxuICBwcml2YXRlIF9ncmlkSGVhZGVyRmlsdGVyczogQXJyYXk8SUZpbHRlcmVkUmVxdWVzdD4gPSBbXTtcclxuICBwcml2YXRlIF9zb3J0OiBBcnJheTxJU29ydEJ5UHJvcHJldHk+ID0gW107XHJcbiAgc29ydE1ldGFzOiBTb3J0TWV0YVtdID0gW107XHJcbiAgc2VsZWN0ZWRGdWxsSXRlbXM/OiBBcnJheTxhbnk+ID0gW107XHJcbiAgc2VsZWN0aW9uOiBhbnk7XHJcbiAgbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlO1xyXG4gIHByaXZhdGUgX2RpYWxvZ1JlZj86IER5bmFtaWNEaWFsb2dSZWY7XHJcbiAgLy9qc29uU3RyaW5nTGF5b3V0OiBzdHJpbmcgPSAne1wiZmlyc3RcIjowLFwicm93c1wiOjEwLFwibXVsdGlTb3J0TWV0YVwiOltdLFwiY29sdW1uV2lkdGhzXCI6XCJcIixcInRhYmxlV2lkdGhcIjpcIjExODhweFwiLFwiY29sdW1uT3JkZXJcIjpbXCJcIl19JztcclxuICBsYXRlc3RGaWx0ZXJzPzogSUZpbHRlcmVkUmVxdWVzdFtdO1xyXG4gIGlzQWR2YW5jZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gcHJpdmF0ZSBfcGFnZSA6IElQYWdlPGFueT4gPSB7XHJcbiAgLy8gICBpdGVtczogW10sXHJcbiAgLy8gICB0b3RhbENvdW50OiAwLFxyXG4gIC8vICAgc3VtbWFyaWVzOiBbXSxcclxuICAvLyAgIHRvdGFsUGFnZXM6IDAsXHJcbiAgLy8gICBwYWdlTnVtYmVyOiAxLFxyXG4gIC8vICAgcGFnZVNpemU6IDEwLFxyXG4gIC8vICAgbG9hZGluZzogZmFsc2VcclxuICAvLyB9O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KCkgZm9ybU5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaWQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGFnZWRSZXF1ZXN0PzogSVBhZ2VkUmVxdWVzdDtcclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uPzogSUdyaWRDb25maWd1cmF0aW9uO1xyXG5cclxuICBwcml2YXRlIF9wYWdlOiBJUGFnZTxhbnk+ID0ge1xyXG4gICAgaXRlbXM6IFtdLFxyXG4gICAgdG90YWxDb3VudDogMCxcclxuICAgIHN1bW1hcmllczogW10sXHJcbiAgICB0b3RhbFBhZ2VzOiAwLFxyXG4gICAgcGFnZU51bWJlcjogMSxcclxuICAgIHBhZ2VTaXplOiAxMCxcclxuICAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcGFnZSh2YWx1ZTogSVBhZ2U8YW55Pikge1xyXG4gICAgdGhpcy5fcGFnZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2UoKTogSVBhZ2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICB9XHJcbiAgLy8gKG5ld1BhZ2U6IElQYWdlPGFueT4pe1xyXG4gIC8vICAgaWYobmV3UGFnZSl7XHJcbiAgLy8gICAgIHRoaXMuX3BhZ2UgPSBuZXdQYWdlO1xyXG4gIC8vICAgICB0aGlzLl9leHRyYWN0U3VtbWFyaWVzKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIGdldCBwYWdlKCl7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICAvLyB9XHJcbiAgQElucHV0KCkga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RlbXBDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHRlbXBTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiA9IFtdO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgQElucHV0KCkgcHVibGljIHNldCBjb2x1bW5zKHZhbHVlOiBBcnJheTxHcmlkQ29sdW1uPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsQ29sdW1uc1Byb2Nlc3MoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PEdyaWRDb2x1bW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNTZWFyY2hCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgQElucHV0KCkgcHVibGljIHNldCBpc1NlYXJjaEJ1dHRvbkRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkID0gdmFsdWVcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGdyaWREYXRhPzogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25Db2x1bW46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93SGVhZGVyRmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2lzR3JpZERhdGFQYWdlZEluQXBpOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbkBJbnB1dCgpXHJcbnNldCBpc0dyaWREYXRhUGFnZWRJbkFwaSh2YWx1ZTogYm9vbGVhbikge1xyXG4gIHRoaXMuX2lzR3JpZERhdGFQYWdlZEluQXBpID0gdmFsdWU7XHJcbn1cclxuXHJcbmdldCBpc0dyaWREYXRhUGFnZWRJbkFwaSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5faXNHcmlkRGF0YVBhZ2VkSW5BcGk7XHJcbn1cclxuICBASW5wdXQoKSBoZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIFNob3dGaWx0ZXJDb2x1bW5zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93SW1wb3J0RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICBASW5wdXQoKSBzZXQgc2VhcmNoRmllbGRzKHZhbHVlOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvL3Jlc2V0XHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgLy9pbml0IHVzaW5nIHZhbHVlXHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IEZpbHRlckhlbHBlci5pbml0U2VhcmNoRmllbGRzKHZhbHVlKTtcclxuICAgICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzZWFyY2hGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IEdyaWRTb3J0TW9kZSB8IGFueSA9IEdyaWRTb3J0TW9kZS5NdWx0aXBsZTtcclxuICBASW5wdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBwcmVzZW50YXRpb25TZXR0aW5ncz86IFByZXNlbnRhdGlvblNldHRpbmdcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lO1xyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmNvbmZpZz8uZGF0YT8uc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWc/LmRhdGE/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IHZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uTW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hPbkluaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2VhcmNoT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KClcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hPbkluaXRcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNob3dHbG9iYWxTZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IHRydWVcclxuICBASW5wdXQoKSBzaG93U2VhcmNoRmllbGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBfc2hvd0NhbGVuZGVyVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93Q2FsZW5kZXJWaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3ID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5zdGFydClcclxuICAgICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgICAgc3RhcnQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBlbmQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBjYWxlbmRlclNjaGVtYTogRXZlbnRTY2hlbWEgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBfc2hvd0NhcmRWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dDYXJkVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0NhcmRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3Nob3dLYW5iYW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93S2FuYmFuVmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGJ1c2luZXNzQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHBhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG5cclxuICBASW5wdXQoKSBjaGVja2VkQnlGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNlbGVjdEFsbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2VsZWN0QWxsID0gdmFsdWU7XHJcblxyXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgRXZlbnQoJ3NlbGVjdEFsbENoYW5nZScpO1xyXG4gICAgY29uc3QgZXZlbnQ6IFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQgPSB7XHJcbiAgICAgIGNoZWNrZWQ6IHZhbHVlLFxyXG4gICAgICBvcmlnaW5hbEV2ZW50OiBzeW50aGV0aWNFdmVudCxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vblNlbGVjdEFsbENoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSB0YXJnZXRCdXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBkZXNjcmltaW5hdG9yVmFsdWU/OiBzdHJpbmdcclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RBbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zZWxlY3RBbGw7IH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGVkaXRSb3c6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVJvdzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgbG9hZDogRXZlbnRFbWl0dGVyPHsgcmVxdWVzdDogSVBhZ2VkUmVxdWVzdCwgaXNGb3JDYWxlbmRhcjogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0LCBpc0ZvckNhbGVuZGFyOiBib29sZWFuIH0+KCk7XHJcbiAgQE91dHB1dCgpIGJ1dHRvbkNvbHVtbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrUmVzdWx0PigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcbiAgQE91dHB1dCgpIHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4oKTtcclxuICBAT3V0cHV0KCkgY2FsZW5kYXJFdmVudENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdGF0dXNGaWx0ZXJDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAvLyAgIGlmKGNoYW5nZXNbJ3BhZ2UnXSl7XHJcbiAgLy8gICAgIHRoaXMuX2V4dHJhY3RTdW1tYXJpZXMoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgcHJvdGVjdGVkIGZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcblxyXG4gIGZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICBmaWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcbiAgY2hhbmdlSGVhZGVyRmlsdGVyc01vZGU6IHN0cmluZyA9IFwibWVudVwiO1xyXG5cclxuICBpdGVtcz86IGFueVtdO1xyXG4gIF9zZWFyY2hPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBpbmxpbmVBY3Rpb25Db2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICBvdmVyZmxvd0FjdGlvbkNvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIGhhc092ZXJmbG93QWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG92ZXJmbG93QWN0aW9uc01lbnU6IE1lbnVJdGVtW10gPSBbXTtcclxuICBjdXJyZW50QWN0aW9uUm93OiBhbnk7XHJcbiAgYWN0aW9uUGxhY2VtZW50ID0gQWN0aW9uUGxhY2VtZW50O1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ29sdW1ucygpOiBHcmlkQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRDb2x1bW5zKHZhbHVlOiBHcmlkQ29sdW1uW10pIHtcclxuICAgIGxldCBzYWZlVmFsdWUgPSB2YWx1ZVxyXG4gICAgICA/IFsuLi52YWx1ZS5maWx0ZXIoYyA9PiBjLmZpZWxkICE9IHRoaXMub3ZlcmZsb3dDb2x1bW5GaWVsZCldXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgdGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zID0gc2FmZVZhbHVlLmZpbHRlcihcclxuICAgICAgYyA9PiBjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucyA9IHNhZmVWYWx1ZS5maWx0ZXIoXHJcbiAgICAgIGMgPT4gYy5pc0J1dHRvbiA9PT0gdHJ1ZSAmJiBjLmFjdGlvbkRpc3BsYXkgIT09IEFjdGlvblBsYWNlbWVudC5JbmxpbmVcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5oYXNPdmVyZmxvd0FjdGlvbnMgPSB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucy5sZW5ndGggPiAxO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc092ZXJmbG93QWN0aW9ucykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQsXHJcbiAgICAgICAgICBpc0Zyb3plbjogdHJ1ZSxcclxuICAgICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1lbGxpcHNpcy12JyxcclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi10ZXh0IGhvdmVyOnNoYWRvdy04JyxcclxuICAgICAgICAgIGhlYWRlcjogJ01vcmUgYWN0aW9ucycsXHJcbiAgICAgICAgICB0cmFuc2xhdGVkSGVhZGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnTW9yZSBhY3Rpb25zJyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi5zYWZlVmFsdWUuZmlsdGVyKGMgPT4gIShjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZSkpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLm92ZXJmbG93QWN0aW9uc01lbnUgPSB0aGlzLmdldE92ZXJmbG93TWVudU1vZGVsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBzYWZlVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9jZXNzU3RpY2t5Q29sdW1ucyh0aGlzLl9zZWxlY3RlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmZsb3dNZW51TW9kZWwoKTogTWVudUl0ZW1bXSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzT3ZlcmZsb3dBY3Rpb25zKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xyXG4gICAgICBpZDogY29sLmZpZWxkLFxyXG4gICAgICBsYWJlbDogY29sLmhlYWRlcixcclxuICAgICAgaWNvbkNsYXNzOiBjb2wuYnV0dG9uSWNvbixcclxuICAgICAgc3R5bGVDbGFzczogY29sLnN0eWxlQ2xhc3MsXHJcbiAgICAgIGljb25TdHlsZUNsYXNzOiBjb2wuaWNvblN0eWxlQ2xhc3MsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudTogTWVudSwgZXZlbnQ6IEV2ZW50LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50QWN0aW9uUm93ID0gcm93O1xyXG4gICAgbWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25PdmVyZmxvd0FjdGlvbkNsaWNrZWQocm93OiBhbnksIG1lbnVJdGVtOiBNZW51SXRlbSkge1xyXG4gICAgaWYgKCFyb3cgfHwgIW1lbnVJdGVtIHx8ICFtZW51SXRlbS5pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idXR0b25DbGlja2VkKHJvdywgbWVudUl0ZW0uaWQpXHJcbiAgfVxyXG5cclxuICBpbXBvcnRhbnRDb2x1bW5zID0gWydjb25zdWx0JywgJ2VkaXQnLCAnZGVsZXRlJywgJ3VwbG9hZCcsICdkb3dubG9hZCcsICdpbmZvJywgJ25vdGVzJywgJ2R1cGxpY2F0ZScsICdmb3JtJ107XHJcbiAgaXNGaXJzdExvYWRPZlBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FjaGUgPSBuZXcgTWFwPGFueSwgc3RyaW5nW10+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc3RhdHVzQ29sb3JTZXJ2aWNlOiBTdGF0dXNDb2xvclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgX2ZpY2hpZXJTZXJ2aWNlOiBGaWNoaWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2U6IEh0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NhbGl6ZTogTG9jYWxpemVQaXBlLFxyXG4gICAgcHJpdmF0ZSBsYXlvdXRIZWxwZXJTZXJ2aWNlOiBMYXlvdXRIZWxwZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByaW1lbmdDb25maWc6IFByaW1lTkdDb25maWcsXHJcbiAgICBwcml2YXRlIGFwcFNldHRpbmdzU2VydmljZTogQXBwU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlOiBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcclxuICAgIHB1YmxpYyBjb25maWc/OiBEeW5hbWljRGlhbG9nQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBfcmVmPzogRHluYW1pY0RpYWxvZ1JlZixcclxuXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWApXHJcbiAgICBpZiAoZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgIT0gbnVsbFxyXG4gICAgICAmJiBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgIT0gXCJcIikge1xyXG4gICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlXHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSB0cnVlXHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyLXNsYXNoXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwiaGlkZV9maWx0ZXJcIjtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPT09IFwibWVudV9tb2RlXCIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1jaGVja1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcInJvd19tb2RlXCI7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwibWVudVwiXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwicm93XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktZWxsaXBzaXMtdlwiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcIm1lbnVfbW9kZVwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwic2hvd19maWx0ZXJcIjtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICBsZXQgbGFuZ3VlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocnRsTW9kZUtleXMucnRsTW9kZUVuYWJsZWQpO1xyXG5cclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5pc0FyID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShjb2x1bW4uaGVhZGVyISEpKVxyXG5cclxuICAgIHRoaXMuX3RlbXBDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG5cclxuICAgIHRoaXMudGVtcFNlYXJjaEZpZWxkcyA9IHRoaXMuX3NlYXJjaEZpZWxkcyA/PyBbXTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+XHJcbiAgICAgICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmZpZWxkKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucyB8fCB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29sdW1uLm9yZGVyID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlzUnRsTW9kZUVuYWJsZWQoKVxyXG4gICAgdGhpcy51cGRhdGVQcmltZU5HVGFibGVGaWx0ZXJzKClcclxuICAgIHRoaXMuX3J0bE1vZGVTdWJzY3JpYmUoKVxyXG5cclxuICAgIHRoaXMuZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snZW50aXR5SW5mbyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5lbnRpdHlJbmZvKSB7XHJcblxyXG4gICAgICAvLyAgICBpZiAoY2hhbmdlc1snZW50aXR5SW5mbyddICYmIHRoaXMuZW50aXR5SW5mbykge1xyXG4gICAgICB0aGlzLmFwcGx5RW50aXR5SW5mbyh0aGlzLmVudGl0eUluZm8pO1xyXG4gICAgICB0aGlzLmxvYWRTdGF0dXNDb2xvcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1sndGFyZ2V0QnVzaW5lc3NDbGFzcyddICYmIHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLmxvYWRTdGF0dXNDb2xvcnNEZXRhaWxzQnlCdXNpbmVzc0NsYXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0dXNNZXRhZGF0YT86IFN0YXR1c01ldGFkYXRhUmVzcG9uc2U7XHJcbiAgc3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5PzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhPy5vcHRpb25zLmZpbmQobyA9PiBvLnN0YXR1c1ZhbHVlID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KHN0YXR1c1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeT8ub3B0aW9ucy5maW5kKG8gPT4gby50cmFuc2xhdGVkTGFiZWwgPT09IHN0YXR1c1ZhbHVlKTtcclxuICB9XHJcblxyXG4gIGxvYWRTdGF0dXNDb2xvcnNEZXRhaWxzQnlCdXNpbmVzc0NsYXNzKCkge1xyXG5cclxuICAgIGlmICh0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MgIT0gdW5kZWZpbmVkICYmIHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3N0YXR1c0NvbG9yU2VydmljZS5nZXRTdGF0dXNDb2xvckRldGFpbHNCeUJ1c2luZXNzQ2xhc3NOYW1lKHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcylcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogU3RhdHVzTWV0YWRhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnMnLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZFN0YXR1c0NvbG9ycygpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLmJ1c2luZXNzQ2xhc3MhO1xyXG4gICAgY29uc3Qgc3RhdHVzRW51bU5hbWUgPSB0aGlzLmVudGl0eUluZm8/LnN0YXR1c0VudW1OYW1lITtcclxuXHJcbiAgICBpZiAoIWNsYXNzTmFtZSB8fCAhc3RhdHVzRW51bU5hbWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdNaXNzaW5nIGNsYXNzTmFtZSBvciBzdGF0dXNFbnVtTmFtZSBmb3IgZW50aXR5SW5mby4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzKGNsYXNzTmFtZSwgc3RhdHVzRW51bU5hbWUpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXRhZGF0YSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnMnLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgc3RhdHVzIGNvbG9yczonLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGlnaHRlbkNvbG9yKGhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwZXJjZW50OiBudW1iZXIgPSA3MCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICcnO1xyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG5cclxuICAgIGxldCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgbGV0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBsZXQgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHIgKyAoMjU1IC0gcikgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgKyAoMjU1IC0gZykgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGIgKyAoMjU1IC0gYikgKiBwZXJjZW50IC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgbmV3SGV4ID1cclxuICAgICAgJyMnICtcclxuICAgICAgW3IsIGcsIGJdXHJcbiAgICAgICAgLm1hcCh4ID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpXHJcbiAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdIZXg7XHJcbiAgfVxyXG5cclxuICBnZXRSZWFkYWJsZVRleHRDb2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICdibGFjayc7XHJcblxyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAyMzAgPyAnYmxhY2snIDogYCMke2hleH1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUVudGl0eUluZm8oZW50aXR5SW5mbzogRW50aXR5SW5mbykge1xyXG4gICAgaWYgKCFlbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3RhdHVzQ29sdW1uTmFtZSA9IGVudGl0eUluZm8uc3RhdHVzQ29sdW1uTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0NvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKFxyXG4gICAgICBjID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKSA9PT0gc3RhdHVzQ29sdW1uTmFtZVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXN0YXR1c0NvbHVtbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oYFN0YXR1cyBjb2x1bW4gXCIke2VudGl0eUluZm8uc3RhdHVzQ29sdW1uTmFtZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0dXNDb2x1bW4uaXNTdGF0dXNDb2x1bW4gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0J1dHRvbik7XHJcbiAgICBjb25zdCBvdGhlckNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNCdXR0b24gJiYgYyAhPT0gc3RhdHVzQ29sdW1uKTtcclxuXHJcbiAgICBjb25zdCBtYXhCdXR0b25PcmRlciA9XHJcbiAgICAgIGJ1dHRvbkNvbHVtbnMucmVkdWNlKChtLCBjKSA9PiBNYXRoLm1heChtLCBjLm9yZGVyID8/IDApLCAwKSB8fCAwO1xyXG5cclxuICAgIHN0YXR1c0NvbHVtbi5vcmRlciA9IG1heEJ1dHRvbk9yZGVyICsgMTtcclxuXHJcbiAgICBjb25zdCByZW9yZGVyZWQgPSBbXHJcbiAgICAgIC4uLmJ1dHRvbkNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKSksXHJcbiAgICAgIHN0YXR1c0NvbHVtbixcclxuICAgICAgLi4ub3RoZXJDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMCkpLFxyXG4gICAgXTtcclxuXHJcbiAgICByZW9yZGVyZWQuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4gKGNvbC5vcmRlciA9IGluZGV4KSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbLi4ucmVvcmRlcmVkXTtcclxuICB9XHJcblxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IEpTT04ucGFyc2UoY29uZmlndXJhdGlvbilcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcblxyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZENvbHVtbnNDaGFuZ2UobmV3VmFsdWU6IEdyaWRDb2x1bW5bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBuZXdWYWx1ZTtcclxuICAgIHRoaXMuc29ydENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIHNvcnRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgaXNJbXBvcnRhbnQgPSAoYzogR3JpZENvbHVtbikgPT5cclxuICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGMuZmllbGQpO1xyXG5cclxuICAgIGNvbnN0IHNvcnRXaXRoUHJpb3JpdHkgPSAoYTogR3JpZENvbHVtbiwgYjogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhSW1wID0gaXNJbXBvcnRhbnQoYSk7XHJcbiAgICAgIGNvbnN0IGJJbXAgPSBpc0ltcG9ydGFudChiKTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmICFiSW1wKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUltcCAmJiBiSW1wKSByZXR1cm4gMTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmIGJJbXApIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYS5maWVsZCkgLVxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYi5maWVsZClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYnV0dG9uQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcihjID0+IGMuaXNCdXR0b24pO1xyXG4gICAgY29uc3Qgb3RoZXJDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNCdXR0b24pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gW1xyXG4gICAgICAuLi5idXR0b25Db2x1bW5zLnNvcnQoc29ydFdpdGhQcmlvcml0eSksXHJcbiAgICAgIC4uLm90aGVyQ29sdW1ucyxcclxuICAgIF07XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcjogc3RyaW5nW10pOiBhbnlbXSB7XHJcblxyXG4gICAgY29uc3QgaW1wb3J0YW50ID0gdGhpcy5pbXBvcnRhbnRDb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGNvbHVtbk9yZGVyLmluY2x1ZGVzKGtleSkpXHJcbiAgICAgIC5tYXAoa2V5ID0+IHRoaXMuZmluZENvbHVtbkJ5S2V5KGtleSkpXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XHJcblxyXG4gICAgY29uc3Qgb3RoZXJzID0gY29sdW1uT3JkZXJcclxuICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmNsdWRlcyhrZXkpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpKVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgIHJldHVybiBbLi4uaW1wb3J0YW50LCAuLi5vdGhlcnNdO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbHVtbkJ5S2V5KGtleTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fdGVtcENvbHVtbnMpIHtcclxuICAgICAgZm9yIChsZXQgY29sIG9mIHRoaXMuX3RlbXBDb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLl90ZW1wQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm90SW5TcGVjaWZpZWRDb2x1bW4oZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoZmllbGQpXHJcbiAgICAgICYmIGZpZWxkICE9PSB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQ7XHJcbiAgfVxyXG5cclxuICBpc092ZXJmbG93Q29sdW1uKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmaWVsZCA9PT0gdGhpcy5vdmVyZmxvd0NvbHVtbkZpZWxkO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1N0aWNreUNvbHVtbnMoY29sdW1uczogR3JpZENvbHVtbltdKSB7XHJcbiAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2w6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbC5pc0Zyb3plbikge1xyXG4gICAgICAgIGNvbC5uZ1N0eWxlID0gdGhpcy5nZXRUaGVTdHlsZShjb2wsIGluZGV4KVxyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgY29sLmhlYWRlckNvbHVtblN0eWxlID0geyAuLi5jb2wubmdTdHlsZSwgekluZGV4OiAxMDAwIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldENoZWNrYm94U3R5bGUoKSB7XHJcbiAgICBpZiAodGhpcy5pc1J0bE1vZGUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICByaWdodDogYDBweGAsXHJcbiAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGVmdDogYDBweGAsXHJcbiAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRoZVN0eWxlKGNvbHVtbjogR3JpZENvbHVtbiwgY29sdW1uT3JkZXI6IG51bWJlcik6IGFueSB7XHJcblxyXG4gICAgY29uc3QgU1RBUlQgPSA5O1xyXG4gICAgY29uc3QgRklSU1RfR0FQID0gMzc7XHJcbiAgICBjb25zdCBHQVAgPSA0NjtcclxuXHJcbiAgICBpZiAoIWNvbHVtbi5pc0Zyb3plbikge1xyXG4gICAgICByZXR1cm4ge31cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sdW1uLmlzRnJvemVuID09IHRydWUpIHtcclxuXHJcbiAgICAgIGxldCBlbGVtZW50UG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSB0aGlzLm11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICBlbGVtZW50UG9zaXRpb24gPSAzMCArIGVsZW1lbnRQb3NpdGlvbiArIChjb2x1bW5PcmRlciA/PyAwKSAqIDYwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChjb2x1bW5PcmRlciA9PT0gMCkge1xyXG4gICAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uT3JkZXIgPT09IDEpIHtcclxuICAgICAgICAgIGVsZW1lbnRQb3NpdGlvbiA9IFNUQVJUICsgRklSU1RfR0FQO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50UG9zaXRpb24gPSBTVEFSVCArIEZJUlNUX0dBUCArIChjb2x1bW5PcmRlciAtIDEpICogR0FQO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc1J0bE1vZGUpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcmlnaHQ6IGAke2VsZW1lbnRQb3NpdGlvbn1weGAsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgICBcIm1pbi13aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxlZnQ6IGAke2VsZW1lbnRQb3NpdGlvbn1weGAsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgICBcIm1pbi13aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNSdGxNb2RlRW5hYmxlZCgpIHtcclxuICAgIGlmICh0aGlzLl9sYXlvdXRTZXJ2aWNlLmlzUnRsTW9kZUVuYWJsZWQoKSkge1xyXG4gICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUHJpbWVOR1RhYmxlRmlsdGVycygpIHtcclxuICAgIHRoaXMuX3ByaW1lbmdDb25maWcuc2V0VHJhbnNsYXRpb24oe1xyXG4gICAgICBzdGFydHNXaXRoOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3N0YXJ0c1dpdGgnKSxcclxuICAgICAgY29udGFpbnM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY29udGFpbnMnKSxcclxuICAgICAgbm90Q29udGFpbnM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbm90Q29udGFpbnMnKSxcclxuICAgICAgZW5kc1dpdGg6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZW5kc1dpdGgnKSxcclxuICAgICAgZXF1YWxzOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VxdWFscycpLFxyXG4gICAgICBub3RFcXVhbHM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbm90RXF1YWxzJyksXHJcbiAgICAgIG5vRmlsdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vRmlsdGVyJyksXHJcbiAgICAgIGx0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2x0JyksXHJcbiAgICAgIGx0ZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19sdGUnKSxcclxuICAgICAgZ3Q6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZ3QnKSxcclxuICAgICAgZ3RlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2d0ZScpLFxyXG4gICAgICBpczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19pcycpLFxyXG4gICAgICBpc05vdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19pc05vdCcpLFxyXG4gICAgICBiZWZvcmU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYmVmb3JlJyksXHJcbiAgICAgIGFmdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2FmdGVyJyksXHJcbiAgICAgIGRhdGVJczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlSXMnKSxcclxuICAgICAgZGF0ZUlzTm90OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVJc05vdCcpLFxyXG4gICAgICBkYXRlQmVmb3JlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVCZWZvcmUnKSxcclxuICAgICAgZGF0ZUFmdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVBZnRlcicpLFxyXG4gICAgICBjbGVhcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19jbGVhcicpLFxyXG4gICAgICBhcHBseTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hcHBseScpLFxyXG4gICAgICBtYXRjaEFsbDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19tYXRjaEFsbCcpLFxyXG4gICAgICBtYXRjaEFueTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19tYXRjaEFueScpLFxyXG4gICAgICBhZGRSdWxlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2FkZFJ1bGUnKSxcclxuICAgICAgcmVtb3ZlUnVsZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19yZW1vdmVSdWxlJyksXHJcbiAgICAgIGFjY2VwdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hY2NlcHQnKSxcclxuICAgICAgcmVqZWN0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3JlamVjdCcpLFxyXG4gICAgICBjaG9vc2U6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY2hvb3NlJyksXHJcbiAgICAgIHVwbG9hZDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc191cGxvYWQnKSxcclxuICAgICAgY2FuY2VsOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2NhbmNlbCcpLFxyXG4gICAgICB0b2RheTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc190b2RheScpLFxyXG4gICAgICB3ZWVrSGVhZGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3dlZWtIZWFkZXInKSxcclxuICAgICAgZGF0ZUZvcm1hdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlRm9ybWF0JyksXHJcbiAgICAgIHdlYWs6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfd2VhaycpLFxyXG4gICAgICBtZWRpdW06IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWVkaXVtJyksXHJcbiAgICAgIHN0cm9uZzogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19zdHJvbmcnKSxcclxuICAgICAgcGFzc3dvcmRQcm9tcHQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfcGFzc3dvcmRQcm9tcHQnKSxcclxuICAgICAgZW1wdHlNZXNzYWdlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VtcHR5TWVzc2FnZScpLFxyXG4gICAgICBlbXB0eUZpbHRlck1lc3NhZ2U6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZW1wdHlGaWx0ZXJNZXNzYWdlJyksXHJcbiAgICAgIGZpcnN0RGF5T2ZXZWVrOiAxLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ydGxNb2RlU3Vic2NyaWJlKCkge1xyXG4gICAgdGhpcy5fbGF5b3V0U2VydmljZS5lbmFibGVSdGxNb2RlU3ViamVjdCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhID09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMuaXNSdGxNb2RlID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlcyhzZWFyY2hGaWVsZFZhbHVlczogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZC5lbWl0KHNlYXJjaEZpZWxkVmFsdWVzKVxyXG4gIH1cclxuXHJcbiAgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gKHRoaXMucGFnZS50b3RhbENvdW50IC0gdGhpcy5wYWdlLnBhZ2VTaXplKSA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gMCA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBlZGl0KGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5lZGl0Um93LmVtaXQoaXRlbVt0aGlzLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlKGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5kZWxldGVSb3cuZW1pdChpdGVtW3RoaXMua2V5XSk7XHJcbiAgfVxyXG5cclxuICBsYXp5TG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5wYWdlZFJlcXVlc3QgPT0gbnVsbCAmJiB0aGlzLnBhZ2VkUmVxdWVzdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3QgPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNraXBDb3VudCA9IGV2ZW50LmZpcnN0ID09IDEgPyAwIDogZXZlbnQuZmlyc3Q7XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdC5tYXhSZXN1bHRDb3VudCA9IGV2ZW50LnJvd3M7XHJcbiAgICBpZiAodGhpcy5mb3JtTmFtZSAmJiB0aGlzLmlzRmlyc3RMb2FkT2ZQYWdlKSB7XHJcbiAgICAgIHRoaXMuaXNGaXJzdExvYWRPZlBhZ2UgPSBmYWxzZVxyXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG4gICAgICBpZiAoc3RvcmVkVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyO1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5XaWR0aHMuc3BsaXQoJywnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgICAgICAgY29sdW1uT3JkZXIuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvbHVtbldpZHRoc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCk7XHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2V4aXN0aW5nQ29sdW1uSW5kZXhdLndpZHRoID0gY29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3RlZENvbHVtbnMucHVzaCh0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdXBkYXRlZFNlbGVjdGVkQ29sdW1ucztcclxuXHJcbiAgICAgICAgaWYgKChzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhICYmIHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkgfHwgKHNlc3Npb25EYXRhLmZpbHRlcnMpKSB7XHJcbiAgICAgICAgICBpZiAoc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YSAmJiBzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YS5mb3JFYWNoKChtZXRhOiB7IGZpZWxkOiBhbnk7IG9yZGVyOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgICBsZXQgc29ydE1ldGE6IFNvcnRNZXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6IG1ldGEuZmllbGQsXHJcbiAgICAgICAgICAgICAgICBvcmRlcjogbWV0YS5vcmRlclxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBldmVudC5zb3J0RmllbGQgPSBtZXRhLmZpZWxkO1xyXG4gICAgICAgICAgICAgIGV2ZW50LnNvcnRPcmRlciA9IG1ldGEub3JkZXI7XHJcbiAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YT8ucHVzaChzb3J0TWV0YSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNlc3Npb25EYXRhLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgbGV0IGZpbHRlcnM6IHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIH0gPSB7fTtcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoc2Vzc2lvbkRhdGEuZmlsdGVycykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmlsdGVyTWV0YWRhdGFdKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyTWV0YWRhdGFWYWx1ZSA9IGZpbHRlck1ldGFkYXRhIGFzIFtGaWx0ZXJNZXRhZGF0YV07XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJNZXRhZGF0YVZhbHVlWzBdICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJzW2ZpZWxkTmFtZV0gPSBmaWx0ZXJNZXRhZGF0YVZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBc3NpZ24gdGhlIGZpbHRlcnMgdG8gdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgICAgICAgICAvLyBldmVudC5maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoc2Vzc2lvbkRhdGEuZmlsdGVycykucmVkdWNlKChmaWx0ZXJzOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB9LCBbZmllbGROYW1lLCBmaWx0ZXJNZXRhZGF0YSBdICkgPT4ge1xyXG4gICAgICAgICAgICAvLyAgIHZhciBmaWx0ZXJNZXRhZGF0YVZhbHVlID0gZmlsdGVyTWV0YWRhdGEgYXMgRmlsdGVyTWV0YWRhdGE7XHJcbiAgICAgICAgICAgIC8vICAgaWYgKGZpbHRlck1ldGFkYXRhVmFsdWUudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBmaWx0ZXJzW2ZpZWxkTmFtZV0gPSBmaWx0ZXJNZXRhZGF0YSBhcyBGaWx0ZXJNZXRhZGF0YTtcclxuICAgICAgICAgICAgLy8gICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdhbGwgZmlsdGVycycsIGZpbHRlcnMpXHJcbiAgICAgICAgICAgIC8vICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgICAgICAgICAgIC8vIH0sIHt9KTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWx0ZXJzQXJyYXk6IFtzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB8IG51bGw7IG1hdGNoTW9kZTogc3RyaW5nLG9wZXJhdG9yIDogc3RyaW5nIH1bXV1bXSA9IE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRWYWx1ZV0pID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgICAgICAgICAvLyAgICAge1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIGlmKGZpbHRlci52YWx1ZSl7XHJcbiAgICAgICAgICAgIC8vICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZmllbGQgOmZpZWxkTmFtZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBsYWJlbFZhbHVlIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICB0eXBlIDogdGhpcy5pbmZlcklucHV0VHlwZShmaWVsZE5hbWUpLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9wZXJhdG9yIDogdGhpcy5nZXRPcGVyYXRvck51bWJlcihmaWx0ZXIubWF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAvLyAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoRmllbGQnLHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBzZXNzaW9uIGRhdGEgZm91bmQgaW4gbG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ncmlkSGVhZGVyRmlsdGVycyA9IHRoaXMuX2V4dHJhY3RGaWx0ZXJzKGV2ZW50LmZpbHRlcnMpO1xyXG4gICAgdGhpcy5fZXh0cmFjdFNvcnRDcml0ZXJpYXMoZXZlbnQpO1xyXG4gICAgdGhpcy5zZWFyY2goKTtcclxuICB9XHJcblxyXG4gIGZpZWxkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsICYmIHRoaXMuY29sdW1ucyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG5cclxuICBidXR0b25DbGlja2VkKGl0ZW06IGFueSwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbVt0aGlzLmtleV0sIHNlbGVjdEtleU9ubHk6IHRoaXMuc2VsZWN0S2V5T25seSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCh7IGZpZWxkOiBmaWVsZCwga2V5OiBpdGVtLCBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHkgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXl3b3JkVmFsdWVDaGFuZ2VkKGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5rZXl3b3JkID0ga2V5d29yZFxyXG4gIH1cclxuXHJcbiAgaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW52YWxpZFNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzXHJcbiAgICAgID8uZmlsdGVyKHggPT4geC5yZXF1aXJlZCA9PSB0cnVlICYmICh4LnZhbHVlID09IHVuZGVmaW5lZCB8fCB4LnZhbHVlID09ICcnIHx8IHgudmFsdWUgPT0gbnVsbCkpXHJcblxyXG4gICAgaWYgKGludmFsaWRTZWFyY2hGaWVsZHMgPT0gdW5kZWZpbmVkIHx8IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cclxuICAgIGludmFsaWRTZWFyY2hGaWVsZHMuZm9yRWFjaChzZWFyY2hGaWVsZCA9PiB7XHJcbiAgICAgIG1lc3NhZ2VzLnB1c2goYDxiPiR7dGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oc2VhcmNoRmllbGQubGFiZWxWYWx1ZSl9PC9iPiAke3RoaXMubG9jYWxpemUudHJhbnNmb3JtKFwic2hhcmVkX3NlYXJjaF9maWVsZF9yZXF1aXJlZFwiKX1gKTtcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2VzRnJvbUFycmF5U3RyaW5nKG1lc3NhZ2VzKTtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgaW5pdFNlYXJjaE9uSW5pdCgpIHtcclxuICAgIGxldCBpbnZhbGlkU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHNcclxuICAgICAgPy5maWx0ZXIoeCA9PiB4LnJlcXVpcmVkID09IHRydWUgJiYgKHgudmFsdWUgPT0gdW5kZWZpbmVkIHx8IHgudmFsdWUgPT0gJycgfHwgeC52YWx1ZSA9PSBudWxsKSkgPz8gW11cclxuXHJcbiAgICBpZiAodGhpcy5fc2VhcmNoT25Jbml0KSB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaE9uSW5pdCA9IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbWJvQm94TGFiZWxDaGFuZ2VkKGV2ZW50PzogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XHJcbiAgICB0aGlzLl9leHRyYWN0U2VhcmNoQm94RmlsdGVycygpO1xyXG4gICAgdGhpcy5fZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2goZXZ0OiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInNlYXJjaD4+PlwiLCB0aGlzLnNlYXJjaEZpZWxkcylcclxuICAgIC8vIHNldCBnbG9iYWwgZmlsdGVyIHZhbHVlXHJcblxyXG4gICAgdGhpcy5fZXh0cmFjdE9ubHlWaXNpYmxlU2VhcmNoRmllbGRzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ICYmIHRoaXMuaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKSkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5zdW1tYXJpZXMgPSB0aGlzLl9leHRyYWN0SGF2ZVN1bW1hcnlQcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNvcnRpbmcgPSB0aGlzLl9zb3J0O1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5rZXl3b3JkID0gdGhpcy5rZXl3b3JkO1xyXG5cclxuICAgICAgLy9hZGQgc2VhcmNoIGJveCBmaWx0ZXJzXHJcbiAgICAgIHRoaXMuX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk7XHJcblxyXG4gICAgICAvL2dlbmVyYXRlIGZpbHRlcnMgaHRtbCB0ZW1wbGF0ZVxyXG4gICAgICB0aGlzLl9nZW5lcmF0ZUZpbHRlcnNIdG1sVGVtcGxhdGUoKTtcclxuICAgICAgLy9jbG9uZVxyXG5cclxuICAgICAgbGV0IG5ld1JlcXVlc3Q6IElQYWdlZFJlcXVlc3QgPSB0aGlzLl9jbG9uZVBhZ2VkUmVxdWVzdCh0aGlzLnBhZ2VkUmVxdWVzdCk7XHJcblxyXG4gICAgICAvL2NvbmNhdCBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QuZmlsdGVycyA9IFsuLi50aGlzLl9ncmlkSGVhZGVyRmlsdGVycywgLi4udGhpcy5fc2VhcmNoQm94RmlsdGVyc107XHJcblxyXG4gICAgICAvL2V4Y2x1ZGUgdXNlbGVzcyBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0ZpbHRlcnMobmV3UmVxdWVzdCk7XHJcblxyXG4gICAgICAvLyB0ZXN0IGlmIGZpbHRlcnMgdmFsdWUgaGFzIGNoYW5nZWRcclxuICAgICAgaWYgKCh0aGlzLmxhdGVzdEZpbHRlcnMgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmxhdGVzdEZpbHRlcnMpIDogbnVsbClcclxuICAgICAgICAhPT0gKG5ld1JlcXVlc3QuZmlsdGVycyA/IEpTT04uc3RyaW5naWZ5KG5ld1JlcXVlc3QuZmlsdGVycykgOiBudWxsKSkge1xyXG4gICAgICAgIG5ld1JlcXVlc3Quc2tpcENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgICAgIHRoaXMuZHQuZmlyc3QgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2F2ZSBsYXRlc3QgZmlsdGVyc1xyXG4gICAgICB0aGlzLmxhdGVzdEZpbHRlcnMgPSBuZXdSZXF1ZXN0LmZpbHRlcnM7XHJcblxyXG4gICAgICB0aGlzLmxvYWQuZW1pdCh7IHJlcXVlc3Q6IG5ld1JlcXVlc3QsIGlzRm9yQ2FsZW5kYXI6IHRoaXMuX3Nob3dDYWxlbmRlclZpZXcgfSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RFbGVtZW50SW5kZXgoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5kdCkgcmV0dXJuIDA7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZS5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZHQuZmlyc3QgPT09IDAgPyAxIDogKHRoaXMuZHQ/LmZpcnN0ID8/IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShmaWVsZDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBzdW1tYXJ5Um93ID0gdGhpcy5wYWdlLnN1bW1hcmllc1xyXG4gICAgICAuZmluZChzID0+IHMucHJvcHJldHkudG9VcHBlckNhc2UoKSA9PSBmaWVsZC50b1VwcGVyQ2FzZSgpKTtcclxuICAgIGlmIChzdW1tYXJ5Um93KSB7XHJcbiAgICAgIHJldHVybiBzdW1tYXJ5Um93LnN1bW1hcnk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpIHtcclxuICAgIGxldCBzZWxlY3Rpb246IGFueVtdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKCh2OiBhbnkpID0+IHsga2V5cy5wdXNoKHZbdGhpcy5rZXldKSB9KTtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IGtleXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbiA/IFt0aGlzLnNlbGVjdGlvblt0aGlzLmtleV1dIDogW107XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbdGhpcy5zZWxlY3Rpb25dIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnPy5kYXRhPy5pc0FkdmFuY2VkU2VhcmNoICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGlvbilcclxuXHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgICBsZXQgZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dDogRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCA9IHtcclxuICAgICAgICAgIGl0ZW1LZXlQcm9wZXJ0eU5hbWU6IHRoaXMua2V5LFxyXG4gICAgICAgICAgaXRlbXM6IHNlbGVjdGlvblswXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZj8uY2xvc2UoZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEFsbCA9IGV2ZW50LmNoZWNrZWQ7XHJcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RBbGwpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja2VkQnlGaWVsZCAmJiB0aGlzLmNoZWNrZWRCeUZpZWxkLnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5wYWdlLml0ZW1zLmZpbHRlcihcclxuICAgICAgICAgICAgaXRlbSA9PiBpdGVtW3RoaXMuY2hlY2tlZEJ5RmllbGRdID09PSB0cnVlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucGFnZS5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuZm9ybU5hbWUpIHtcclxuICAvLyAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmZvcm1OYW1lKTtcclxuXHJcbiAgLy8gICAgIGlmIChzdG9yZWRWYWx1ZSkge1xyXG4gIC8vICAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gSlNPTi5wYXJzZShzdG9yZWRWYWx1ZSk7XHJcbiAgLy8gICAgICAgbGV0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vICAgICAgIGxldCBjb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoaXRlbS5maWVsZCA9PT0gJ3VwbG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdkb3dubG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdjb25zdWx0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2RlbGV0ZScpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdlZGl0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvcnQoKGEsIGIpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChhLm9yZGVyICE9PSB1bmRlZmluZWQgJiYgYi5vcmRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIHJldHVybiAwO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goc2VsZWN0ZWRDb2x1bW4gPT4ge1xyXG4gIC8vICAgICAgICAgY29sdW1uT3JkZXIucHVzaChzZWxlY3RlZENvbHVtbi5maWVsZCk7XHJcbiAgLy8gICAgICAgICBjb25zdCBzZWxlY3RlZFdpZHRoID0gc2VsZWN0ZWRDb2x1bW4ubWluV2lkdGg7XHJcbiAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRXaWR0aCkge1xyXG4gIC8vICAgICAgICAgICBjb2x1bW5XaWR0aHMucHVzaChzZWxlY3RlZFdpZHRoLnRvU3RyaW5nKCkpO1xyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgLy9jb2x1bW5XaWR0aHMucHVzaCgnOTAnKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAvLyAgICAgICBzZXNzaW9uRGF0YS5jb2x1bW5PcmRlciA9IGNvbHVtbk9yZGVyO1xyXG4gIC8vICAgICAgIHNlc3Npb25EYXRhLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRocy5qb2luKCcsJyk7XHJcblxyXG4gIC8vICAgICAgIC8vbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5mb3JtTmFtZSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpKTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAvL2NvbnN0IHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUYWJsZUNvbmZpZ0pTT04oKTtcclxuICAvLyAgICAgICAvL2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZm9ybU5hbWUsIHJlc3VsdCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdlbmVyYXRlVGFibGVDb25maWdKU09OKCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCB0YWJsZUNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5qc29uU3RyaW5nTGF5b3V0KTtcclxuICAvLyAgIHRhYmxlQ29uZmlnLmNvbHVtbk9yZGVyID0gdGhpcy5zZWxlY3RlZENvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQpO1xyXG4gIC8vICAgLy90YWJsZUNvbmZpZy5jb2x1bW5XaWR0aHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoKCkgPT4gJzkwJykuam9pbignLCcpO1xyXG4gIC8vICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhYmxlQ29uZmlnKTtcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgb25TdGF0ZVJlc3RvcmUodGFibGVTdGF0ZTogVGFibGVTdGF0ZSkge1xyXG4gICAgaWYgKHRhYmxlU3RhdGUuc2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGFibGVTdGF0ZS5zZWxlY3Rpb25cclxuICAgICAgdGhpcy5vblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5mb3JtTmFtZSkge1xyXG4gICAgLy8gICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG4gICAgLy8gICBpZiAoc3RvcmVkVmFsdWUpIHtcclxuICAgIC8vICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5XaWR0aHMuc3BsaXQoJywnKTtcclxuXHJcbiAgICAvLyAgICAgLy8gVXBkYXRlIHNlbGVjdGVkQ29sdW1ucyBiYXNlZCBvbiBjb2x1bW5PcmRlciBhbmQgY29sdW1uV2lkdGhzXHJcbiAgICAvLyAgICAgY29uc3QgdXBkYXRlZFNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgICAvLyAgICAgY29sdW1uT3JkZXIuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAvLyAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvbHVtbldpZHRoc1tpbmRleF07XHJcbiAgICAvLyAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiBzZWxlY3RlZENvbHVtbnNcclxuICAgIC8vICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uSW5kZXggPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgLy8gICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIElmIHRoZSBjb2x1bW4gZXhpc3RzIGluIHNlbGVjdGVkQ29sdW1ucywgdXBkYXRlIGl0cyB3aWR0aFxyXG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XS53aWR0aCA9IGNvbHVtbldpZHRoO1xyXG4gICAgLy8gICAgICAgICB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zLnB1c2godGhpcy5zZWxlY3RlZENvbHVtbnNbZXhpc3RpbmdDb2x1bW5JbmRleF0pO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRDb2x1bW5zIHdpdGggdGhlIHJlc3RvcmVkIGRhdGFcclxuICAgIC8vICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM7XHJcblxyXG5cclxuICAgIC8vICAgICAgIGlmKHN0b3JlZFZhbHVlKXtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAgIC8vICAgICAgICAgaWYgKChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHx8IChkYXRhLmZpbHRlcnMgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmZpbHRlcnMgPiAwKSkge1xyXG4gICAgLy8gICAgICAgICAgIGlmIChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGRhdGEubXVsdGlTb3J0TWV0YS5mb3JFYWNoKChtZXRhOiB7IGZpZWxkOiBhbnk7IG9yZGVyOiBhbnk7IH0pID0+IHsgXHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICBsZXQgc29ydCA9IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogbWV0YS5maWVsZCxcclxuICAgIC8vICAgICAgICAgICAgICAgICBvcmRlcjogbWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICB0aGlzLl9zb3J0ID0gW3NvcnRdO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7ICBcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgaWYgKGRhdGEuZmlsdGVycykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZmlsdGVyc0FycmF5OiBbc3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfCBudWxsOyBtYXRjaE1vZGU6IHN0cmluZyxvcGVyYXRvciA6IHN0cmluZyB9W11dW10gPSBPYmplY3QuZW50cmllcyhkYXRhLmZpbHRlcnMpO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZFZhbHVlXSkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYoZmlsdGVyLnZhbHVlKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZpZWxkIDpmaWVsZE5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxhYmVsVmFsdWUgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMuaW5mZXJJbnB1dFR5cGUoZmllbGROYW1lKSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgOiB0aGlzLmdldE9wZXJhdG9yTnVtYmVyKGZpbHRlci5tYXRjaE1vZGUpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlYXJjaEZpZWxkJyxzZWFyY2hGaWVsZCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGaWVsZHMpIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICB9XHJcblxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiTm8gc2Vzc2lvbiBkYXRhIGZvdW5kIGluIGxvY2FsU3RvcmFnZVwiKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmR0Py5jbGVhcigpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWApXHJcbiAgfVxyXG5cclxuICBnZXRPcGVyYXRvck51bWJlcihvcGVyYXRvcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBGaWx0ZXJPcGVyYXRvclR5cGVbb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyT3BlcmF0b3JUeXBlXSA/PyAtMTtcclxuICB9XHJcbiAgaW5mZXJJbnB1dFR5cGUodmFsdWU6IGFueSk6IElucHV0VHlwZXMge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuSU5URUdFUjtcclxuICAgICAgfSBlbHNlIGlmICgvXlxcZCtcXC5cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBJbnB1dFR5cGVzLkRBVEU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuVEVYVF9CT1g7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBJbnB1dFR5cGVzLlRFWFRfQk9YO1xyXG4gICAgfVxyXG4gIH1cclxuICBsb2FkSW5pdGlhbFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZVsnZ2V0J10oJ3RhYmxlLXN0YXRlJyk7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcml2YXRlIF9leHRyYWN0RmlsdGVycyhldmVudDogRmlsdGVyTWV0YWRhdGFbXSB8IGFueSk6IElGaWx0ZXJlZFJlcXVlc3RbXSB7XHJcbiAgICBsZXQgZmlsdGVyczogSUZpbHRlcmVkUmVxdWVzdFtdID0gW107XHJcbiAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gY29sLmN1cnJlbmN5T3RoZXJDb2RlO1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSB0aGlzLmRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICAgIGN1cnJlbmN5ID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5jb2RlRGV2aXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGxldCBmaWx0ZXIgPSBldmVudFtjb2wuZmllbGRdO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX25vdE51bGxPclVuZGVmaW5lZChmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbm90TnVsbE9yVW5kZWZpbmVkKGl0ZW0udmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShpdGVtLnZhbHVlLCAneXl5eS1NTS1kZCcpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlckhlbHBlci5Ub09wZXJhdG9yVHlwZShpdGVtLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWU6IGl0ZW0udmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBjb2wuaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgIG51bU9mRGVjaW1hbDogY29sLm51bU9mRGVjaW1hbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogY29sLmlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSwgJ3l5eXktTU0tZGQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJIZWxwZXIuVG9PcGVyYXRvclR5cGUoZmlsdGVyLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgIHByb3ByZXR5TmFtZTogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICBoZWFkZXI6IGNvbC5oZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgbnVtT2ZEZWNpbWFsOiBjb2wubnVtT2ZEZWNpbWFsLFxyXG4gICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgY29tYm9ib3hMYWJlbDogY29sLmNvbWJvTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgIGlzQ3VzdG9tQ29sdW1uOiBjb2wuaXNDdXN0b21Db2x1bW5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTb3J0Q3JpdGVyaWFzKGxhenlMb2FkRXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNvcnRNZXRhID0gdGhpcy5fdG9Tb3J0TWV0YShsYXp5TG9hZEV2ZW50KTtcclxuICAgIGlmIChzb3J0TWV0YSkge1xyXG4gICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gR3JpZFNvcnRNb2RlLlNpbmdsZSkge1xyXG4gICAgICAgIHRoaXMuX2V4dHJhY3RTaW5nbGVTb3J0Q3JpdGVyaWEoc29ydE1ldGEpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zb3J0TW9kZSA9PT0gR3JpZFNvcnRNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgdGhpcy5fZXh0cmFjdE11bHRpcGxlU29ydENyaXRlcmlhcyhzb3J0TWV0YSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFNpbmdsZVNvcnRDcml0ZXJpYShzb3J0TWV0YTogU29ydE1ldGEpIHtcclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmIChzb3J0TWV0YS5maWVsZCkge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgc29ydCBlbGVtZW50XHJcbiAgICAgICAgbGV0IGlzQ3VzdG9tQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBzb3J0TWV0YS5maWVsZCk/LmlzQ3VzdG9tQ29sdW1uO1xyXG4gICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICBwcm9wZXJ0eTogc29ydE1ldGEuZmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogc29ydE1ldGEub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnLFxyXG4gICAgICAgICAgaXNDdXN0b21Db2x1bW46IGlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NvcnQgPSBbc29ydF1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBwcm9jZXNzIFxcJ1NpbmdsZVNvcnRcXCcgd2hlbiBbc29ydE1vZGVdIGlzIFxcJ211bHRpcGxlXFwnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0TXVsdGlwbGVTb3J0Q3JpdGVyaWFzKHNvcnRNZXRhczogU29ydE1ldGFbXSkge1xyXG5cclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHNvcnRNZXRhcyAmJiBBcnJheS5pc0FycmF5KHNvcnRNZXRhcykpIHtcclxuICAgICAgICAvLyBjcmVhdGUgbmV3IHNvcnQgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuX3NvcnQgPSBbXTtcclxuICAgICAgICB0aGlzLnNvcnRNZXRhcyA9IHNvcnRNZXRhcztcclxuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXRhICcsIHNvcnRNZXRhcylcclxuICAgICAgICBzb3J0TWV0YXMuZm9yRWFjaChzbSA9PiB7XHJcbiAgICAgICAgICBpZiAoc20uZmllbGQpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICAgICAgbGV0IGlzQ3VzdG9tQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBzbS5maWVsZCk/LmlzQ3VzdG9tQ29sdW1uO1xyXG4gICAgICAgICAgICBsZXQgc29ydDogSVNvcnRCeVByb3ByZXR5ID0ge1xyXG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzbS5maWVsZCxcclxuICAgICAgICAgICAgICBvcmRlcjogc20ub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnLFxyXG4gICAgICAgICAgICAgIGlzQ3VzdG9tQ29sdW1uOiBpc0N1c3RvbUNvbHVtblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2FkZCB0aGUgbmV3IGVsZW1lbnQgdG8gX3NvcnRcclxuICAgICAgICAgICAgdGhpcy5fc29ydC5wdXNoKHNvcnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHByb2Nlc3MgXFwnTXVsdGlwbGVTb3J0XFwnIHdoZW4gW3NvcnRNb2RlXSBpcyBcXCdzaW5nbGVcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25vdE51bGxPclVuZGVmaW5lZChvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG9iaiAhPSBudWxsXHJcbiAgICAgICYmIG9iaiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0T25seVZpc2libGVTZWFyY2hGaWVsZHMoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3MgJiZcclxuICAgICAgdGhpcy5wcmVzZW50YXRpb25TZXR0aW5ncy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMudGVtcFNlYXJjaEZpZWxkc1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy50ZW1wU2VhcmNoRmllbGRzLmZpbHRlcihzZiA9PiB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5wcmVzZW50YXRpb25TZXR0aW5ncz8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHNcclxuICAgICAgICAgIC5maW5kKHAgPT4gcC5ibG9ja05hbWUgPT09IHNmLmZpZWxkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICFjb25maWcgfHwgY29uZmlnLmlzQmxvY2tWaXNpYmxlID09PSB0cnVlIHx8IGNvbmZpZy5pc0Jsb2NrVmlzaWJsZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICB0aGlzLl9leHRyYWN0T25seVZpc2libGVTZWFyY2hGaWVsZHMoKTtcclxuXHJcbiAgICAgIHRoaXMuc2VhcmNoRmllbGRzLmZvckVhY2goKHNmOiBTZWFyY2hGaWVsZCkgPT4ge1xyXG4gICAgICAgIC8vaWYgKHNmLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBzZi52YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHNmLm9wZXJhdG9yICE9IG51bGwgJiYgc2Yub3BlcmF0b3IgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBzZi52YWx1ZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgbGV0IGZpbHRlckJ5UHJvcGVydHk6IElGaWx0ZXJlZFJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgIG9wZXJhdG9yOiBzZi5vcGVyYXRvclxyXG4gICAgICAgICAgICAsIGZpbHRlclZhbHVlOiBzZi52YWx1ZVxyXG4gICAgICAgICAgICAsIHByb3ByZXR5TmFtZTogc2YuZmllbGRcclxuICAgICAgICAgICAgLCBoZWFkZXI6IHNmLmxhYmVsVmFsdWVcclxuICAgICAgICAgICAgLCB0eXBlOiBzZi50eXBlXHJcbiAgICAgICAgICAgICwgY29tYm9ib3hMYWJlbDogc2YuY29tYm9ib3hMYWJlbFxyXG4gICAgICAgICAgICAsIGN1cnJlbmN5OiBzZi5jdXJyZW5jeVxyXG4gICAgICAgICAgICAsIGlzRnJhY3Rpb246IHNmLmlzRnJhY3Rpb25cclxuICAgICAgICAgICAgLCBudW1PZkRlY2ltYWw6IHNmLm51bU9mRGVjaW1hbFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEJveEZpbHRlcnMucHVzaChmaWx0ZXJCeVByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2Yub3BlcmF0b3IgPT0gdW5kZWZpbmVkIHx8IHNmLm9wZXJhdG9yID09IG51bGwpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHNlYXJjaCBmaWVsZCB3aXRoIFtmaWVsZCA6ICR7c2YuZmllbGR9XSBoYXZlIG5vIG9wZXJhdG9yc2ApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nsb25lUGFnZWRSZXF1ZXN0KHJlcXVlc3Q6IElQYWdlZFJlcXVlc3QpOiBJUGFnZWRSZXF1ZXN0IHtcclxuICAgIGxldCBjbG9uZTogSVBhZ2VkUmVxdWVzdCA9IHtcclxuICAgICAgbWF4UmVzdWx0Q291bnQ6IHJlcXVlc3QubWF4UmVzdWx0Q291bnQsXHJcbiAgICAgIHNraXBDb3VudDogcmVxdWVzdC5za2lwQ291bnQsXHJcbiAgICAgIHNvcnRpbmc6IHJlcXVlc3Quc29ydGluZyxcclxuICAgICAga2V5d29yZDogcmVxdWVzdC5rZXl3b3JkLFxyXG4gICAgICBmaWx0ZXJzOiByZXF1ZXN0LmZpbHRlcnMsXHJcbiAgICAgIGdldEFsbERhdGE6IHJlcXVlc3QuZ2V0QWxsRGF0YSxcclxuICAgICAgc3VtbWFyaWVzOiByZXF1ZXN0LnN1bW1hcmllc1xyXG4gICAgfTtcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RIYXZlU3VtbWFyeVByb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBsZXQgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgbGV0IGhhdmVTdW1tYXJ5Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmhhdmVTdW1tYXJ5ID09PSB0cnVlKTtcclxuICAgIGlmIChoYXZlU3VtbWFyeUNvbHVtbnMgJiYgaGF2ZVN1bW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcHJvcGVydGllcyA9IGhhdmVTdW1tYXJ5Q29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvcGVydGllcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTdW1tYXJpZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYWdlLnN1bW1hcmllcykge1xyXG4gICAgICB0aGlzLnBhZ2Uuc3VtbWFyaWVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgdGhpcy5zdW1tYXJpZXNbcy5wcm9wcmV0eV0gPSBzLnN1bW1hcnk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdE11bHRpU29ydE1ldGFJdGVtcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NvcnQgPSBbXTtcclxuICAgIGlmICh0aGlzLnNvcnRNZXRhcykge1xyXG4gICAgICB0aGlzLnNvcnRNZXRhcy5mb3JFYWNoKChzOiBTb3J0TWV0YSkgPT4ge1xyXG4gICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICBwcm9wZXJ0eTogcy5maWVsZCxcclxuICAgICAgICAgIG9yZGVyOiBzLm9yZGVyID09IDEgPyAnQVNDJyA6ICdERVNDJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNvcnRJdGVtID0gdGhpcy5fc29ydC5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PSBzb3J0LnByb3BlcnR5KTtcclxuXHJcbiAgICAgICAgaWYgKHNvcnRJdGVtKSB7XHJcbiAgICAgICAgICBpZiAoc29ydEl0ZW0ub3JkZXIgIT0gc29ydC5vcmRlcikge1xyXG4gICAgICAgICAgICBzb3J0SXRlbS5vcmRlciA9IHNvcnQub3JkZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc29ydC5wdXNoKHNvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90b1NvcnRNZXRhKHRhYmxlTGF6eUxvYWRFdmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogYW55IHtcclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0YWJsZUxhenlMb2FkRXZlbnQuc29ydEZpZWxkICYmIHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0T3JkZXIpIHtcclxuICAgICAgICBsZXQgc29ydE1ldGE6IElTb3J0TWV0YSA9IHtcclxuICAgICAgICAgIGZpZWxkOiB0YWJsZUxhenlMb2FkRXZlbnQuc29ydEZpZWxkLFxyXG4gICAgICAgICAgb3JkZXI6IHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0T3JkZXJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNvcnRNZXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHRhYmxlTGF6eUxvYWRFdmVudC5tdWx0aVNvcnRNZXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlTGF6eUxvYWRFdmVudC5tdWx0aVNvcnRNZXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBbc29ydE1vZGVdIGhhdmUgYmVlbiBzZXQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlRmlsdGVyc0h0bWxUZW1wbGF0ZSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgPSBcIlwiXHJcbiAgICAvL2V4Y2x1ZGUgdXNlbGVzcyBHcmlkIGZpbHRlciBcclxuICAgIHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzID0gdGhpcy5fZXhjbHVkZVVzZWxlc3NHcmlkRmlsdGVyKHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzKVxyXG5cclxuICAgIC8vYWRkIHNlYXJjaCBCb3ggZmlsdGVycyBodG1sXHJcbiAgICBpZiAodGhpcy5fc2VhcmNoQm94RmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgPSB0aGlzLl9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlXHJcbiAgICAgICAgLmdlbmVyYXRlR3JpZEZpbHRlcnNUZW1wbGF0ZSh0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FkZCBncmlkIGhlYWRlciBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9ncmlkSGVhZGVyRmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgKz0gdGhpcy5faHRtbFRlbXBsYXRlR2VuZXJhdG9yU2VydmljZVxyXG4gICAgICAgIC5nZW5lcmF0ZUdyaWRGaWx0ZXJzVGVtcGxhdGUodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4Y2x1ZGVVc2VsZXNzR3JpZEZpbHRlcihmaWx0ZXJzOiBJRmlsdGVyZWRSZXF1ZXN0W10pIHtcclxuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcih4ID0+XHJcbiAgICAgIHguZmlsdGVyVmFsdWUgIT09IG51bGwgJiYgeC5maWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHguZmlsdGVyVmFsdWUgIT09IFwiXCIgJiYgeC5vcGVyYXRvciAhPT0gdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXhjbHVkZVVzZWxlc3NGaWx0ZXJzKHBhZ2VkUmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgaWYgKHBhZ2VkUmVxdWVzdCAmJiBwYWdlZFJlcXVlc3QuZmlsdGVycykge1xyXG4gICAgICBwYWdlZFJlcXVlc3QuZmlsdGVycyA9IHBhZ2VkUmVxdWVzdC5maWx0ZXJzLmZpbHRlcihmID0+IGYuZmlsdGVyVmFsdWUgIT0gdW5kZWZpbmVkICYmIGYuZmlsdGVyVmFsdWUgIT0gbnVsbClcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdlZFJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnRFeGNlbCgpIHtcclxuICAgIHRoaXMucGFnZWRSZXF1ZXN0ISEuZ2V0QWxsRGF0YSA9IHRydWVcclxuICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlICE9IG51bGwgJiYgdGhpcy5jcnVkU2VydmljZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5pc0dyaWREYXRhUGFnZWRJbkFwaSkge1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmdldEFsbFBhZ2VkKHRoaXMucGFnZWRSZXF1ZXN0ISEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHZhbHVlOiBJUGFnZWRSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEl0ZW1zID0gRXhwb3J0RXhjZWxIZWxwZXIucHJlcHJvY2Vzc0RhdGVGb3JFeGNlbCh2YWx1ZS5pdGVtcyk7XHJcbiAgICAgICAgICAgIHZhbHVlLml0ZW1zID0gZm9ybWF0dGVkSXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5wYWdlLml0ZW1zLmZpbHRlcigoY29sOiBhbnkpID0+ICFjb2wuaXNCdXR0b24pO1xyXG4gICAgICBmaWx0ZXJlZERhdGEgPSBFeHBvcnRFeGNlbEhlbHBlci5wcmVwcm9jZXNzRGF0ZUZvckV4Y2VsKGZpbHRlcmVkRGF0YSk7XHJcbiAgICAgIHRoaXMucGFnZS5pdGVtcyA9IGZpbHRlcmVkRGF0YVxyXG4gICAgICB0aGlzLmV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHRoaXMucGFnZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHZhbHVlOiBhbnkpIHtcclxuICAgIGltcG9ydChcInhsc3hcIikudGhlbih4bHN4ID0+IHtcclxuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB4bHN4LnV0aWxzLmJvb2tfbmV3KCk7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCEuZmlsdGVycz8ubGVuZ3RoICE9IDApIHtcclxuICAgICAgICBjb25zdCBtYXBwZWRGaWx0ZXJzID0gdGhpcy5wYWdlZFJlcXVlc3QhLmZpbHRlcnM/Lm1hcChmaWx0ZXIgPT4gKHtcclxuICAgICAgICAgIHByb3BlcnR5OiBmaWx0ZXIucHJvcHJldHlOYW1lLFxyXG4gICAgICAgICAgb3BlcmF0b3JOYW1lOiB0aGlzLmdldEZpbHRlck9wZXJhdG9yTmFtZShmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci5maWx0ZXJWYWx1ZVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KDxhbnlbXT5tYXBwZWRGaWx0ZXJzKVxyXG4gICAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIGZpbHRlcnMsICdGaWx0ZXJzJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5pc0J1dHRvbikubWFwKGNvbHVtbiA9PiBjb2x1bW4udHJhbnNsYXRlZEhlYWRlciEhKVxyXG4gICAgICBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSBzZWxlY3RlZENvbHVtbnNGaWVsZHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpXHJcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGEgPSB2YWx1ZS5pdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGE6IHsgW2hlYWRlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgcm93RGF0YVtjb2wudHJhbnNsYXRlZEhlYWRlciEhXSA9IGl0ZW1bY29sLmZpZWxkXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcm93RGF0YTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkV29ya3NoZWV0RGF0YSA9IHRoaXMucmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGEsIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcylcclxuICAgICAgY29uc3Qgd29ya3NoZWV0ID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KGZpbHRlcmVkV29ya3NoZWV0RGF0YSk7XHJcbiAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHdvcmtzaGVldCwgJ0RhdGEnKTtcclxuICAgICAgY29uc3QgZXhjZWxCdWZmZXI6IGFueSA9IHhsc3gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgdGhpcy5zYXZlQXNFeGNlbEZpbGUoZXhjZWxCdWZmZXIsIFwiZXhjZWxcIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVBc0V4Y2VsRmlsZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IEVYQ0VMX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICBsZXQgRVhDRUxfRVhURU5TSU9OID0gJy54bHN4JztcclxuICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICB0eXBlOiBFWENFTF9UWVBFXHJcbiAgICB9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUgKyAnX2V4cG9ydF8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBFWENFTF9FWFRFTlNJT04pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyT3BlcmF0b3JOYW1lKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTDogcmV0dXJuICdFUVVBTCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkxFU1NPUkVRVUFMOiByZXR1cm4gJ0xFU1MgT1IgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5HUkVBVEVST1JFUVVBTDogcmV0dXJuICdHUkVBVEVSIE9SIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTEVTUzogcmV0dXJuICdMRVNTJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuR1JFQVRFUjogcmV0dXJuICdHUkVBVEVSJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTk9URVFVQUw6IHJldHVybiAnTk9UIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuQ09OVEFJTlM6IHJldHVybiAnQ09OVEFJTlMnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ1VOS05PV05fT1BFUkFUT1InO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGE6IGFueVtdLCBzZWxlY3RlZENvbHVtbnNGaWVsZHM6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHdvcmtzaGVldERhdGEubWFwKHJvdyA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1JvdzogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcykge1xyXG4gICAgICAgIGlmIChyb3cuaGFzT3duUHJvcGVydHkoY29sKSkge1xyXG4gICAgICAgICAgbmV3Um93W2NvbF0gPSByb3dbY29sXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld1JvdztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSGVhZGVyRmlsdGVycygpIHtcclxuICAgIGlmICh0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICAgICAgdGhpcy5maWx0ZXJUb29sdGlwID0gXCJzaG93X2ZpbHRlclwiO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICAgIH1cclxuICAgIGVsc2UgeyAvL3RoaXMuc2hvd0hlYWRlckZpbHRlcnMgPT09IGZhbHNlXHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlci1zbGFzaFwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcImhpZGVfZmlsdGVyXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIZWFkZXJGaWx0ZXJzTW9kZSgpIHtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuZHQuY2xlYXIoKVxyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYCwgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcClcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPT09IFwibWVudV9tb2RlXCIpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJtZW51XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktY2hlY2tcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJyb3dfbW9kZVwiO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNlbGVjdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5kdC5maWx0ZXJzW2NvbC5maWVsZF0gPSBbeyB2YWx1ZTogbnVsbCwgbWF0Y2hNb2RlOiB1bmRlZmluZWQgfV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHQuX2ZpbHRlcigpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwicm93XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktZWxsaXBzaXMtdlwiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcIm1lbnVfbW9kZVwiO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNlbGVjdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5kdC5maWx0ZXJzW2NvbC5maWVsZF0gPSB7IHZhbHVlOiBudWxsLCBtYXRjaE1vZGU6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmR0Ll9maWx0ZXIoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJDbGFzc0NvbG9yKGNvbHVtblR5cGU6IERpc3BsYXlUeXBlcyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29sb3JmdWwgPSB0aGlzLmxheW91dEhlbHBlclNlcnZpY2UubGF5b3V0Q29uZmlndXJhdGlvbi5pc0NvbG9yZnVsTW9kZUVuYWJsZWQ7XHJcbiAgICBpZiAoY29sb3JmdWwgPT09IHRydWUpIHtcclxuICAgICAgbGV0IGNvbG9yRm9ySW50ZWdlckRpc3BsYXkgPSBEaXNwbGF5VHlwZUNvbG9yc1tjb2x1bW5UeXBlXSB8fCAnd2hpdGUtZ3JpZCc7XHJcbiAgICAgIHJldHVybiBjb2xvckZvckludGVnZXJEaXNwbGF5O1xyXG4gICAgfSBlbHNlIHJldHVybiAnd2hpdGUtZ3JpZCdcclxuICB9XHJcblxyXG4gIGdldCBjb2xvcmZ1bCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxheW91dEhlbHBlclNlcnZpY2UubGF5b3V0Q29uZmlndXJhdGlvbi5pc0NvbG9yZnVsTW9kZUVuYWJsZWQ7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGluaXRpYWxDb2x1bW5zUHJvY2VzcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRldmlzZVNvY2lldGVOdW1PZkRlY2ltYWw6IG51bWJlciA9IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLmFwcFNldHRpbmdzLmRldmlzZVNvY2lldGUubm9tYnJlRGVjaW1hbGVzID8/IERlZmF1bHRTb2NpZXRlRGV2aXNlLm5vbWJyZURlY2ltYWxlcztcclxuXHJcbiAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAvLyBzZXQgaXNOdW1lcmljXHJcbiAgICAgIGNvbC5pc051bWVyaWMgPSBjb2wudHlwZSAhPSB1bmRlZmluZWQgJiYgY29sLnR5cGUgIT0gbnVsbCAmJiAoTnVtZXJpY0Rpc3BsYXlUeXBlcy5pbmRleE9mKGNvbC50eXBlKSA+PSAwKTtcclxuXHJcbiAgICAgIC8vIHNldCBmaWx0ZXJJbnB1dFR5cGVcclxuICAgICAgc3dpdGNoIChjb2wudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkRBVEVfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdkYXRlJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREFURVRJTUVfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdkYXRlJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWTpcclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdudW1lcmljJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdib29sZWFuJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICd0ZXh0JztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBudW1PZkRlY2ltYWxcclxuICAgICAgaWYgKGNvbC5udW1PZkRlY2ltYWwpIHJldHVybjtcclxuXHJcbiAgICAgIGlmICghY29sLnR5cGUpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY29sLmlzTnVtZXJpYykge1xyXG4gICAgICAgIGNvbC5udW1PZkRlY2ltYWwgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbC50eXBlID09PSBEaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IGRldmlzZVNvY2lldGVOdW1PZkRlY2ltYWw7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbC50eXBlID09PSBEaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDYWxlbmRhckV2ZW50Q2xpY2soaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5tb2RlID09PSBcIlNFQVJDSFwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5jYWxlbmRhckV2ZW50Q2xpY2suZW1pdChpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGVSYW5nZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnNlYXJjaEZpZWxkcz8uZmluZCh4ID0+IHguZmllbGQgPT09IHRoaXMuY2FsZW5kZXJTY2hlbWE/LnN0YXJ0KVxyXG4gICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xyXG4gICAgICBzdGFydC52YWx1ZSA9IGV2ZW50LnN0YXJ0O1xyXG4gICAgICBlbmQudmFsdWUgPSBldmVudC5lbmQ7XHJcbiAgICAgIHN0YXJ0LmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgZW5kLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGxTZWFyY2hIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5tYXhSZXN1bHRDb3VudCA9IGV2ZW50Lm1heFJlc3VsdENvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5za2lwQ291bnQgPSBldmVudC5za2lwQ291bnQ7XHJcbiAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICAgIHRoaXMucGFnZSQubmV4dCh7IC4uLnRoaXMucGFnZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlYWRlclRpdGxlcyh0aXRsZXM6IHN0cmluZ1tdLCBpdGVtOiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRpdGxlcyB8fCAhaXRlbSlcclxuICAgICAgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IGtleSA9IGl0ZW0udWlkO1xyXG4gICAgaWYgKHRoaXMudGl0bGVDYWNoZS5oYXMoa2V5KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50aXRsZUNhY2hlLmdldChrZXkpIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcyA9IHRpdGxlcy5tYXAodCA9PiBpdGVtW3RdKS5maWx0ZXIodiA9PiAhIXYpO1xyXG4gICAgdGhpcy50aXRsZUNhY2hlLnNldChrZXksIHJlcyk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgb25TdGF0dXNGaWx0ZXJDaGFuZ2VkKGV2dDogYW55KSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IGV2dDtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbHRlcihzZiA9PiBzZi5maWVsZCAhPT0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKTtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzPy5wdXNoKHtcclxuICAgICAgZmllbGQ6IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSA/PyBcIlwiLFxyXG4gICAgICB2YWx1ZTogZXZ0LFxyXG4gICAgICBsYWJlbFZhbHVlOiAnJyxcclxuICAgICAgdHlwZTogSW5wdXRUeXBlcy5DT01CT0JPWCxcclxuICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTCxcclxuICAgICAgc3R5bGVDbGFzczogXCJoaWRkZW5cIlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnRlbXBTZWFyY2hGaWVsZHNcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZChldnQ6IGFueSkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBldnQ7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzPy5maWx0ZXIoc2YgPT4gc2YuZmllbGQgIT09IFwiV29ya2Zsb3dFdGF0XCIpO1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHM/LnB1c2goe1xyXG4gICAgICBmaWVsZDogXCJXb3JrZmxvd0V0YXRcIixcclxuICAgICAgdmFsdWU6IGV2dCxcclxuICAgICAgbGFiZWxWYWx1ZTogJycsXHJcbiAgICAgIHR5cGU6IElucHV0VHlwZXMuQ09NQk9CT1gsXHJcbiAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUuRVFVQUwsXHJcbiAgICAgIHN0eWxlQ2xhc3M6IFwiaGlkZGVuXCJcclxuICAgIH0pO1xyXG4gICAgdGhpcy50ZW1wU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHMgPz8gdGhpcy50ZW1wU2VhcmNoRmllbGRzXHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uLCBpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICAgIGlmICghYXJyYXlCdWZmZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgY29uc3QgZmljaGllclRvU2VuZCA9IG5ldyBGaWNoaWVyKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGF0ZUZpY2hpZXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbSA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5vYmpldCA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbUZpY2hpZXJDb21wbGV0ID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRlc2NyaXB0aW9uID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuY29udGVudSA9IGJhc2U2NENvbnRlbnQ7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQudGFibGVMaWVlID0gdGhpcy5idXNpbmVzc0NsYXNzO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnBrZXkgPSBpdGVtLnVpZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlLmNyZWF0ZShmaWNoaWVyVG9TZW5kKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJmaWNoaWVyX2pvaW50XCIpO1xyXG4gICAgICAgICAgdGhpcy5vblNhdmUuZW1pdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgfVxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUwLFxyXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQtLTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyYWdFbnRlckNvdW50ID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICB4OiBldmVudC5jbGllbnRYICsgNTAsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkNvbmZpcm1TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvblxyXG4gICAgICB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbilcclxuICAgICAgfHwgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIHRoaXMuX3JlZj8uY2xvc2UoW10pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgc2VsZWN0aW9uID0gIHRoaXMuc2VsZWN0aW9uLm1hcChpID0+IGlbdGhpcy5rZXldKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGV0IGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQ6IERyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQgPSB7XHJcbiAgICAgIGl0ZW1LZXlQcm9wZXJ0eU5hbWU6IHRoaXMua2V5LFxyXG4gICAgICBpdGVtczogc2VsZWN0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX3JlZj8uY2xvc2UoZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbFNlbGVjdGlvbigpIDogdm9pZCB7XHJcbiAgICBpZighdGhpcy5fcmVmKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fcmVmLmNsb3NlKFtdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEoKSA6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgIGlmKCF0aGlzLmNvbmZpZz8uZGF0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNvbmZpZ0RhdGE6IGFueSA9IHRoaXMuY29uZmlnLmRhdGE7XHJcblxyXG4gICAgaWYgKCdpc0FkdmFuY2VkU2VhcmNoJyBpbiBjb25maWdEYXRhKSB7XHJcbiAgICAgIHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA9IGNvbmZpZ0RhdGEuaXNBZHZhbmNlZFNlYXJjaCA/PyBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoJ3NlbGVjdGlvbk1vZGUnIGluIGNvbmZpZ0RhdGEpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gY29uZmlnRGF0YS5zZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgnc2VsZWN0S2V5T25seScgaW4gY29uZmlnRGF0YSkge1xyXG4gICAgICB0aGlzLnNlbGVjdEtleU9ubHkgPSBjb25maWdEYXRhLnNlbGVjdEtleU9ubHk7XHJcbiAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyb3IpXHJcbiAgICB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgYXQgZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEgOiAnLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtAc2xpZGVJbk91dF09XCJzaG93U2VhcmNoRmllbGQgPyAnaW4nIDogJ291dCdcIiAqbmdJZj1cInNob3dHbG9iYWxTZWFyY2hcIj5cclxuICAgIDx0c2ktc2VhcmNoLWJveCBcclxuICAgICAgW2lzUnRsTW9kZV09XCJpc1J0bE1vZGVcIiBcclxuICAgICAgWyhzZWFyY2hGaWVsZHMpXT1cInNlYXJjaEZpZWxkc1wiIFxyXG4gICAgICBbYnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCJcclxuICAgICAgW2VudGl0eUluZm9dPVwiZW50aXR5SW5mb1wiXHJcbiAgICAgIFtzdGF0dXNNZXRhZGF0YV09XCJzdGF0dXNNZXRhZGF0YVwiXHJcbiAgICAgIFtkZXNjcmltaW5hdG9yVmFsdWVdPVwiZGVzY3JpbWluYXRvclZhbHVlXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc0NoYW5nZSk9XCJzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoJGV2ZW50KVwiIFxyXG4gICAgICAoa2V5d29yZFZhbHVlQ2hhbmdlZCk9XCJrZXl3b3JkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAoc2VhcmNoRmllbGRzQXBwbGllZCk9XCJzZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgIChzdGF0dXNGaWx0ZXJDaGFuZ2VkKT1cIm9uU3RhdHVzRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKHdvcmtmbG93RXRhdEZpbHRlckNoYW5nZWQpPVwib25Xb3JrZmxvd0V0YXRGaWx0ZXJDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAoY29tYm9Cb3hMYWJlbENoYW5nZWQpPVwiY29tYm9Cb3hMYWJlbENoYW5nZWQoJGV2ZW50KVwiPlxyXG4gICAgPC90c2ktc2VhcmNoLWJveD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FsZW5kZXJWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0NhcmRWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0thbmJhblZpZXcgPT09IGZhbHNlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIFxyXG4gICAgPHAtdGFibGUgI2R0IFxyXG4gICAgICBbbGF6eV09XCJpc0dyaWREYXRhUGFnZWRJbkFwaVwiIFxyXG4gICAgICBbbGF6eUxvYWRPbkluaXRdPVwic2VhcmNoT25Jbml0XCIgXHJcbiAgICAgIFt0b3RhbFJlY29yZHNdPVwicGFnZS50b3RhbENvdW50XCIgXHJcbiAgICAgIFtsb2FkaW5nXT1cInBhZ2UubG9hZGluZ1wiIFxyXG4gICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cInRydWVcIlxyXG4gICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCIgXHJcbiAgICAgIFtjb2x1bW5zXT1cInNlbGVjdGVkQ29sdW1uc1wiIFxyXG4gICAgICBbdmFsdWVdPVwicGFnZS5pdGVtc1wiXHJcbiAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiIFxyXG4gICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgXHJcbiAgICAgIFsocm93cyldPVwicGFnZS5wYWdlU2l6ZVwiXHJcbiAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIFxyXG4gICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImZpZWxkcygpXCIgXHJcbiAgICAgIFt0YWJsZVN0eWxlXT1cInsgJ21pbi13aWR0aCc6ICc1MHJlbScgfVwiXHJcbiAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEsIDEwLCAyNSwgNTBdXCIgXHJcbiAgICAgIFtzb3J0TW9kZV09XCJzb3J0TW9kZVwiXHJcbiAgICAgIFttdWx0aVNvcnRNZXRhXT1cInNvcnRNZXRhc1wiIFxyXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXHJcbiAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIiBcclxuICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGlvblwiIFxyXG4gICAgICAob25MYXp5TG9hZCk9XCJsYXp5TG9hZCgkZXZlbnQpXCJcclxuICAgICAgKG9uUm93VW5zZWxlY3QpPVwib25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpXCJcclxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgXHJcbiAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcIlxyXG4gICAgICBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCIgXHJcbiAgICAgIGRhdGFLZXk9XCJ7eyBrZXkgfX1cIiBcclxuICAgICAgc2Nyb2xsSGVpZ2h0PVwiNjAwcHhcIiBcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLWdyaWRsaW5lc1wiIFxyXG4gICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgJ1Nob3dpbmcnIHwgbG9jYWxpemUgfX0ge3tnZXRGaXJzdEVsZW1lbnRJbmRleCgpfX0ge3tcclxuICAgICAgICAndG8nIHwgbG9jYWxpemVcclxuICAgICAgfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSBcclxuICAgICAge3RvdGFsUmVjb3Jkc30ge3sgJ2VudHJpZXMnIHwgbG9jYWxpemUgfX1cIiBcclxuICAgICAgPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XHJcbiAgICAgICAgICAgIHt7IGhlYWRlciB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyQnV0dG9uXCIgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF90b2dnbGVfaGVhZGVyX2ZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbaWNvbl09XCJmaWx0ZXJJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cImZpbHRlclRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVycygpXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVhZGVyRmlsdGVyc1wiIHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfdG9nZ2xlX2hlYWRlcl9maWx0ZXJfbW9kZVwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtpY29uXT1cImZpbHRlck1vZGVJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCJmaWx0ZXJNb2RlVG9vbHRpcFwiIFtzdHlsZUNsYXNzXT1cIidtbC0xIHAtYnV0dG9uLXByaW1hcnkgcC1idXR0b24taWNvbi1vbmx5J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVyc01vZGUoKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfY2xlYXJfZmlsdGVyX2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCInaWNvbi1jbGVhci1maWx0ZXInXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJtbC0xIHAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhckZpbHRlcnMoKVwiIFtpY29uU3JjXT1cIidhc3NldHMvbGF5b3V0L2ltYWdlcy9pY29uL2ljb24tY2xlYXItZmlsdGVyLnN2ZydcIj5cclxuICAgICAgICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX2V4cG9ydF9idXR0b25cIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1maWxlLWV4Y2VsXCIgKG9uQ2xpY2spPVwiZXhwb3J0RXhjZWwoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXN1Y2Nlc3MgaG92ZXI6c2hhZG93LTYgbWwtMiBwLTEgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwiWExTXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IGNsYXNzPVwibWwtMVwiIFtvcHRpb25zXT1cImNvbHVtbnNcIiBbbmdNb2RlbF09XCJzZWxlY3RlZENvbHVtbnNcIiBvcHRpb25MYWJlbD1cInRyYW5zbGF0ZWRIZWFkZXJcIlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSB7eyAnY29sdW1uc19zZWxlY3RlZCcgfCBsb2NhbGl6ZSB9fVwiIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMTgwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3RlZENvbHVtbnNDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXY+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2hvd0dsb2JhbFNlYXJjaFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNlYXJjaFwiIChjbGljayk9XCJzZWFyY2goKVwiPjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0aCBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBnZXRDaGVja2JveFN0eWxlKCkgOiB7fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICd6LWluZGV4LWNoZWNrYm94J1wiICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAjdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCIhKGNvbC5pc0J1dHRvbiAmJiBjb2wuYWN0aW9uRGlzcGxheSA9PSBhY3Rpb25QbGFjZW1lbnQuT3ZlcmZsb3cpXCJcclxuICAgICAgICAgICAgICBzY29wZT1cImNvbFwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBwVG9vbHRpcD1cInt7IGNvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICBbcFNvcnRhYmxlQ29sdW1uXT1cIighY29sLmlzQnV0dG9uIHx8ICFpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkgfHwgIShjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWSkpID8gXHJcbiAgICAgICAgICAgICAgY29sLmZpZWxkIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgW3BSZXNpemFibGVDb2x1bW5EaXNhYmxlZF09XCJjb2wuaXNCdXR0b24gfHwgY29sLnR5cGUgPT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCJjb2wuaXNCdXR0b24gfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpXCIgXHJcbiAgICAgICAgICAgICAgW3BSZW9yZGVyYWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZClcIiBwUmVvcmRlcmFibGVDb2x1bW5cclxuICAgICAgICAgICAgICBwUmVzaXphYmxlQ29sdW1uIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA6IHt9XCJcclxuICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWQtY29sdW1uXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkgfHwgY29sLnR5cGUgPT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZXCIgXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiW1xyXG4gICAgICAgICAgICAgICAgZ2V0SGVhZGVyQ2xhc3NDb2xvcihjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAoY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKSkgPyAndy0xcmVtJyA6ICcnLFxyXG4gICAgICAgICAgICAgICAgKGNvbC5pc0J1dHRvbiB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVkgfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpKSA/ICdub24tcmVzaXphYmxlLWNvbHVtbicgOiAnJyxcclxuICAgICAgICAgICAgICAgIF1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5oZWFkZXJDb2x1bW5TdHlsZSA6IHt9XCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RJblNwZWNpZmllZENvbHVtbihjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwicC0wIG0tMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNvbCBwLTAgbS0wXCIgW25nQ2xhc3NdPVwieyd3LTFyZW0nOiBjb2wuaXNCdXR0b259XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmhlYWRlciB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29sLWZpeGVkIHAtMCBtLTBcIiBzdHlsZT1cIndpZHRoOiAxcmVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgIT09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMXJlbSBtLTAgcC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZD1cInt7IGNvbC5maWVsZCB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgIDx0ciAqbmdJZj1cInNob3dIZWFkZXJGaWx0ZXJzXCI+XHJcbiAgICAgICAgICA8IS0tIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiIHN0eWxlPVwid2lkdGg6M3JlbVwiPjwvdGg+IC0tPlxyXG4gICAgICAgICAgPHRoIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICcnXCIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCI+PC90aD5cclxuICAgICAgICAgIDx0aCBzdHlsZT1cIm92ZXJmbG93OiBpbmhlcml0XCIgc2NvcGU9XCJjb2xcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyIFt0eXBlXT1cImNvbC5maWx0ZXJJbnB1dFR5cGVcIiBbZmllbGRdPVwiY29sLmZpZWxkXCIgW2Rpc3BsYXldPVwiY2hhbmdlSGVhZGVyRmlsdGVyc01vZGVcIlxyXG4gICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb2wubnVtT2ZEZWNpbWFsXCIgW21heEZyYWN0aW9uRGlnaXRzXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFttYXRjaE1vZGVdPVwiZmlsdGVyTWF0Y2hNb2RlLkVRVUFMU1wiPlxyXG4gICAgICAgICAgICA8L3AtY29sdW1uRmlsdGVyPlxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgIFxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtaXRlbSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiPlxyXG5cclxuICAgICAgICA8IS0tIENBU0UgOiBtdWx0aXBsZSBzZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgPHRyIFtuZ1N0eWxlXT1cIml0ZW0uY29sb3IgJiYgaXRlbS5jb2xvciAhPT0gJycgPyB7J2JhY2tncm91bmQtY29sb3InOiBpdGVtLmNvbG9yfSA6IHt9XCIgKm5nSWY9XCJcclxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlO1xyXG4gICAgICAgICAgICBlbHNlIG5vdE11bHRpcGxlU2VsZWN0aW9uTW9kZUJsb2NrXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50KVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsaXRlbSlcIiAoZHJhZ2VudGVyKT1cIm9uRHJhZ0VudGVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPHRkIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGdldENoZWNrYm94U3R5bGUoKSA6IHt9XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cIml0ZW1cIj48L3AtdGFibGVDaGVja2JveD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8IS0tIDx0ZCBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0KGl0ZW0pXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZShpdGVtKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICA8dGQgICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5uZ1N0eWxlIDoge31cIiBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDsgbWFyZ2luLWxlZnQ6IC0uNXJlbTtcIiAtLT5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVBpY2tlck91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVUaW1lUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlVGltZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRBVEVUSU1FX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtzaG93VGltZV09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ERUNJTUFMX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByYXRlT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlJBVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlOZXN0ZWRQcm9wT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuTkVTVEVEX1BST1BfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlTdGF0dXNDb2xvckJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURpc3BsYXktTmVzdGVkLVByb3AgW3NvdXJjZVVybF09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5U291cmNlVXJsXCIgW2lkXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlWYWx1ZV09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5bGFiZWxGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EaXNwbGF5LU5lc3RlZC1Qcm9wPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzQ29sb3JCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2xvcjsgZWxzZSBkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSByb3VuZGVkIHRleHQtd2hpdGUgdGV4dC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+IFxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW5WYWx1ZTsgZWxzZSBkaXNwbGF5U3RhdHVzQ29sdW1uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImdldFN0YXR1c0NvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5ICYmIGdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIGZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIm9wdC5jb2xvckhleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5jb2xvckhleCA/ICd3aGl0ZScgOiAnYmxhY2snXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWJsYWNrIGJnLXdoaXRlJzogIW9wdC5jb2xvckhleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtd2hpdGUnOiBvcHQuY29sb3JIZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQudHJhbnNsYXRlZExhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiAhZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktc3RhdHVzLWNvbHVtbiAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW47IGVsc2UgZGlzcGxheUJ1dHRvbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiBnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwibGlnaHRlbkNvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy10b3BdPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgIWdldFN0YXR1c09wdGlvbihpdGVtW2NvbC5maWVsZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1uZXN0ZWQtcHJvcCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlCdXR0b25CbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNCdXR0b247IGVsc2UgZGlzcGxheVRleHRFeWVCbG9ja1wiID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBmcm96ZW4tY29sdW1uLXJ0bC1tb2RlIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gIFtzdHlsZUNsYXNzXT1cImNvbC5zdHlsZUNsYXNzXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3sgY29sLmJ1dHRvbkljb24gfX1cIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiY29sLnRvb2xUaXBUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNvbC5idXR0b25MYWJlbCA/IGNvbC5idXR0b25MYWJlbCA6IGl0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChpdGVtLCBjb2wuZmllbGQpXCIgPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktdGV4dC1leWUgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5URVhUX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBtb3JlQWN0aW9uc0Jsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gbW9yZSBhY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21vcmVBY3Rpb25zQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZCA9PSBvdmVyZmxvd0NvbHVtbkZpZWxkOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1tZW51IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgI21lbnVNb3JlQWN0aW9ucyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm92ZXJmbG93QWN0aW9uc01lbnVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwib3ZlcmZsb3ctbWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwcHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW1lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1tZW51aXRlbS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLnN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKGl0ZW0sIG1lbnVJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCA9PT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgbWVudUl0ZW0uaWNvbkNsYXNzIH19IHAtbWVudWl0ZW0taWNvbiBiYWRnZS1pY29uIGhhcy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLmljb25TdHlsZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhZGdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0ubm90ZXNDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWRnZURpc2FibGVkXT1cIml0ZW0ubm90ZXNDb3VudCA9PSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkZ2VQb3NpdGlvbj1cInRvcC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWVudUl0ZW0uaWQgIT09ICdub3RlcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7bWVudUl0ZW0uaWNvbkNsYXNzfX0gcC1tZW51aXRlbS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVudUl0ZW0ubGFiZWwgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3tjb2wuYnV0dG9uSWNvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwie3tjb2wuc3R5bGVDbGFzc319IG92ZXJmbG93LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib3ZlcmZsb3dDb2x1bW5DbGlja2VkKG1lbnVNb3JlQWN0aW9ucywgJGV2ZW50LCBpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtYnV0dG9uPiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbVtjb2wuZmllbGRdIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEcmFnT3ZlclwiIFtuZ1N0eWxlXT1cInsgbGVmdDogbWVzc2FnZVBvc2l0aW9uLnggKyAncHgnLCB0b3A6IG1lc3NhZ2VQb3NpdGlvbi55ICsgJ3B4JyB9XCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyYWctbWVzc2FnZSBjdXJzb3ItZm9sbG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgXCJKb2ludHVyZVwiIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICA8IS0tIENBU0UgOiBzaW5nbGUgb3Igbm9uZSBzZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3RNdWx0aXBsZVNlbGVjdGlvbk1vZGVCbG9jaz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDx0ciBbbmdTdHlsZV09XCJpdGVtLmNvbG9yICYmIGl0ZW0uY29sb3IgIT09ICcnID8geydiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbS5jb2xvcn0gOiB7fVwiXHJcbiAgICAgICAgICAgICAgW3BTZWxlY3RhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3dJbmRleF09XCJpbmRleFwiIGlkPVwidHNpLWdyaWQtcm93LXt7aW5kZXh9fVwiPlxyXG5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIiBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBjb2wubmdTdHlsZSA6IHt9XCIgXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBtaW4tY29udGVudDsgYmFja2dyb3VuZDogd2hpdGU7XCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICd3LTFyZW0nOiBjb2wuaXNCdXR0b24sXHJcbiAgICAgICAgICAgICAgICAgIH1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5EQVRFVElNRV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIiBbc2hvd1RpbWVdPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGludGVnZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmF0ZU91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ORVNURURfUFJPUF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlTdGF0dXNDb2xvckJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGlzcGxheS1OZXN0ZWQtUHJvcCBbc291cmNlVXJsXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlTb3VyY2VVcmxcIiBbaWRdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlWYWx1ZV09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5bGFiZWxGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGlzcGxheS1OZXN0ZWQtUHJvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbG9yQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbG9yOyBlbHNlIGRpc3BsYXlTdGF0dXNWYWx1ZUNvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSByb3VuZGVkIHRleHQtd2hpdGUgdGV4dC1zbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c1ZhbHVlQ29sdW1uQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sdW1uVmFsdWU7IGVsc2UgZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhZz4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSAmJiBnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KGl0ZW1bY29sLmZpZWxkXSkgYXMgb3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInB4LTIgcHktMSBmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJvcHQuY29sb3JIZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJvcHQuY29sb3JIZXggPyAnd2hpdGUnIDogJ2JsYWNrJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ibGFjayBiZy13aGl0ZSc6ICFvcHQuY29sb3JIZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXdoaXRlJzogb3B0LmNvbG9ySGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LnRyYW5zbGF0ZWRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgJiYgIWdldFN0YXR1c09wdGlvbkZvclN0YXR1c0hpc3RvcnkoaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktc3RhdHVzLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2x1bW47IGVsc2UgZGlzcGxheUJ1dHRvbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCJnZXRTdGF0dXNDb2xvcihpdGVtW2NvbC5maWVsZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWc+LS0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiBnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKSBhcyBvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtYmFkZ2UgZm9udC1ib2xkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImxpZ2h0ZW5Db2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcF09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgICFnZXRTdGF0dXNPcHRpb24oaXRlbVtjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN0YXR1cy1iYWRnZSBmb250LWJvbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheUJ1dHRvbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNCdXR0b247IGVsc2UgZGlzcGxheUltYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5uZ1N0eWxlIDoge31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJwYWdlLmxvYWRpbmcgPyAnbm8tei1pbmRleCcgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZnJvemVuLWNvbHVtbi1ydGwtbW9kZSBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbc3R5bGVDbGFzc109XCJjb2wuc3R5bGVDbGFzc1wiIHR5cGU9XCJidXR0b25cIiBpY29uPVwie3sgY29sLmJ1dHRvbkljb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCJjb2wudG9vbFRpcFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNvbC5pc0ljb25CdXR0b24gPyAnJyA6IChjb2wuYnV0dG9uTGFiZWwgPz8gaXRlbVtjb2wuZmllbGRdKVwiPjwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1pbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5SW1hZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZOyBlbHNlIGRpc3BsYXlUZXh0RXllQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTJyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRzaS1pbWFnZS1kaXNwbGF5IFtoZWFkZXJUaXRsZXNdPVwiZ2V0SGVhZGVyVGl0bGVzKGNvbC5oZWFkZXJUaXRsZXMsIGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNSb3VuZGVkXT1cImNvbC5pc1JvdW5kZWRcIiBbc3JjXT1cIml0ZW1bY29sLmZpZWxkXVwiIFthbHRdPVwiY29sLmhlYWRlciB8fCAnaW1hZ2UnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90c2ktaW1hZ2UtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LXRleHQtZXllIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlUZXh0RXllQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuVEVYVF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG1vcmVBY3Rpb25zQmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgcGkgcGktZXllXCIgKGNsaWNrKT1cImV5ZUNsaWNrZWQoaXRlbVtjb2wuZmllbGRdKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJ1bmNhdGVTdHJpbmcoaXRlbVtjb2wuZmllbGRdLCA1MCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gbW9yZSBhY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21vcmVBY3Rpb25zQmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5maWVsZCA9PSBvdmVyZmxvd0NvbHVtbkZpZWxkOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8cC1tZW51IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgI21lbnVNb3JlQWN0aW9ucyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVsXT1cIm92ZXJmbG93QWN0aW9uc01lbnVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BvcHVwXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwib3ZlcmZsb3ctbWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwcHgnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW1lbnVJdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1tZW51aXRlbS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLnN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKGl0ZW0sIG1lbnVJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCA9PT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgbWVudUl0ZW0uaWNvbkNsYXNzIH19IHAtbWVudWl0ZW0taWNvbiBiYWRnZS1pY29uIGhhcy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLmljb25TdHlsZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhZGdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0ubm90ZXNDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWRnZURpc2FibGVkXT1cIml0ZW0ubm90ZXNDb3VudCA9PSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkZ2VQb3NpdGlvbj1cInRvcC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWVudUl0ZW0uaWQgIT09ICdub3RlcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7bWVudUl0ZW0uaWNvbkNsYXNzfX0gcC1tZW51aXRlbS1pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWVudUl0ZW0ubGFiZWwgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvcC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3tjb2wuYnV0dG9uSWNvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwie3tjb2wuc3R5bGVDbGFzc319IG92ZXJmbG93LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib3ZlcmZsb3dDb2x1bW5DbGlja2VkKG1lbnVNb3JlQWN0aW9ucywgJGV2ZW50LCBpdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtYnV0dG9uPiAgXHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRleHRPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiPjwvdGQ+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHNlbGVjdGVkQ29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJwci0wXCIgKm5nSWY9XCIhKGNvbC5pc0J1dHRvbiAmJiBjb2wuYWN0aW9uRGlzcGxheSA9PSBhY3Rpb25QbGFjZW1lbnQuT3ZlcmZsb3cpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5zaG93U3VtbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBDVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIElOVEVHRVJfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUkFURV9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5SQVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb24gPz8gZmFsc2VcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERFQ0lNQUxfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREVDSU1BTF9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lPdGhlckNvZGVcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gIFxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIFxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic3VtbWFyeVwiPlxyXG4gICAgICAgIHt7IHBhZ2UudG90YWxDb3VudCB9fSB7eyBcInJlY29yZHNfbGFiZWxcIiB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2xvcmZ1bFwiPlxyXG4gICAgICAgICAgPHNwYW4+VmlldyBHcmlkPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+fCBTZWFyY2hPbkluaXQgOiB7eyBzZWFyY2hPbkluaXQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj58IFBhZ2luYXRpb24gSW4gQXBpIDoge3sgaXNHcmlkRGF0YVBhZ2VkSW5BcGkgfX08L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FsZW5kZXJWaWV3ID09PSB0cnVlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDx0c2ktY2FsZW5kZXIgW3NjaGVtYV09XCJjYWxlbmRlclNjaGVtYVwiIFtldmVudHNEYXRhXT1cInBhZ2UuaXRlbXNcIiBbY3J1ZFNlcnZpY2VdPVwiY3J1ZFNlcnZpY2VcIlxyXG4gICAgICAoZGF0ZVJhbmdlQ2hhbmdlKT1cImhhbmRsZURhdGVSYW5nZUNoYW5nZSgkZXZlbnQpXCIgKGV2ZW50Q2xpY2spPVwiaGFuZGxlQ2FsZW5kYXJFdmVudENsaWNrKCRldmVudClcIj48L3RzaS1jYWxlbmRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FyZFZpZXcgPT09IHRydWVcIiBjbGFzcz1cImNvbC0xMlwiPlxyXG4gICAgPFRzaS1jYXJkLWxpc3QgW2NhcmRCdXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIiBbaWRdPVwiaWRcIiAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25Db2x1bW5DbGlja2VkLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIFtwYWdlJF09XCJwYWdlJFwiIFtwYWdlXT1cInBhZ2VcIiAoY2FsbFNlYXJjaCk9XCJjYWxsU2VhcmNoSGFuZGxlcigkZXZlbnQpXCI+XHJcbiAgICA8L1RzaS1jYXJkLWxpc3Q+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0thbmJhblZpZXcgPT09IHRydWUgJiYgIV9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0XCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2kta2FuYmFuIFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiIFtjcnVkU2VydmljZV09XCJjcnVkU2VydmljZVwiPlxyXG4gICAgPC9Uc2kta2FuYmFuPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiX3Nob3dLYW5iYW5WaWV3ID09PSB0cnVlICYmIF9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0XCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2kta2FuYmFuLXdvcmtmbG93LWV0YXQgW2NhcmRCdXNpbmVzc0NsYXNzXT1cImJ1c2luZXNzQ2xhc3NcIiBbaWRdPVwiaWRcIiAoYnV0dG9uQ2xpY2tlZCk9XCJidXR0b25Db2x1bW5DbGlja2VkLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIFtwYWdlJF09XCJwYWdlJFwiIFtwYWdlXT1cInBhZ2VcIiBbZGVzY3JpbWluYXRvclZhbHVlXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiIChjYWxsU2VhcmNoKT1cImNhbGxTZWFyY2hIYW5kbGVyKCRldmVudClcIj5cclxuICAgIDwvVHNpLWthbmJhbi13b3JrZmxvdy1ldGF0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNBZHZhbmNlZFNlYXJjaCAmJiBzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgIDxUc2ktTW9kYWwtRm9vdGVyIFtzaG93U2F2ZUFuZENsb3NlQnV0dG9uXT1cImZhbHNlXCIgKG9uU2F2ZUNsaWNrKT1cIm9uQ29uZmlybVNlbGVjdGlvbigpXCIgKG9uQ2FuY2VsQ2xpY2spPVwib25DYW5jZWxTZWxlY3Rpb24oKVwiIC8+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|
|
1900
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvb3V0cHV0LWNvbXBvbmVudHMvdHNpLWdlbmVyaWMtZ3JpZC90c2ktZ2VuZXJpYy1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy9vdXRwdXQtY29tcG9uZW50cy90c2ktZ2VuZXJpYy1ncmlkL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRixPQUFPLEVBQWlCLFNBQVMsRUFBdUIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEtBQUssU0FBUyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUF1RixNQUFNLGFBQWEsQ0FBQztBQUduSSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZMLE9BQU8sRUFBRSwrQkFBK0Is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QUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBY0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBRUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR08sYUFBYTtzQkFBekIsS0FBSztnQkFhRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBWUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFXRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBS08sY0FBYztzQkFBMUIsS0FBSztnQkFLTyw0QkFBNEI7c0JBQXhDLEtBQUs7Z0JBSUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFJRixTQUFTO3NCQURaLEtBQUs7Z0JBYUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFPSSxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRW52aXJvbm1lbnRJbmplY3RvciwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XHJcbmltcG9ydCB7IEZpbHRlck1hdGNoTW9kZSwgRmlsdGVyTWV0YWRhdGEsIE1lbnVJdGVtLCBNZW51SXRlbUNvbW1hbmRFdmVudCwgUHJpbWVOR0NvbmZpZywgU29ydE1ldGEsIFRhYmxlU3RhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBUYWJsZSwgVGFibGVIZWFkZXJDaGVja2JveCwgVGFibGVMYXp5TG9hZEV2ZW50LCBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50IH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U29jaWV0ZURldmlzZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy90c2ktY29uc3RzJztcclxuaW1wb3J0IHsgRGlzcGxheVR5cGVDb2xvcnMsIERpc3BsYXlUeXBlcywgRmlsdGVyT3BlcmF0b3JUeXBlLCBHcmlkU2VsZWN0aW9uTW9kZSwgR3JpZFNvcnRNb2RlLCBJbnB1dFR5cGVzLCBNb2RhbFNpemVFbnVtLCBOdW1lcmljRGlzcGxheVR5cGVzLCBUb29sdGlwUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IG9wZW5Uc2lQb3B1cFRleHRWaWV3ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9mdW5jdGlvbnMvbW9kYWwtb3Blbi5mdW5jdGlvbic7XHJcbmltcG9ydCB7IEJ1dHRvbkNsaWNrUmVzdWx0LCBEaWN0aW9uYXJ5LCBHcmlkQ29sdW1uLCBJRmlsdGVyZWRSZXF1ZXN0LCBJR3JpZENvbmZpZ3VyYXRpb24sIElQYWdlLCBJUGFnZWRSZXF1ZXN0LCBJUGFnZWRSZXNwb25zZSwgSVNvcnRCeVByb3ByZXR5LCBJU29ydE1ldGEgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRXZlbnRTY2hlbWEsIEZpY2hpZXIsIFByZXNlbnRhdGlvblNldHRpbmcsIFNlYXJjaEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRW50aXR5SW5mbyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9lbnRpdHktaW5mby9lbnRpdHktaW5mbyc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb24vYXBwLmxheW91dC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFzZS9jcnVkLWJhc2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZpY2hpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmljaGllci9maWNoaWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIdG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ2VuZXJhdG9yL2h0bWwtdGVtcGxhdGUtZ2VuZXJhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMYXlvdXRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbGF5b3V0L2xheW91dC1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi9lcnJvci1yZXNwb25zZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3NldHRpbmdzL2FwcC1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RhdHVzQ29sb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvc3RhdHVzL3N0YXR1cy1jb2xvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXhwb3J0RXhjZWxIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy9leHBvcnQtZXhjZWwuaGVscGVyJztcclxuaW1wb3J0IHsgRmlsdGVySGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZmlsdGVyLWhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQgeyBBY3Rpb25QbGFjZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnVtcy9hY3Rpb24tcGxhY2VtZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kcm9wZG93bi9kcm9wZG93bi1leHRlcm5hbC1zZWxlY3Rpb24tb3V0cHV0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnVHNpLUdlbmVyaWMtR3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RzaS1nZW5lcmljLWdyaWQuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzbGlkZUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnKicsXHJcbiAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7XHJcbiAgICAgICAgaGVpZ2h0OiAnMHB4JyxcclxuICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTIwcHgpJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2luIDw9PiBvdXQnLCBhbmltYXRlKCc2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKScpKVxyXG4gICAgXSlcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lHZW5lcmljR3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IG92ZXJmbG93Q29sdW1uRmllbGQgPSAnb3ZlcmZsb3ctY29sdW1uLWZpZWxkJztcclxuXHJcbiAgQElucHV0KCkgY3VkQ29tcG9uZW50OiBhbnk7XHJcbiAgQElucHV0KCkgbW9kYWxTaXplOiBhbnk7XHJcbiAgQElucHV0KCkgZW50aXR5SW5mbzogRW50aXR5SW5mbyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBmaWx0ZXJNYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGU7XHJcbiAgdG9vbHRpcFBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgYXN5bmMgZXllQ2xpY2tlZCh0ZXh0OiBhbnkpIHtcclxuXHJcbiAgICBsZXQgbW9kYWxTaXplID0gTW9kYWxTaXplRW51bS5FeHRyYUxhcmdlO1xyXG4gICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgIGRhdGE6IHRleHQsXHJcbiAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogbW9kYWxTaXplLndpZHRoLFxyXG4gICAgICBoZWlnaHQ6IG1vZGFsU2l6ZS5oZWlnaHRcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nUmVmID0gYXdhaXQgb3BlblRzaVBvcHVwVGV4dFZpZXdlckNvbXBvbmVudCh0aGlzLl9pbmplY3RvciwgY29uZik7XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nUmVmLm9uQ2xvc2Uuc3Vic2NyaWJlKCh2YWw/OiBhbnkpID0+IHRoaXMuX2Nsb3NlTW9kYWwodmFsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbG9zZU1vZGFsKHZhbD86IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9kaWFsb2dSZWY/LmRlc3Ryb3koKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZj8uZGVzdHJveSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0cnVuY2F0ZVN0cmluZyh2YWx1ZTogc3RyaW5nLCBsaW1pdDogbnVtYmVyID0gNTApOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGltaXQgPyB2YWx1ZS5zdWJzdHIoMCwgbGltaXQpICsgJy4uLicgOiB2YWx1ZTtcclxuICB9XHJcbiAgLy8jcmVnaW9uIGxvY2FsIHZhcnNcclxuICBAVmlld0NoaWxkKFwiZHRcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBkdDogVGFibGUgfCB1bmRlZmluZWQ7XHJcbiAgQFZpZXdDaGlsZChcInRhYmxlSGVhZGVyQ2hlY2tib3hcIikgdGFibGVIZWFkZXJDaGVja2JveDogVGFibGVIZWFkZXJDaGVja2JveCB8IHVuZGVmaW5lZFxyXG4gIGZpcnN0OiBudW1iZXIgPSAwO1xyXG4gIHJvd3MgPSAxO1xyXG4gIGRpc3BsYXlUeXBlcyA9IERpc3BsYXlUeXBlcztcclxuICBrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgc3VtbWFyaWVzOiBEaWN0aW9uYXJ5PHN0cmluZywgbnVtYmVyPiA9IHt9O1xyXG4gIGlzUnRsTW9kZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gIG1lc3NhZ2VQb3NpdGlvbiA9IHsgeDogMCwgeTogMCB9O1xyXG4gIHByaXZhdGUgZHJhZ0VudGVyQ291bnQgPSAwO1xyXG4gIC8vIHByaXZhdGUgX3NlYXJjaEJveEZpbHRlcnM6IEFycmF5PEZpbHRlckJ5UHJvcHJldHk+ID0gW107XHJcbiAgLy8gcHJpdmF0ZSBfZ3JpZEhlYWRlckZpbHRlcnM6IEFycmF5PEZpbHRlckJ5UHJvcHJldHk+ID0gW107XHJcbiAgcHJpdmF0ZSBfc2VhcmNoRmllbGRzOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc2VhcmNoQm94RmlsdGVyczogQXJyYXk8SUZpbHRlcmVkUmVxdWVzdD4gPSBbXTtcclxuICBwcml2YXRlIF9ncmlkSGVhZGVyRmlsdGVyczogQXJyYXk8SUZpbHRlcmVkUmVxdWVzdD4gPSBbXTtcclxuICBwcml2YXRlIF9zb3J0OiBBcnJheTxJU29ydEJ5UHJvcHJldHk+ID0gW107XHJcbiAgc29ydE1ldGFzOiBTb3J0TWV0YVtdID0gW107XHJcbiAgc2VsZWN0ZWRGdWxsSXRlbXM/OiBBcnJheTxhbnk+ID0gW107XHJcbiAgc2VsZWN0aW9uOiBhbnk7XHJcbiAgbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlO1xyXG4gIHByaXZhdGUgX2RpYWxvZ1JlZj86IER5bmFtaWNEaWFsb2dSZWY7XHJcbiAgLy9qc29uU3RyaW5nTGF5b3V0OiBzdHJpbmcgPSAne1wiZmlyc3RcIjowLFwicm93c1wiOjEwLFwibXVsdGlTb3J0TWV0YVwiOltdLFwiY29sdW1uV2lkdGhzXCI6XCJcIixcInRhYmxlV2lkdGhcIjpcIjExODhweFwiLFwiY29sdW1uT3JkZXJcIjpbXCJcIl19JztcclxuICBsYXRlc3RGaWx0ZXJzPzogSUZpbHRlcmVkUmVxdWVzdFtdO1xyXG4gIGlzQWR2YW5jZWRTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8gcHJpdmF0ZSBfcGFnZSA6IElQYWdlPGFueT4gPSB7XHJcbiAgLy8gICBpdGVtczogW10sXHJcbiAgLy8gICB0b3RhbENvdW50OiAwLFxyXG4gIC8vICAgc3VtbWFyaWVzOiBbXSxcclxuICAvLyAgIHRvdGFsUGFnZXM6IDAsXHJcbiAgLy8gICBwYWdlTnVtYmVyOiAxLFxyXG4gIC8vICAgcGFnZVNpemU6IDEwLFxyXG4gIC8vICAgbG9hZGluZzogZmFsc2VcclxuICAvLyB9O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KCkgZm9ybU5hbWU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaWQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGFnZWRSZXF1ZXN0PzogSVBhZ2VkUmVxdWVzdDtcclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uPzogSUdyaWRDb25maWd1cmF0aW9uO1xyXG5cclxuICBwcml2YXRlIF9wYWdlOiBJUGFnZTxhbnk+ID0ge1xyXG4gICAgaXRlbXM6IFtdLFxyXG4gICAgdG90YWxDb3VudDogMCxcclxuICAgIHN1bW1hcmllczogW10sXHJcbiAgICB0b3RhbFBhZ2VzOiAwLFxyXG4gICAgcGFnZU51bWJlcjogMSxcclxuICAgIHBhZ2VTaXplOiAxMCxcclxuICAgIGxvYWRpbmc6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgcGFnZSh2YWx1ZTogSVBhZ2U8YW55Pikge1xyXG4gICAgdGhpcy5fcGFnZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2UoKTogSVBhZ2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICB9XHJcbiAgLy8gKG5ld1BhZ2U6IElQYWdlPGFueT4pe1xyXG4gIC8vICAgaWYobmV3UGFnZSl7XHJcbiAgLy8gICAgIHRoaXMuX3BhZ2UgPSBuZXdQYWdlO1xyXG4gIC8vICAgICB0aGlzLl9leHRyYWN0U3VtbWFyaWVzKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIGdldCBwYWdlKCl7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5fcGFnZTtcclxuICAvLyB9XHJcbiAgQElucHV0KCkga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RlbXBDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHRlbXBTZWFyY2hGaWVsZHM6IEFycmF5PFNlYXJjaEZpZWxkPiA9IFtdO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgQElucHV0KCkgcHVibGljIHNldCBjb2x1bW5zKHZhbHVlOiBBcnJheTxHcmlkQ29sdW1uPiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5pbml0aWFsQ29sdW1uc1Byb2Nlc3MoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PEdyaWRDb2x1bW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNTZWFyY2hCdXR0b25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgQElucHV0KCkgcHVibGljIHNldCBpc1NlYXJjaEJ1dHRvbkRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkID0gdmFsdWVcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNTZWFyY2hCdXR0b25EaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1NlYXJjaEJ1dHRvbkRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGdyaWREYXRhPzogQXJyYXk8YW55PjtcclxuXHJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJveDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25Db2x1bW46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93SGVhZGVyRmlsdGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dGaWx0ZXJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2lzR3JpZERhdGFQYWdlZEluQXBpOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbkBJbnB1dCgpXHJcbnNldCBpc0dyaWREYXRhUGFnZWRJbkFwaSh2YWx1ZTogYm9vbGVhbikge1xyXG4gIHRoaXMuX2lzR3JpZERhdGFQYWdlZEluQXBpID0gdmFsdWU7XHJcbn1cclxuXHJcbmdldCBpc0dyaWREYXRhUGFnZWRJbkFwaSgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5faXNHcmlkRGF0YVBhZ2VkSW5BcGk7XHJcbn1cclxuICBASW5wdXQoKSBoZWFkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIFNob3dGaWx0ZXJDb2x1bW5zOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzaG93SW1wb3J0RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICBASW5wdXQoKSBzZXQgc2VhcmNoRmllbGRzKHZhbHVlOiBBcnJheTxTZWFyY2hGaWVsZD4gfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvL3Jlc2V0XHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IFtdO1xyXG5cclxuICAgICAgLy9pbml0IHVzaW5nIHZhbHVlXHJcbiAgICAgIHRoaXMuX3NlYXJjaEZpZWxkcyA9IEZpbHRlckhlbHBlci5pbml0U2VhcmNoRmllbGRzKHZhbHVlKTtcclxuICAgICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBzZWFyY2hGaWVsZHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoRmllbGRzO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IEdyaWRTb3J0TW9kZSB8IGFueSA9IEdyaWRTb3J0TW9kZS5NdWx0aXBsZTtcclxuICBASW5wdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBwcmVzZW50YXRpb25TZXR0aW5ncz86IFByZXNlbnRhdGlvblNldHRpbmdcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0S2V5T25seTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkgPSBHcmlkU2VsZWN0aW9uTW9kZS5Ob25lO1xyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogR3JpZFNlbGVjdGlvbk1vZGUgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZz8uZGF0YT8uaXNBZHZhbmNlZFNlYXJjaCAmJiB0aGlzLmNvbmZpZz8uZGF0YT8uc2VsZWN0aW9uTW9kZSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlID0gdGhpcy5jb25maWc/LmRhdGE/LnNlbGVjdGlvbk1vZGU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZSA9IHZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uTW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogQXJyYXk8YW55PiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNldCBzZWFyY2hPbkluaXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWFyY2hPbkluaXQgPSB2YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgc2VhcmNoT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U2VhcmNoT25Jbml0KClcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hPbkluaXRcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNob3dHbG9iYWxTZWFyY2g6IGJvb2xlYW4gPSB0cnVlXHJcbiAgQElucHV0KCkgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IHRydWVcclxuICBASW5wdXQoKSBzaG93U2VhcmNoRmllbGQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCBfc2hvd0NhbGVuZGVyVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNldCBzaG93Q2FsZW5kZXJWaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93Q2FsZW5kZXJWaWV3ID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fc2hvd0NhbGVuZGVyVmlldyA9PT0gZmFsc2UpIHtcclxuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbmQoeCA9PiB4LmZpZWxkID09PSB0aGlzLmNhbGVuZGVyU2NoZW1hPy5zdGFydClcclxuICAgICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XHJcbiAgICAgICAgc3RhcnQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBlbmQuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBjYWxlbmRlclNjaGVtYTogRXZlbnRTY2hlbWEgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBfc2hvd0NhcmRWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dDYXJkVmlldyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2hvd0NhcmRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX3Nob3dLYW5iYW5WaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93S2FuYmFuVmlldyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIF9zaG93S2FuYmFuVmlld09mV29ya0Zsb3dFdGF0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0IHNob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3Nob3dLYW5iYW5WaWV3T2ZXb3JrRmxvd0V0YXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGJ1c2luZXNzQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHBhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG5cclxuICBASW5wdXQoKSBjaGVja2VkQnlGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBfc2VsZWN0QWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNlbGVjdEFsbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2VsZWN0QWxsID0gdmFsdWU7XHJcblxyXG4gICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgRXZlbnQoJ3NlbGVjdEFsbENoYW5nZScpO1xyXG4gICAgY29uc3QgZXZlbnQ6IFRhYmxlU2VsZWN0QWxsQ2hhbmdlRXZlbnQgPSB7XHJcbiAgICAgIGNoZWNrZWQ6IHZhbHVlLFxyXG4gICAgICBvcmlnaW5hbEV2ZW50OiBzeW50aGV0aWNFdmVudCxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vblNlbGVjdEFsbENoYW5nZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSB0YXJnZXRCdXNpbmVzc0NsYXNzPzogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBkZXNjcmltaW5hdG9yVmFsdWU/OiBzdHJpbmdcclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3RBbGwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zZWxlY3RBbGw7IH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIGVkaXRSb3c6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVJvdzogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgbG9hZDogRXZlbnRFbWl0dGVyPHsgcmVxdWVzdDogSVBhZ2VkUmVxdWVzdCwgaXNGb3JDYWxlbmRhcjogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByZXF1ZXN0OiBJUGFnZWRSZXF1ZXN0LCBpc0ZvckNhbGVuZGFyOiBib29sZWFuIH0+KCk7XHJcbiAgQE91dHB1dCgpIGJ1dHRvbkNvbHVtbkNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxCdXR0b25DbGlja1Jlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrUmVzdWx0PigpO1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJzSHRtbFRlbXBsYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcbiAgQE91dHB1dCgpIHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PFNlYXJjaEZpZWxkPj4oKTtcclxuICBAT3V0cHV0KCkgY2FsZW5kYXJFdmVudENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdGF0dXNGaWx0ZXJDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIC8vIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAvLyAgIGlmKGNoYW5nZXNbJ3BhZ2UnXSl7XHJcbiAgLy8gICAgIHRoaXMuX2V4dHJhY3RTdW1tYXJpZXMoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgcHJvdGVjdGVkIGZpbHRlclRvb2x0aXAgPSBcInNob3dfZmlsdGVyXCI7XHJcblxyXG4gIGZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICBmaWx0ZXJNb2RlVG9vbHRpcCA9IFwibWVudV9tb2RlXCI7XHJcbiAgY2hhbmdlSGVhZGVyRmlsdGVyc01vZGU6IHN0cmluZyA9IFwibWVudVwiO1xyXG5cclxuICBpdGVtcz86IGFueVtdO1xyXG4gIF9zZWFyY2hPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBpbmxpbmVBY3Rpb25Db2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICBvdmVyZmxvd0FjdGlvbkNvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG4gIGhhc092ZXJmbG93QWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG92ZXJmbG93QWN0aW9uc01lbnU6IE1lbnVJdGVtW10gPSBbXTtcclxuICBjdXJyZW50QWN0aW9uUm93OiBhbnk7XHJcbiAgYWN0aW9uUGxhY2VtZW50ID0gQWN0aW9uUGxhY2VtZW50O1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3RlZENvbHVtbnM6IEdyaWRDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkQ29sdW1ucygpOiBHcmlkQ29sdW1uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRDb2x1bW5zKHZhbHVlOiBHcmlkQ29sdW1uW10pIHtcclxuICAgIGxldCBzYWZlVmFsdWUgPSB2YWx1ZVxyXG4gICAgICA/IFsuLi52YWx1ZS5maWx0ZXIoYyA9PiBjLmZpZWxkICE9IHRoaXMub3ZlcmZsb3dDb2x1bW5GaWVsZCldXHJcbiAgICAgIDogW107XHJcblxyXG4gICAgdGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zID0gc2FmZVZhbHVlLmZpbHRlcihcclxuICAgICAgYyA9PiBjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucyA9IHNhZmVWYWx1ZS5maWx0ZXIoXHJcbiAgICAgIGMgPT4gYy5pc0J1dHRvbiA9PT0gdHJ1ZSAmJiBjLmFjdGlvbkRpc3BsYXkgIT09IEFjdGlvblBsYWNlbWVudC5JbmxpbmVcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5oYXNPdmVyZmxvd0FjdGlvbnMgPSB0aGlzLm92ZXJmbG93QWN0aW9uQ29sdW1ucy5sZW5ndGggPiAxO1xyXG5cclxuICAgIGlmICh0aGlzLmhhc092ZXJmbG93QWN0aW9ucykge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBbXHJcbiAgICAgICAgLi4udGhpcy5pbmxpbmVBY3Rpb25Db2x1bW5zLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQsXHJcbiAgICAgICAgICBpc0Zyb3plbjogdHJ1ZSxcclxuICAgICAgICAgIGJ1dHRvbkljb246ICdwaSBwaS1lbGxpcHNpcy12JyxcclxuICAgICAgICAgIHN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi10ZXh0IGhvdmVyOnNoYWRvdy04JyxcclxuICAgICAgICAgIGhlYWRlcjogJ01vcmUgYWN0aW9ucycsXHJcbiAgICAgICAgICB0cmFuc2xhdGVkSGVhZGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnTW9yZSBhY3Rpb25zJyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi5zYWZlVmFsdWUuZmlsdGVyKGMgPT4gIShjLmlzQnV0dG9uID09PSB0cnVlICYmIGMuYWN0aW9uRGlzcGxheSA9PT0gQWN0aW9uUGxhY2VtZW50LklubGluZSkpXHJcbiAgICAgIF07XHJcblxyXG4gICAgICB0aGlzLm92ZXJmbG93QWN0aW9uc01lbnUgPSB0aGlzLmdldE92ZXJmbG93TWVudU1vZGVsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZENvbHVtbnMgPSBzYWZlVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9jZXNzU3RpY2t5Q29sdW1ucyh0aGlzLl9zZWxlY3RlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3ZlcmZsb3dNZW51TW9kZWwoKTogTWVudUl0ZW1bXSB7XHJcbiAgICBpZiAoIXRoaXMuaGFzT3ZlcmZsb3dBY3Rpb25zKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xyXG4gICAgICBpZDogY29sLmZpZWxkLFxyXG4gICAgICBsYWJlbDogY29sLmhlYWRlcixcclxuICAgICAgaWNvbkNsYXNzOiBjb2wuYnV0dG9uSWNvbixcclxuICAgICAgc3R5bGVDbGFzczogY29sLnN0eWxlQ2xhc3MsXHJcbiAgICAgIGljb25TdHlsZUNsYXNzOiBjb2wuaWNvblN0eWxlQ2xhc3MsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudTogTWVudSwgZXZlbnQ6IEV2ZW50LCByb3c6IGFueSkge1xyXG4gICAgdGhpcy5jdXJyZW50QWN0aW9uUm93ID0gcm93O1xyXG4gICAgbWVudS50b2dnbGUoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25PdmVyZmxvd0FjdGlvbkNsaWNrZWQocm93OiBhbnksIG1lbnVJdGVtOiBNZW51SXRlbSkge1xyXG4gICAgaWYgKCFyb3cgfHwgIW1lbnVJdGVtIHx8ICFtZW51SXRlbS5pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idXR0b25DbGlja2VkKHJvdywgbWVudUl0ZW0uaWQpXHJcbiAgfVxyXG5cclxuICBpbXBvcnRhbnRDb2x1bW5zID0gWydjb25zdWx0JywgJ2VkaXQnLCAnZGVsZXRlJywgJ3VwbG9hZCcsICdkb3dubG9hZCcsICdpbmZvJywgJ25vdGVzJywgJ2R1cGxpY2F0ZScsICdmb3JtJ107XHJcbiAgaXNGaXJzdExvYWRPZlBhZ2U6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FjaGUgPSBuZXcgTWFwPGFueSwgc3RyaW5nW10+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc3RhdHVzQ29sb3JTZXJ2aWNlOiBTdGF0dXNDb2xvclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgX2ZpY2hpZXJTZXJ2aWNlOiBGaWNoaWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2U6IEh0bWxUZW1wbGF0ZUdlbmVyYXRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NhbGl6ZTogTG9jYWxpemVQaXBlLFxyXG4gICAgcHJpdmF0ZSBsYXlvdXRIZWxwZXJTZXJ2aWNlOiBMYXlvdXRIZWxwZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByaW1lbmdDb25maWc6IFByaW1lTkdDb25maWcsXHJcbiAgICBwcml2YXRlIGFwcFNldHRpbmdzU2VydmljZTogQXBwU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlOiBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcclxuICAgIHB1YmxpYyBjb25maWc/OiBEeW5hbWljRGlhbG9nQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBfcmVmPzogRHluYW1pY0RpYWxvZ1JlZixcclxuXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWApXHJcbiAgICBpZiAoZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlICE9IHVuZGVmaW5lZCAmJiBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgIT0gbnVsbFxyXG4gICAgICAmJiBmaWx0ZXJNb2RlVG9vbHRpcEZyb21Mb2NhbFN0b3JhZ2UgIT0gXCJcIikge1xyXG4gICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gZmlsdGVyTW9kZVRvb2x0aXBGcm9tTG9jYWxTdG9yYWdlXHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSB0cnVlXHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyLXNsYXNoXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwiaGlkZV9maWx0ZXJcIjtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPT09IFwibWVudV9tb2RlXCIpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVJY29uID0gXCJwaSBwaS1jaGVja1wiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcInJvd19tb2RlXCI7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwibWVudVwiXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwicm93XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktZWxsaXBzaXMtdlwiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcIm1lbnVfbW9kZVwiO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93SGVhZGVyRmlsdGVycyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuZmlsdGVySWNvbiA9IFwicGkgcGktZmlsdGVyXCI7XHJcbiAgICAgIHRoaXMuZmlsdGVyVG9vbHRpcCA9IFwic2hvd19maWx0ZXJcIjtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICBsZXQgbGFuZ3VlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocnRsTW9kZUtleXMucnRsTW9kZUVuYWJsZWQpO1xyXG5cclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5pc0FyID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShjb2x1bW4uaGVhZGVyISEpKVxyXG5cclxuICAgIHRoaXMuX3RlbXBDb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xyXG5cclxuICAgIHRoaXMudGVtcFNlYXJjaEZpZWxkcyA9IHRoaXMuX3NlYXJjaEZpZWxkcyA/PyBbXTtcclxuXHJcbiAgICB0aGlzLmZpbHRlcmVkQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sdW1uID0+XHJcbiAgICAgICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoY29sdW1uLmZpZWxkKSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucyB8fCB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29sdW1uLm9yZGVyID0gaW5kZXg7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlzUnRsTW9kZUVuYWJsZWQoKVxyXG4gICAgdGhpcy51cGRhdGVQcmltZU5HVGFibGVGaWx0ZXJzKClcclxuICAgIHRoaXMuX3J0bE1vZGVTdWJzY3JpYmUoKVxyXG5cclxuICAgIHRoaXMuZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snZW50aXR5SW5mbyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5lbnRpdHlJbmZvKSB7XHJcblxyXG4gICAgICAvLyAgICBpZiAoY2hhbmdlc1snZW50aXR5SW5mbyddICYmIHRoaXMuZW50aXR5SW5mbykge1xyXG4gICAgICB0aGlzLmFwcGx5RW50aXR5SW5mbyh0aGlzLmVudGl0eUluZm8pO1xyXG4gICAgICB0aGlzLmxvYWRTdGF0dXNDb2xvcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1sndGFyZ2V0QnVzaW5lc3NDbGFzcyddICYmIHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLmxvYWRTdGF0dXNDb2xvcnNEZXRhaWxzQnlCdXNpbmVzc0NsYXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0dXNNZXRhZGF0YT86IFN0YXR1c01ldGFkYXRhUmVzcG9uc2U7XHJcbiAgc3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5PzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhPy5vcHRpb25zLmZpbmQobyA9PiBvLnN0YXR1c1ZhbHVlID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KHN0YXR1c1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeT8ub3B0aW9ucy5maW5kKG8gPT4gby50cmFuc2xhdGVkTGFiZWwgPT09IHN0YXR1c1ZhbHVlKTtcclxuICB9XHJcblxyXG4gIGxvYWRTdGF0dXNDb2xvcnNEZXRhaWxzQnlCdXNpbmVzc0NsYXNzKCkge1xyXG5cclxuICAgIGlmICh0aGlzLnRhcmdldEJ1c2luZXNzQ2xhc3MgIT0gdW5kZWZpbmVkICYmIHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX3N0YXR1c0NvbG9yU2VydmljZS5nZXRTdGF0dXNDb2xvckRldGFpbHNCeUJ1c2luZXNzQ2xhc3NOYW1lKHRoaXMudGFyZ2V0QnVzaW5lc3NDbGFzcylcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZXNwb25zZTogU3RhdHVzTWV0YWRhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c01ldGFkYXRhRm9yU3RhdHVzSGlzdG9yeSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnMnLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZFN0YXR1c0NvbG9ycygpOiB2b2lkIHtcclxuXHJcbiAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLmJ1c2luZXNzQ2xhc3MhO1xyXG4gICAgY29uc3Qgc3RhdHVzRW51bU5hbWUgPSB0aGlzLmVudGl0eUluZm8/LnN0YXR1c0VudW1OYW1lITtcclxuXHJcbiAgICBpZiAoIWNsYXNzTmFtZSB8fCAhc3RhdHVzRW51bU5hbWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdNaXNzaW5nIGNsYXNzTmFtZSBvciBzdGF0dXNFbnVtTmFtZSBmb3IgZW50aXR5SW5mby4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLl9zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzKGNsYXNzTmFtZSwgc3RhdHVzRW51bU5hbWUpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzcG9uc2U6IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXRhZGF0YSA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiBlcnIgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHN0YXR1cyBjb2xvcnMnLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgc3RhdHVzIGNvbG9yczonLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGlnaHRlbkNvbG9yKGhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBwZXJjZW50OiBudW1iZXIgPSA3MCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICcnO1xyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG5cclxuICAgIGxldCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgbGV0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBsZXQgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHIgKyAoMjU1IC0gcikgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgKyAoMjU1IC0gZykgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGIgKyAoMjU1IC0gYikgKiBwZXJjZW50IC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgbmV3SGV4ID1cclxuICAgICAgJyMnICtcclxuICAgICAgW3IsIGcsIGJdXHJcbiAgICAgICAgLm1hcCh4ID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpXHJcbiAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdIZXg7XHJcbiAgfVxyXG5cclxuICBnZXRSZWFkYWJsZVRleHRDb2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICdibGFjayc7XHJcblxyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAyMzAgPyAnYmxhY2snIDogYCMke2hleH1gO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUVudGl0eUluZm8oZW50aXR5SW5mbzogRW50aXR5SW5mbykge1xyXG4gICAgaWYgKCFlbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3RhdHVzQ29sdW1uTmFtZSA9IGVudGl0eUluZm8uc3RhdHVzQ29sdW1uTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGNvbnN0IHN0YXR1c0NvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKFxyXG4gICAgICBjID0+IGMuZmllbGQudG9Mb3dlckNhc2UoKSA9PT0gc3RhdHVzQ29sdW1uTmFtZVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXN0YXR1c0NvbHVtbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oYFN0YXR1cyBjb2x1bW4gXCIke2VudGl0eUluZm8uc3RhdHVzQ29sdW1uTmFtZX1cIiBub3QgZm91bmQuYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0dXNDb2x1bW4uaXNTdGF0dXNDb2x1bW4gPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbkNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5pc0J1dHRvbik7XHJcbiAgICBjb25zdCBvdGhlckNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNCdXR0b24gJiYgYyAhPT0gc3RhdHVzQ29sdW1uKTtcclxuXHJcbiAgICBjb25zdCBtYXhCdXR0b25PcmRlciA9XHJcbiAgICAgIGJ1dHRvbkNvbHVtbnMucmVkdWNlKChtLCBjKSA9PiBNYXRoLm1heChtLCBjLm9yZGVyID8/IDApLCAwKSB8fCAwO1xyXG5cclxuICAgIHN0YXR1c0NvbHVtbi5vcmRlciA9IG1heEJ1dHRvbk9yZGVyICsgMTtcclxuXHJcbiAgICBjb25zdCByZW9yZGVyZWQgPSBbXHJcbiAgICAgIC4uLmJ1dHRvbkNvbHVtbnMuc29ydCgoYSwgYikgPT4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKSksXHJcbiAgICAgIHN0YXR1c0NvbHVtbixcclxuICAgICAgLi4ub3RoZXJDb2x1bW5zLnNvcnQoKGEsIGIpID0+IChhLm9yZGVyID8/IDApIC0gKGIub3JkZXIgPz8gMCkpLFxyXG4gICAgXTtcclxuXHJcbiAgICByZW9yZGVyZWQuZm9yRWFjaCgoY29sLCBpbmRleCkgPT4gKGNvbC5vcmRlciA9IGluZGV4KSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBbLi4ucmVvcmRlcmVkXTtcclxuICB9XHJcblxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc3RvcmVTdGF0ZShjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IEpTT04ucGFyc2UoY29uZmlndXJhdGlvbilcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcblxyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZENvbHVtbnNDaGFuZ2UobmV3VmFsdWU6IEdyaWRDb2x1bW5bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBuZXdWYWx1ZTtcclxuICAgIHRoaXMuc29ydENvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIHNvcnRDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgaXNJbXBvcnRhbnQgPSAoYzogR3JpZENvbHVtbikgPT5cclxuICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluY2x1ZGVzKGMuZmllbGQpO1xyXG5cclxuICAgIGNvbnN0IHNvcnRXaXRoUHJpb3JpdHkgPSAoYTogR3JpZENvbHVtbiwgYjogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICBjb25zdCBhSW1wID0gaXNJbXBvcnRhbnQoYSk7XHJcbiAgICAgIGNvbnN0IGJJbXAgPSBpc0ltcG9ydGFudChiKTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmICFiSW1wKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUltcCAmJiBiSW1wKSByZXR1cm4gMTtcclxuXHJcbiAgICAgIGlmIChhSW1wICYmIGJJbXApIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYS5maWVsZCkgLVxyXG4gICAgICAgICAgdGhpcy5pbXBvcnRhbnRDb2x1bW5zLmluZGV4T2YoYi5maWVsZClcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gKGEub3JkZXIgPz8gMCkgLSAoYi5vcmRlciA/PyAwKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgYnV0dG9uQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbHRlcihjID0+IGMuaXNCdXR0b24pO1xyXG4gICAgY29uc3Qgb3RoZXJDb2x1bW5zID0gdGhpcy5zZWxlY3RlZENvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNCdXR0b24pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gW1xyXG4gICAgICAuLi5idXR0b25Db2x1bW5zLnNvcnQoc29ydFdpdGhQcmlvcml0eSksXHJcbiAgICAgIC4uLm90aGVyQ29sdW1ucyxcclxuICAgIF07XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcjogc3RyaW5nW10pOiBhbnlbXSB7XHJcblxyXG4gICAgY29uc3QgaW1wb3J0YW50ID0gdGhpcy5pbXBvcnRhbnRDb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGNvbHVtbk9yZGVyLmluY2x1ZGVzKGtleSkpXHJcbiAgICAgIC5tYXAoa2V5ID0+IHRoaXMuZmluZENvbHVtbkJ5S2V5KGtleSkpXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XHJcblxyXG4gICAgY29uc3Qgb3RoZXJzID0gY29sdW1uT3JkZXJcclxuICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuaW1wb3J0YW50Q29sdW1ucy5pbmNsdWRlcyhrZXkpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpKVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xyXG5cclxuICAgIHJldHVybiBbLi4uaW1wb3J0YW50LCAuLi5vdGhlcnNdO1xyXG4gIH1cclxuXHJcbiAgZmluZENvbHVtbkJ5S2V5KGtleTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5fdGVtcENvbHVtbnMpIHtcclxuICAgICAgZm9yIChsZXQgY29sIG9mIHRoaXMuX3RlbXBDb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLl90ZW1wQ29sdW1ucztcclxuICAgICAgICB0aGlzLnNvcnRDb2x1bW5zKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm90SW5TcGVjaWZpZWRDb2x1bW4oZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmltcG9ydGFudENvbHVtbnMuaW5jbHVkZXMoZmllbGQpXHJcbiAgICAgICYmIGZpZWxkICE9PSB0aGlzLm92ZXJmbG93Q29sdW1uRmllbGQ7XHJcbiAgfVxyXG5cclxuICBpc092ZXJmbG93Q29sdW1uKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmaWVsZCA9PT0gdGhpcy5vdmVyZmxvd0NvbHVtbkZpZWxkO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1N0aWNreUNvbHVtbnMoY29sdW1uczogR3JpZENvbHVtbltdKSB7XHJcbiAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2w6IEdyaWRDb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGNvbC5pc0Zyb3plbikge1xyXG4gICAgICAgIGNvbC5uZ1N0eWxlID0gdGhpcy5nZXRUaGVTdHlsZShjb2wsIGluZGV4KVxyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgY29sLmhlYWRlckNvbHVtblN0eWxlID0geyAuLi5jb2wubmdTdHlsZSwgekluZGV4OiAxMDAwIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldENoZWNrYm94U3R5bGUoKSB7XHJcbiAgICBpZiAodGhpcy5pc1J0bE1vZGUpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICByaWdodDogYDBweGAsXHJcbiAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgbGVmdDogYDBweGAsXHJcbiAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxyXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcclxuICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgXCJtaW4td2lkdGhcIjogJzIuNXJlbSAhaW1wb3J0YW50JyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRoZVN0eWxlKGNvbHVtbjogR3JpZENvbHVtbiwgY29sdW1uT3JkZXI6IG51bWJlcik6IGFueSB7XHJcblxyXG4gICAgY29uc3QgU1RBUlQgPSA5O1xyXG4gICAgY29uc3QgRklSU1RfR0FQID0gMzc7XHJcbiAgICBjb25zdCBHQVAgPSA0NjtcclxuXHJcbiAgICBpZiAoIWNvbHVtbi5pc0Zyb3plbikge1xyXG4gICAgICByZXR1cm4ge31cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sdW1uLmlzRnJvemVuID09IHRydWUpIHtcclxuXHJcbiAgICAgIGxldCBlbGVtZW50UG9zaXRpb24gPSAwO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSB0aGlzLm11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGUpIHtcclxuICAgICAgICBlbGVtZW50UG9zaXRpb24gPSAzMCArIGVsZW1lbnRQb3NpdGlvbiArIChjb2x1bW5PcmRlciA/PyAwKSAqIDYwO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChjb2x1bW5PcmRlciA9PT0gMCkge1xyXG4gICAgICAgICAgZWxlbWVudFBvc2l0aW9uID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sdW1uT3JkZXIgPT09IDEpIHtcclxuICAgICAgICAgIGVsZW1lbnRQb3NpdGlvbiA9IFNUQVJUICsgRklSU1RfR0FQO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50UG9zaXRpb24gPSBTVEFSVCArIEZJUlNUX0dBUCArIChjb2x1bW5PcmRlciAtIDEpICogR0FQO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5pc1J0bE1vZGUpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgcmlnaHQ6IGAke2VsZW1lbnRQb3NpdGlvbn1weGAsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgICBcIm1pbi13aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxlZnQ6IGAke2VsZW1lbnRQb3NpdGlvbn1weGAsXHJcbiAgICAgICAgICBwb3NpdGlvbjogJ3N0aWNreScsXHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZScsXHJcbiAgICAgICAgICBcIndpZHRoXCI6ICcyLjVyZW0gIWltcG9ydGFudCcsXHJcbiAgICAgICAgICBcIm1pbi13aWR0aFwiOiAnMi41cmVtICFpbXBvcnRhbnQnLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNSdGxNb2RlRW5hYmxlZCgpIHtcclxuICAgIGlmICh0aGlzLl9sYXlvdXRTZXJ2aWNlLmlzUnRsTW9kZUVuYWJsZWQoKSkge1xyXG4gICAgICB0aGlzLmlzUnRsTW9kZSA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUHJpbWVOR1RhYmxlRmlsdGVycygpIHtcclxuICAgIHRoaXMuX3ByaW1lbmdDb25maWcuc2V0VHJhbnNsYXRpb24oe1xyXG4gICAgICBzdGFydHNXaXRoOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3N0YXJ0c1dpdGgnKSxcclxuICAgICAgY29udGFpbnM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY29udGFpbnMnKSxcclxuICAgICAgbm90Q29udGFpbnM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbm90Q29udGFpbnMnKSxcclxuICAgICAgZW5kc1dpdGg6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZW5kc1dpdGgnKSxcclxuICAgICAgZXF1YWxzOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VxdWFscycpLFxyXG4gICAgICBub3RFcXVhbHM6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbm90RXF1YWxzJyksXHJcbiAgICAgIG5vRmlsdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX25vRmlsdGVyJyksXHJcbiAgICAgIGx0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2x0JyksXHJcbiAgICAgIGx0ZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19sdGUnKSxcclxuICAgICAgZ3Q6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZ3QnKSxcclxuICAgICAgZ3RlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2d0ZScpLFxyXG4gICAgICBpczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19pcycpLFxyXG4gICAgICBpc05vdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19pc05vdCcpLFxyXG4gICAgICBiZWZvcmU6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfYmVmb3JlJyksXHJcbiAgICAgIGFmdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2FmdGVyJyksXHJcbiAgICAgIGRhdGVJczogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlSXMnKSxcclxuICAgICAgZGF0ZUlzTm90OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVJc05vdCcpLFxyXG4gICAgICBkYXRlQmVmb3JlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVCZWZvcmUnKSxcclxuICAgICAgZGF0ZUFmdGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2RhdGVBZnRlcicpLFxyXG4gICAgICBjbGVhcjogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19jbGVhcicpLFxyXG4gICAgICBhcHBseTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hcHBseScpLFxyXG4gICAgICBtYXRjaEFsbDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19tYXRjaEFsbCcpLFxyXG4gICAgICBtYXRjaEFueTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19tYXRjaEFueScpLFxyXG4gICAgICBhZGRSdWxlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2FkZFJ1bGUnKSxcclxuICAgICAgcmVtb3ZlUnVsZTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19yZW1vdmVSdWxlJyksXHJcbiAgICAgIGFjY2VwdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19hY2NlcHQnKSxcclxuICAgICAgcmVqZWN0OiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3JlamVjdCcpLFxyXG4gICAgICBjaG9vc2U6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfY2hvb3NlJyksXHJcbiAgICAgIHVwbG9hZDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc191cGxvYWQnKSxcclxuICAgICAgY2FuY2VsOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2NhbmNlbCcpLFxyXG4gICAgICB0b2RheTogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc190b2RheScpLFxyXG4gICAgICB3ZWVrSGVhZGVyOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX3dlZWtIZWFkZXInKSxcclxuICAgICAgZGF0ZUZvcm1hdDogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19kYXRlRm9ybWF0JyksXHJcbiAgICAgIHdlYWs6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfd2VhaycpLFxyXG4gICAgICBtZWRpdW06IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfbWVkaXVtJyksXHJcbiAgICAgIHN0cm9uZzogdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oJ3NoYXJlZF90c2lfZmlsdGVyc19zdHJvbmcnKSxcclxuICAgICAgcGFzc3dvcmRQcm9tcHQ6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfcGFzc3dvcmRQcm9tcHQnKSxcclxuICAgICAgZW1wdHlNZXNzYWdlOiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybSgnc2hhcmVkX3RzaV9maWx0ZXJzX2VtcHR5TWVzc2FnZScpLFxyXG4gICAgICBlbXB0eUZpbHRlck1lc3NhZ2U6IHRoaXMubG9jYWxpemUudHJhbnNmb3JtKCdzaGFyZWRfdHNpX2ZpbHRlcnNfZW1wdHlGaWx0ZXJNZXNzYWdlJyksXHJcbiAgICAgIGZpcnN0RGF5T2ZXZWVrOiAxLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ydGxNb2RlU3Vic2NyaWJlKCkge1xyXG4gICAgdGhpcy5fbGF5b3V0U2VydmljZS5lbmFibGVSdGxNb2RlU3ViamVjdCQuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhID09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMuaXNSdGxNb2RlID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlcyhzZWFyY2hGaWVsZFZhbHVlczogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkc1ZhbHVlQ2hhbmdlZC5lbWl0KHNlYXJjaEZpZWxkVmFsdWVzKVxyXG4gIH1cclxuXHJcbiAgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gKHRoaXMucGFnZS50b3RhbENvdW50IC0gdGhpcy5wYWdlLnBhZ2VTaXplKSA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2UgPyB0aGlzLnBhZ2UucGFnZU51bWJlciA9PT0gMCA6IHRydWU7XHJcbiAgfVxyXG5cclxuICBlZGl0KGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5lZGl0Um93LmVtaXQoaXRlbVt0aGlzLmtleV0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlKGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5kZWxldGVSb3cuZW1pdChpdGVtW3RoaXMua2V5XSk7XHJcbiAgfVxyXG5cclxuICBsYXp5TG9hZChldmVudDogVGFibGVMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5wYWdlZFJlcXVlc3QgPT0gbnVsbCAmJiB0aGlzLnBhZ2VkUmVxdWVzdCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5wYWdlZFJlcXVlc3QgPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNraXBDb3VudCA9IGV2ZW50LmZpcnN0ID09IDEgPyAwIDogZXZlbnQuZmlyc3Q7XHJcbiAgICB0aGlzLnBhZ2VkUmVxdWVzdC5tYXhSZXN1bHRDb3VudCA9IGV2ZW50LnJvd3M7XHJcbiAgICBpZiAodGhpcy5mb3JtTmFtZSAmJiB0aGlzLmlzRmlyc3RMb2FkT2ZQYWdlKSB7XHJcbiAgICAgIHRoaXMuaXNGaXJzdExvYWRPZlBhZ2UgPSBmYWxzZVxyXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG4gICAgICBpZiAoc3RvcmVkVmFsdWUpIHtcclxuICAgICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyO1xyXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5XaWR0aHMuc3BsaXQoJywnKTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZFNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgICAgICAgY29sdW1uT3JkZXIuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvbHVtbldpZHRoc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCk7XHJcbiAgICAgICAgICBpZiAoZXhpc3RpbmdDb2x1bW5JbmRleCAhPT0gLTEpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zW2V4aXN0aW5nQ29sdW1uSW5kZXhdLndpZHRoID0gY29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3RlZENvbHVtbnMucHVzaCh0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdXBkYXRlZFNlbGVjdGVkQ29sdW1ucztcclxuXHJcbiAgICAgICAgaWYgKChzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhICYmIHNlc3Npb25EYXRhLm11bHRpU29ydE1ldGEubGVuZ3RoID4gMCkgfHwgKHNlc3Npb25EYXRhLmZpbHRlcnMpKSB7XHJcbiAgICAgICAgICBpZiAoc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YSAmJiBzZXNzaW9uRGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2Vzc2lvbkRhdGEubXVsdGlTb3J0TWV0YS5mb3JFYWNoKChtZXRhOiB7IGZpZWxkOiBhbnk7IG9yZGVyOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgICBsZXQgc29ydE1ldGE6IFNvcnRNZXRhID0ge1xyXG4gICAgICAgICAgICAgICAgZmllbGQ6IG1ldGEuZmllbGQsXHJcbiAgICAgICAgICAgICAgICBvcmRlcjogbWV0YS5vcmRlclxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBldmVudC5zb3J0RmllbGQgPSBtZXRhLmZpZWxkO1xyXG4gICAgICAgICAgICAgIGV2ZW50LnNvcnRPcmRlciA9IG1ldGEub3JkZXI7XHJcbiAgICAgICAgICAgICAgZXZlbnQubXVsdGlTb3J0TWV0YT8ucHVzaChzb3J0TWV0YSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHNlc3Npb25EYXRhLmZpbHRlcnMpIHtcclxuICAgICAgICAgICAgbGV0IGZpbHRlcnM6IHsgW3M6IHN0cmluZ106IEZpbHRlck1ldGFkYXRhIH0gPSB7fTtcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoc2Vzc2lvbkRhdGEuZmlsdGVycykuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmlsdGVyTWV0YWRhdGFdKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyTWV0YWRhdGFWYWx1ZSA9IGZpbHRlck1ldGFkYXRhIGFzIFtGaWx0ZXJNZXRhZGF0YV07XHJcblxyXG4gICAgICAgICAgICAgIGlmIChmaWx0ZXJNZXRhZGF0YVZhbHVlWzBdICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJzW2ZpZWxkTmFtZV0gPSBmaWx0ZXJNZXRhZGF0YVZhbHVlWzBdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBc3NpZ24gdGhlIGZpbHRlcnMgdG8gdGhlIGV2ZW50XHJcbiAgICAgICAgICAgIGV2ZW50LmZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgICAgICAgICAvLyBldmVudC5maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoc2Vzc2lvbkRhdGEuZmlsdGVycykucmVkdWNlKChmaWx0ZXJzOiB7IFtzOiBzdHJpbmddOiBGaWx0ZXJNZXRhZGF0YSB9LCBbZmllbGROYW1lLCBmaWx0ZXJNZXRhZGF0YSBdICkgPT4ge1xyXG4gICAgICAgICAgICAvLyAgIHZhciBmaWx0ZXJNZXRhZGF0YVZhbHVlID0gZmlsdGVyTWV0YWRhdGEgYXMgRmlsdGVyTWV0YWRhdGE7XHJcbiAgICAgICAgICAgIC8vICAgaWYgKGZpbHRlck1ldGFkYXRhVmFsdWUudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vICAgICBmaWx0ZXJzW2ZpZWxkTmFtZV0gPSBmaWx0ZXJNZXRhZGF0YSBhcyBGaWx0ZXJNZXRhZGF0YTtcclxuICAgICAgICAgICAgLy8gICB9XHJcblxyXG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCdhbGwgZmlsdGVycycsIGZpbHRlcnMpXHJcbiAgICAgICAgICAgIC8vICAgcmV0dXJuIGZpbHRlcnM7XHJcbiAgICAgICAgICAgIC8vIH0sIHt9KTtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgICAgICAgICAvLyBjb25zdCBmaWx0ZXJzQXJyYXk6IFtzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB8IG51bGw7IG1hdGNoTW9kZTogc3RyaW5nLG9wZXJhdG9yIDogc3RyaW5nIH1bXV1bXSA9IE9iamVjdC5lbnRyaWVzKGRhdGEuZmlsdGVycyk7XHJcblxyXG4gICAgICAgICAgICAvLyBmaWx0ZXJzQXJyYXkuZm9yRWFjaCgoW2ZpZWxkTmFtZSwgZmllbGRWYWx1ZV0pID0+IHtcclxuXHJcbiAgICAgICAgICAgIC8vICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgICAgICAgICAvLyAgICAge1xyXG5cclxuICAgICAgICAgICAgLy8gICAgIGlmKGZpbHRlci52YWx1ZSl7XHJcbiAgICAgICAgICAgIC8vICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgZmllbGQgOmZpZWxkTmFtZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICBsYWJlbFZhbHVlIDogZmlsdGVyLnZhbHVlLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgICAgICAgICAgLy8gICAgICAgICB0eXBlIDogdGhpcy5pbmZlcklucHV0VHlwZShmaWVsZE5hbWUpLFxyXG4gICAgICAgICAgICAvLyAgICAgICAgIG9wZXJhdG9yIDogdGhpcy5nZXRPcGVyYXRvck51bWJlcihmaWx0ZXIubWF0Y2hNb2RlKVxyXG4gICAgICAgICAgICAvLyAgICAgICB9O1xyXG4gICAgICAgICAgICAvLyAgICAgICBjb25zb2xlLmxvZygnc2VhcmNoRmllbGQnLHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgICAgICAgICAgLy8gICAgICAgfVxyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgICAgICAvLyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJObyBzZXNzaW9uIGRhdGEgZm91bmQgaW4gbG9jYWxTdG9yYWdlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9ncmlkSGVhZGVyRmlsdGVycyA9IHRoaXMuX2V4dHJhY3RGaWx0ZXJzKGV2ZW50LmZpbHRlcnMpO1xyXG4gICAgdGhpcy5fZXh0cmFjdFNvcnRDcml0ZXJpYXMoZXZlbnQpO1xyXG4gICAgdGhpcy5zZWFyY2goKTtcclxuICB9XHJcblxyXG4gIGZpZWxkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsICYmIHRoaXMuY29sdW1ucyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGZpZWxkcy5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpZWxkcztcclxuICB9XHJcblxyXG5cclxuICBidXR0b25DbGlja2VkKGl0ZW06IGFueSwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgdGhpcy5idXR0b25Db2x1bW5DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbVt0aGlzLmtleV0sIHNlbGVjdEtleU9ubHk6IHRoaXMuc2VsZWN0S2V5T25seSB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCh7IGZpZWxkOiBmaWVsZCwga2V5OiBpdGVtLCBzZWxlY3RLZXlPbmx5OiB0aGlzLnNlbGVjdEtleU9ubHkgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBrZXl3b3JkVmFsdWVDaGFuZ2VkKGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5rZXl3b3JkID0ga2V5d29yZFxyXG4gIH1cclxuXHJcbiAgaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW52YWxpZFNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzXHJcbiAgICAgID8uZmlsdGVyKHggPT4geC5yZXF1aXJlZCA9PSB0cnVlICYmICh4LnZhbHVlID09IHVuZGVmaW5lZCB8fCB4LnZhbHVlID09ICcnIHx8IHgudmFsdWUgPT0gbnVsbCkpXHJcblxyXG4gICAgaWYgKGludmFsaWRTZWFyY2hGaWVsZHMgPT0gdW5kZWZpbmVkIHx8IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWVzc2FnZXM6IHN0cmluZ1tdID0gW11cclxuICAgIGludmFsaWRTZWFyY2hGaWVsZHMuZm9yRWFjaChzZWFyY2hGaWVsZCA9PiB7XHJcbiAgICAgIG1lc3NhZ2VzLnB1c2goYDxiPiR7dGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oc2VhcmNoRmllbGQubGFiZWxWYWx1ZSl9PC9iPiAke3RoaXMubG9jYWxpemUudHJhbnNmb3JtKFwic2hhcmVkX3NlYXJjaF9maWVsZF9yZXF1aXJlZFwiKX1gKTtcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2VzRnJvbUFycmF5U3RyaW5nKG1lc3NhZ2VzKTtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgaW5pdFNlYXJjaE9uSW5pdCgpIHtcclxuICAgIGxldCBpbnZhbGlkU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHNcclxuICAgICAgPy5maWx0ZXIoeCA9PiB4LnJlcXVpcmVkID09IHRydWUgJiYgKHgudmFsdWUgPT0gdW5kZWZpbmVkIHx8IHgudmFsdWUgPT0gJycgfHwgeC52YWx1ZSA9PSBudWxsKSkgPz8gW11cclxuXHJcbiAgICBpZiAodGhpcy5fc2VhcmNoT25Jbml0KSB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaE9uSW5pdCA9IGludmFsaWRTZWFyY2hGaWVsZHMubGVuZ3RoID09IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbWJvQm94TGFiZWxDaGFuZ2VkKGV2ZW50PzogQXJyYXk8U2VhcmNoRmllbGQ+KSB7XHJcbiAgICB0aGlzLl9leHRyYWN0U2VhcmNoQm94RmlsdGVycygpO1xyXG4gICAgdGhpcy5fZ2VuZXJhdGVGaWx0ZXJzSHRtbFRlbXBsYXRlKCk7XHJcbiAgfVxyXG5cclxuICBzZWFyY2goZXZ0OiBhbnkgPSBudWxsKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcInNlYXJjaD4+PlwiLCB0aGlzLnNlYXJjaEZpZWxkcylcclxuICAgIC8vIHNldCBnbG9iYWwgZmlsdGVyIHZhbHVlXHJcblxyXG4gICAgdGhpcy5fZXh0cmFjdE9ubHlWaXNpYmxlU2VhcmNoRmllbGRzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZWRSZXF1ZXN0ICYmIHRoaXMuaXNBbGxSZXF1aXJlZFNlYXJjaEZpZWxkc0hhdmVWYWx1ZXMoKSkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5zdW1tYXJpZXMgPSB0aGlzLl9leHRyYWN0SGF2ZVN1bW1hcnlQcm9wZXJ0aWVzKCk7XHJcbiAgICAgIHRoaXMucGFnZWRSZXF1ZXN0LnNvcnRpbmcgPSB0aGlzLl9zb3J0O1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5rZXl3b3JkID0gdGhpcy5rZXl3b3JkO1xyXG5cclxuICAgICAgLy9hZGQgc2VhcmNoIGJveCBmaWx0ZXJzXHJcbiAgICAgIHRoaXMuX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk7XHJcblxyXG4gICAgICAvL2dlbmVyYXRlIGZpbHRlcnMgaHRtbCB0ZW1wbGF0ZVxyXG4gICAgICB0aGlzLl9nZW5lcmF0ZUZpbHRlcnNIdG1sVGVtcGxhdGUoKTtcclxuICAgICAgLy9jbG9uZVxyXG5cclxuICAgICAgbGV0IG5ld1JlcXVlc3Q6IElQYWdlZFJlcXVlc3QgPSB0aGlzLl9jbG9uZVBhZ2VkUmVxdWVzdCh0aGlzLnBhZ2VkUmVxdWVzdCk7XHJcblxyXG4gICAgICAvL2NvbmNhdCBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QuZmlsdGVycyA9IFsuLi50aGlzLl9ncmlkSGVhZGVyRmlsdGVycywgLi4udGhpcy5fc2VhcmNoQm94RmlsdGVyc107XHJcblxyXG4gICAgICAvL2V4Y2x1ZGUgdXNlbGVzcyBmaWx0ZXJzXHJcbiAgICAgIG5ld1JlcXVlc3QgPSB0aGlzLl9leGNsdWRlVXNlbGVzc0ZpbHRlcnMobmV3UmVxdWVzdCk7XHJcblxyXG4gICAgICAvLyB0ZXN0IGlmIGZpbHRlcnMgdmFsdWUgaGFzIGNoYW5nZWRcclxuICAgICAgaWYgKCh0aGlzLmxhdGVzdEZpbHRlcnMgPyBKU09OLnN0cmluZ2lmeSh0aGlzLmxhdGVzdEZpbHRlcnMpIDogbnVsbClcclxuICAgICAgICAhPT0gKG5ld1JlcXVlc3QuZmlsdGVycyA/IEpTT04uc3RyaW5naWZ5KG5ld1JlcXVlc3QuZmlsdGVycykgOiBudWxsKSkge1xyXG4gICAgICAgIG5ld1JlcXVlc3Quc2tpcENvdW50ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgICAgIHRoaXMuZHQuZmlyc3QgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2F2ZSBsYXRlc3QgZmlsdGVyc1xyXG4gICAgICB0aGlzLmxhdGVzdEZpbHRlcnMgPSBuZXdSZXF1ZXN0LmZpbHRlcnM7XHJcblxyXG4gICAgICB0aGlzLmxvYWQuZW1pdCh7IHJlcXVlc3Q6IG5ld1JlcXVlc3QsIGlzRm9yQ2FsZW5kYXI6IHRoaXMuX3Nob3dDYWxlbmRlclZpZXcgfSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rmlyc3RFbGVtZW50SW5kZXgoKTogbnVtYmVyIHtcclxuICAgIGlmICghdGhpcy5kdCkgcmV0dXJuIDA7XHJcblxyXG4gICAgaWYgKHRoaXMucGFnZS5pdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZHQuZmlyc3QgPT09IDAgPyAxIDogKHRoaXMuZHQ/LmZpcnN0ID8/IDApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShmaWVsZDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBzdW1tYXJ5Um93ID0gdGhpcy5wYWdlLnN1bW1hcmllc1xyXG4gICAgICAuZmluZChzID0+IHMucHJvcHJldHkudG9VcHBlckNhc2UoKSA9PSBmaWVsZC50b1VwcGVyQ2FzZSgpKTtcclxuICAgIGlmIChzdW1tYXJ5Um93KSB7XHJcbiAgICAgIHJldHVybiBzdW1tYXJ5Um93LnN1bW1hcnk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpIHtcclxuICAgIGxldCBzZWxlY3Rpb246IGFueVtdID0gW107XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKCh2OiBhbnkpID0+IHsga2V5cy5wdXNoKHZbdGhpcy5rZXldKSB9KTtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IGtleXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbiA/IFt0aGlzLnNlbGVjdGlvblt0aGlzLmtleV1dIDogW107XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24gPyBbdGhpcy5zZWxlY3Rpb25dIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChzZWxlY3Rpb24pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnPy5kYXRhPy5pc0FkdmFuY2VkU2VhcmNoICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHNlbGVjdGlvbilcclxuXHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgICBsZXQgZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dDogRHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCA9IHtcclxuICAgICAgICAgIGl0ZW1LZXlQcm9wZXJ0eU5hbWU6IHRoaXMua2V5LFxyXG4gICAgICAgICAgaXRlbXM6IHNlbGVjdGlvblswXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3JlZj8uY2xvc2UoZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG9uU2VsZWN0QWxsQ2hhbmdlKGV2ZW50OiBUYWJsZVNlbGVjdEFsbENoYW5nZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdEFsbCA9IGV2ZW50LmNoZWNrZWQ7XHJcbiAgICAgIGlmICh0aGlzLl9zZWxlY3RBbGwpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja2VkQnlGaWVsZCAmJiB0aGlzLmNoZWNrZWRCeUZpZWxkLnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5wYWdlLml0ZW1zLmZpbHRlcihcclxuICAgICAgICAgICAgaXRlbSA9PiBpdGVtW3RoaXMuY2hlY2tlZEJ5RmllbGRdID09PSB0cnVlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucGFnZS5pdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtc0NoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIG9uU2VsZWN0ZWRDb2x1bW5zQ2hhbmdlKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuZm9ybU5hbWUpIHtcclxuICAvLyAgICAgY29uc3Qgc3RvcmVkVmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmZvcm1OYW1lKTtcclxuXHJcbiAgLy8gICAgIGlmIChzdG9yZWRWYWx1ZSkge1xyXG4gIC8vICAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gSlNPTi5wYXJzZShzdG9yZWRWYWx1ZSk7XHJcbiAgLy8gICAgICAgbGV0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IFtdO1xyXG4gIC8vICAgICAgIGxldCBjb2x1bW5XaWR0aHM6IHN0cmluZ1tdID0gW107XHJcbiAgLy8gICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoaXRlbS5maWVsZCA9PT0gJ3VwbG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdkb3dubG9hZCcpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdjb25zdWx0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgZWxzZSBpZiAoaXRlbS5maWVsZCA9PT0gJ2RlbGV0ZScpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucy5pbmNsdWRlcyhpdGVtKSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaXRlbSk7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIGVsc2UgaWYgKGl0ZW0uZmllbGQgPT09ICdlZGl0Jykge1xyXG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2x1bW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgLy8gICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMucHVzaChpdGVtKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLnNvcnQoKGEsIGIpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChhLm9yZGVyICE9PSB1bmRlZmluZWQgJiYgYi5vcmRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICAgIHJldHVybiAwO1xyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goc2VsZWN0ZWRDb2x1bW4gPT4ge1xyXG4gIC8vICAgICAgICAgY29sdW1uT3JkZXIucHVzaChzZWxlY3RlZENvbHVtbi5maWVsZCk7XHJcbiAgLy8gICAgICAgICBjb25zdCBzZWxlY3RlZFdpZHRoID0gc2VsZWN0ZWRDb2x1bW4ubWluV2lkdGg7XHJcbiAgLy8gICAgICAgICBpZiAoc2VsZWN0ZWRXaWR0aCkge1xyXG4gIC8vICAgICAgICAgICBjb2x1bW5XaWR0aHMucHVzaChzZWxlY3RlZFdpZHRoLnRvU3RyaW5nKCkpO1xyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgLy9jb2x1bW5XaWR0aHMucHVzaCgnOTAnKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAvLyAgICAgICBzZXNzaW9uRGF0YS5jb2x1bW5PcmRlciA9IGNvbHVtbk9yZGVyO1xyXG4gIC8vICAgICAgIHNlc3Npb25EYXRhLmNvbHVtbldpZHRocyA9IGNvbHVtbldpZHRocy5qb2luKCcsJyk7XHJcblxyXG4gIC8vICAgICAgIC8vbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5mb3JtTmFtZSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbkRhdGEpKTtcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAvL2NvbnN0IHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUYWJsZUNvbmZpZ0pTT04oKTtcclxuICAvLyAgICAgICAvL2xvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuZm9ybU5hbWUsIHJlc3VsdCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIGdlbmVyYXRlVGFibGVDb25maWdKU09OKCk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCB0YWJsZUNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5qc29uU3RyaW5nTGF5b3V0KTtcclxuICAvLyAgIHRhYmxlQ29uZmlnLmNvbHVtbk9yZGVyID0gdGhpcy5zZWxlY3RlZENvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQpO1xyXG4gIC8vICAgLy90YWJsZUNvbmZpZy5jb2x1bW5XaWR0aHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoKCkgPT4gJzkwJykuam9pbignLCcpO1xyXG4gIC8vICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRhYmxlQ29uZmlnKTtcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgb25TdGF0ZVJlc3RvcmUodGFibGVTdGF0ZTogVGFibGVTdGF0ZSkge1xyXG4gICAgaWYgKHRhYmxlU3RhdGUuc2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGFibGVTdGF0ZS5zZWxlY3Rpb25cclxuICAgICAgdGhpcy5vblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5mb3JtTmFtZSkge1xyXG4gICAgLy8gICBjb25zdCBzdG9yZWRWYWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuZm9ybU5hbWUpO1xyXG4gICAgLy8gICBpZiAoc3RvcmVkVmFsdWUpIHtcclxuICAgIC8vICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IEpTT04ucGFyc2Uoc3RvcmVkVmFsdWUpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBzdHJpbmdbXSA9IHNlc3Npb25EYXRhLmNvbHVtbk9yZGVyO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbldpZHRoczogc3RyaW5nW10gPSBzZXNzaW9uRGF0YS5jb2x1bW5XaWR0aHMuc3BsaXQoJywnKTtcclxuXHJcbiAgICAvLyAgICAgLy8gVXBkYXRlIHNlbGVjdGVkQ29sdW1ucyBiYXNlZCBvbiBjb2x1bW5PcmRlciBhbmQgY29sdW1uV2lkdGhzXHJcbiAgICAvLyAgICAgY29uc3QgdXBkYXRlZFNlbGVjdGVkQ29sdW1uczogR3JpZENvbHVtbltdID0gW107XHJcbiAgICAvLyAgICAgY29sdW1uT3JkZXIuZm9yRWFjaCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAvLyAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9IGNvbHVtbldpZHRoc1tpbmRleF07XHJcbiAgICAvLyAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiBzZWxlY3RlZENvbHVtbnNcclxuICAgIC8vICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uSW5kZXggPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gZmllbGQpO1xyXG4gICAgLy8gICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uSW5kZXggIT09IC0xKSB7XHJcbiAgICAvLyAgICAgICAgIC8vIElmIHRoZSBjb2x1bW4gZXhpc3RzIGluIHNlbGVjdGVkQ29sdW1ucywgdXBkYXRlIGl0cyB3aWR0aFxyXG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uc1tleGlzdGluZ0NvbHVtbkluZGV4XS53aWR0aCA9IGNvbHVtbldpZHRoO1xyXG4gICAgLy8gICAgICAgICB1cGRhdGVkU2VsZWN0ZWRDb2x1bW5zLnB1c2godGhpcy5zZWxlY3RlZENvbHVtbnNbZXhpc3RpbmdDb2x1bW5JbmRleF0pO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG5cclxuICAgIC8vICAgICAvLyBVcGRhdGUgc2VsZWN0ZWRDb2x1bW5zIHdpdGggdGhlIHJlc3RvcmVkIGRhdGFcclxuICAgIC8vICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHVwZGF0ZWRTZWxlY3RlZENvbHVtbnM7XHJcblxyXG5cclxuICAgIC8vICAgICAgIGlmKHN0b3JlZFZhbHVlKXtcclxuXHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHN0b3JlZFZhbHVlKTtcclxuICAgIC8vICAgICAgICAgaWYgKChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHx8IChkYXRhLmZpbHRlcnMgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmZpbHRlcnMgPiAwKSkge1xyXG4gICAgLy8gICAgICAgICAgIGlmIChkYXRhLm11bHRpU29ydE1ldGEgJiYgZGF0YS5tdWx0aVNvcnRNZXRhLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgICAgIGRhdGEubXVsdGlTb3J0TWV0YS5mb3JFYWNoKChtZXRhOiB7IGZpZWxkOiBhbnk7IG9yZGVyOiBhbnk7IH0pID0+IHsgXHJcblxyXG4gICAgLy8gICAgICAgICAgICAgICBsZXQgc29ydCA9IHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogbWV0YS5maWVsZCxcclxuICAgIC8vICAgICAgICAgICAgICAgICBvcmRlcjogbWV0YS5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcclxuICAgIC8vICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICB0aGlzLl9zb3J0ID0gW3NvcnRdO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7ICBcclxuICAgIC8vICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgaWYgKGRhdGEuZmlsdGVycykge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5zZWFyY2hGaWVsZHMgPVtdO1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgZmlsdGVyc0FycmF5OiBbc3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfCBudWxsOyBtYXRjaE1vZGU6IHN0cmluZyxvcGVyYXRvciA6IHN0cmluZyB9W11dW10gPSBPYmplY3QuZW50cmllcyhkYXRhLmZpbHRlcnMpO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChbZmllbGROYW1lLCBmaWVsZFZhbHVlXSkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgICAgICAgZmllbGRWYWx1ZS5mb3JFYWNoKGZpbHRlciA9PlxyXG4gICAgLy8gICAgICAgICAgICAgICAgIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYoZmlsdGVyLnZhbHVlKXtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hGaWVsZCA6IFNlYXJjaEZpZWxkID17XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGZpZWxkIDpmaWVsZE5hbWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGxhYmVsVmFsdWUgOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhbHVlOmZpbHRlci52YWx1ZSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHRoaXMuaW5mZXJJbnB1dFR5cGUoZmllbGROYW1lKSxcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgOiB0aGlzLmdldE9wZXJhdG9yTnVtYmVyKGZpbHRlci5tYXRjaE1vZGUpXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlYXJjaEZpZWxkJyxzZWFyY2hGaWVsZCk7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGaWVsZHMpIHtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZpZWxkcy5wdXNoKHNlYXJjaEZpZWxkKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIH0pO1xyXG4gICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICAvLyAgICAgICAgIH1cclxuXHJcbiAgICAvLyAgICAgICB9XHJcblxyXG4gICAgLy8gICB9IGVsc2Uge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwiTm8gc2Vzc2lvbiBkYXRhIGZvdW5kIGluIGxvY2FsU3RvcmFnZVwiKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb25DbGVhckZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmR0Py5jbGVhcigpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYCR7dGhpcy5mb3JtTmFtZX0tZmlsdGVyTW9kZWApXHJcbiAgfVxyXG5cclxuICBnZXRPcGVyYXRvck51bWJlcihvcGVyYXRvcjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBGaWx0ZXJPcGVyYXRvclR5cGVbb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBrZXlvZiB0eXBlb2YgRmlsdGVyT3BlcmF0b3JUeXBlXSA/PyAtMTtcclxuICB9XHJcbiAgaW5mZXJJbnB1dFR5cGUodmFsdWU6IGFueSk6IElucHV0VHlwZXMge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgaWYgKC9eXFxkKyQvLnRlc3QodmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuSU5URUdFUjtcclxuICAgICAgfSBlbHNlIGlmICgvXlxcZCtcXC5cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICByZXR1cm4gSW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUO1xyXG4gICAgICB9IGVsc2UgaWYgKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgIHJldHVybiBJbnB1dFR5cGVzLkRBVEU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIElucHV0VHlwZXMuVEVYVF9CT1g7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBJbnB1dFR5cGVzLlRFWFRfQk9YO1xyXG4gICAgfVxyXG4gIH1cclxuICBsb2FkSW5pdGlhbFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZVsnZ2V0J10oJ3RhYmxlLXN0YXRlJyk7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcml2YXRlIF9leHRyYWN0RmlsdGVycyhldmVudDogRmlsdGVyTWV0YWRhdGFbXSB8IGFueSk6IElGaWx0ZXJlZFJlcXVlc3RbXSB7XHJcbiAgICBsZXQgZmlsdGVyczogSUZpbHRlcmVkUmVxdWVzdFtdID0gW107XHJcbiAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeTogc3RyaW5nIHwgdW5kZWZpbmVkID0gY29sLmN1cnJlbmN5T3RoZXJDb2RlO1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSB0aGlzLmRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVkpIHtcclxuICAgICAgICAgIGN1cnJlbmN5ID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYXBwU2V0dGluZ3MuZGV2aXNlU29jaWV0ZS5jb2RlRGV2aXNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGxldCBmaWx0ZXIgPSBldmVudFtjb2wuZmllbGRdO1xyXG4gICAgICAgICAgaWYgKHRoaXMuX25vdE51bGxPclVuZGVmaW5lZChmaWx0ZXIpKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbm90TnVsbE9yVW5kZWZpbmVkKGl0ZW0udmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShpdGVtLnZhbHVlLCAneXl5eS1NTS1kZCcpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IEZpbHRlckhlbHBlci5Ub09wZXJhdG9yVHlwZShpdGVtLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWU6IGl0ZW0udmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJldHlOYW1lOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBjb2wuaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgIG51bU9mRGVjaW1hbDogY29sLm51bU9mRGVjaW1hbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21ib2JveExhYmVsOiBjb2wuY29tYm9MYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUNvbHVtbjogY29sLmlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlci52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGZpbHRlci52YWx1ZSwgJ3l5eXktTU0tZGQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJIZWxwZXIuVG9PcGVyYXRvclR5cGUoZmlsdGVyLm1hdGNoTW9kZSksXHJcbiAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXIudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgIHByb3ByZXR5TmFtZTogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICBoZWFkZXI6IGNvbC5oZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU6IEZpbHRlckhlbHBlci5Ub0lucHV0VHlwZShjb2wudHlwZSksXHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgbnVtT2ZEZWNpbWFsOiBjb2wubnVtT2ZEZWNpbWFsLFxyXG4gICAgICAgICAgICAgICAgICBpc0ZyYWN0aW9uOiBjb2wuaXNGcmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgY29tYm9ib3hMYWJlbDogY29sLmNvbWJvTGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgIGlzQ3VzdG9tQ29sdW1uOiBjb2wuaXNDdXN0b21Db2x1bW5cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmlsdGVycztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTb3J0Q3JpdGVyaWFzKGxhenlMb2FkRXZlbnQ6IFRhYmxlTGF6eUxvYWRFdmVudCk6IHZvaWQge1xyXG4gICAgbGV0IHNvcnRNZXRhID0gdGhpcy5fdG9Tb3J0TWV0YShsYXp5TG9hZEV2ZW50KTtcclxuICAgIGlmIChzb3J0TWV0YSkge1xyXG4gICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gR3JpZFNvcnRNb2RlLlNpbmdsZSkge1xyXG4gICAgICAgIHRoaXMuX2V4dHJhY3RTaW5nbGVTb3J0Q3JpdGVyaWEoc29ydE1ldGEpXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zb3J0TW9kZSA9PT0gR3JpZFNvcnRNb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgICAgdGhpcy5fZXh0cmFjdE11bHRpcGxlU29ydENyaXRlcmlhcyhzb3J0TWV0YSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdFNpbmdsZVNvcnRDcml0ZXJpYShzb3J0TWV0YTogU29ydE1ldGEpIHtcclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmIChzb3J0TWV0YS5maWVsZCkge1xyXG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgc29ydCBlbGVtZW50XHJcbiAgICAgICAgbGV0IGlzQ3VzdG9tQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBzb3J0TWV0YS5maWVsZCk/LmlzQ3VzdG9tQ29sdW1uO1xyXG4gICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICBwcm9wZXJ0eTogc29ydE1ldGEuZmllbGQsXHJcbiAgICAgICAgICBvcmRlcjogc29ydE1ldGEub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnLFxyXG4gICAgICAgICAgaXNDdXN0b21Db2x1bW46IGlzQ3VzdG9tQ29sdW1uXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3NvcnQgPSBbc29ydF1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBwcm9jZXNzIFxcJ1NpbmdsZVNvcnRcXCcgd2hlbiBbc29ydE1vZGVdIGlzIFxcJ211bHRpcGxlXFwnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0TXVsdGlwbGVTb3J0Q3JpdGVyaWFzKHNvcnRNZXRhczogU29ydE1ldGFbXSkge1xyXG5cclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHNvcnRNZXRhcyAmJiBBcnJheS5pc0FycmF5KHNvcnRNZXRhcykpIHtcclxuICAgICAgICAvLyBjcmVhdGUgbmV3IHNvcnQgZWxlbWVudFxyXG4gICAgICAgIHRoaXMuX3NvcnQgPSBbXTtcclxuICAgICAgICB0aGlzLnNvcnRNZXRhcyA9IHNvcnRNZXRhcztcclxuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXRhICcsIHNvcnRNZXRhcylcclxuICAgICAgICBzb3J0TWV0YXMuZm9yRWFjaChzbSA9PiB7XHJcbiAgICAgICAgICBpZiAoc20uZmllbGQpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBzb3J0IGVsZW1lbnRcclxuICAgICAgICAgICAgbGV0IGlzQ3VzdG9tQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLmZpZWxkID09PSBzbS5maWVsZCk/LmlzQ3VzdG9tQ29sdW1uO1xyXG4gICAgICAgICAgICBsZXQgc29ydDogSVNvcnRCeVByb3ByZXR5ID0ge1xyXG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzbS5maWVsZCxcclxuICAgICAgICAgICAgICBvcmRlcjogc20ub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnLFxyXG4gICAgICAgICAgICAgIGlzQ3VzdG9tQ29sdW1uOiBpc0N1c3RvbUNvbHVtblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL2FkZCB0aGUgbmV3IGVsZW1lbnQgdG8gX3NvcnRcclxuICAgICAgICAgICAgdGhpcy5fc29ydC5wdXNoKHNvcnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHByb2Nlc3MgXFwnTXVsdGlwbGVTb3J0XFwnIHdoZW4gW3NvcnRNb2RlXSBpcyBcXCdzaW5nbGVcXCcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25vdE51bGxPclVuZGVmaW5lZChvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG9iaiAhPSBudWxsXHJcbiAgICAgICYmIG9iaiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0T25seVZpc2libGVTZWFyY2hGaWVsZHMoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uU2V0dGluZ3MgJiZcclxuICAgICAgdGhpcy5wcmVzZW50YXRpb25TZXR0aW5ncy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5sZW5ndGggPiAwICYmXHJcbiAgICAgIHRoaXMudGVtcFNlYXJjaEZpZWxkc1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy50ZW1wU2VhcmNoRmllbGRzLmZpbHRlcihzZiA9PiB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5wcmVzZW50YXRpb25TZXR0aW5ncz8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHNcclxuICAgICAgICAgIC5maW5kKHAgPT4gcC5ibG9ja05hbWUgPT09IHNmLmZpZWxkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuICFjb25maWcgfHwgY29uZmlnLmlzQmxvY2tWaXNpYmxlID09PSB0cnVlIHx8IGNvbmZpZy5pc0Jsb2NrVmlzaWJsZSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTZWFyY2hCb3hGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VhcmNoQm94RmlsdGVycyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGRzKSB7XHJcblxyXG4gICAgICB0aGlzLl9leHRyYWN0T25seVZpc2libGVTZWFyY2hGaWVsZHMoKTtcclxuXHJcbiAgICAgIHRoaXMuc2VhcmNoRmllbGRzLmZvckVhY2goKHNmOiBTZWFyY2hGaWVsZCkgPT4ge1xyXG4gICAgICAgIC8vaWYgKHNmLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBzZi52YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHNmLm9wZXJhdG9yICE9IG51bGwgJiYgc2Yub3BlcmF0b3IgIT0gdW5kZWZpbmVkICYmIHNmLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBzZi52YWx1ZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgbGV0IGZpbHRlckJ5UHJvcGVydHk6IElGaWx0ZXJlZFJlcXVlc3QgPSB7XHJcbiAgICAgICAgICAgIG9wZXJhdG9yOiBzZi5vcGVyYXRvclxyXG4gICAgICAgICAgICAsIGZpbHRlclZhbHVlOiBzZi52YWx1ZVxyXG4gICAgICAgICAgICAsIHByb3ByZXR5TmFtZTogc2YuZmllbGRcclxuICAgICAgICAgICAgLCBoZWFkZXI6IHNmLmxhYmVsVmFsdWVcclxuICAgICAgICAgICAgLCB0eXBlOiBzZi50eXBlXHJcbiAgICAgICAgICAgICwgY29tYm9ib3hMYWJlbDogc2YuY29tYm9ib3hMYWJlbFxyXG4gICAgICAgICAgICAsIGN1cnJlbmN5OiBzZi5jdXJyZW5jeVxyXG4gICAgICAgICAgICAsIGlzRnJhY3Rpb246IHNmLmlzRnJhY3Rpb25cclxuICAgICAgICAgICAgLCBudW1PZkRlY2ltYWw6IHNmLm51bU9mRGVjaW1hbFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEJveEZpbHRlcnMucHVzaChmaWx0ZXJCeVByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2Yub3BlcmF0b3IgPT0gdW5kZWZpbmVkIHx8IHNmLm9wZXJhdG9yID09IG51bGwpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIHNlYXJjaCBmaWVsZCB3aXRoIFtmaWVsZCA6ICR7c2YuZmllbGR9XSBoYXZlIG5vIG9wZXJhdG9yc2ApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2Nsb25lUGFnZWRSZXF1ZXN0KHJlcXVlc3Q6IElQYWdlZFJlcXVlc3QpOiBJUGFnZWRSZXF1ZXN0IHtcclxuICAgIGxldCBjbG9uZTogSVBhZ2VkUmVxdWVzdCA9IHtcclxuICAgICAgbWF4UmVzdWx0Q291bnQ6IHJlcXVlc3QubWF4UmVzdWx0Q291bnQsXHJcbiAgICAgIHNraXBDb3VudDogcmVxdWVzdC5za2lwQ291bnQsXHJcbiAgICAgIHNvcnRpbmc6IHJlcXVlc3Quc29ydGluZyxcclxuICAgICAga2V5d29yZDogcmVxdWVzdC5rZXl3b3JkLFxyXG4gICAgICBmaWx0ZXJzOiByZXF1ZXN0LmZpbHRlcnMsXHJcbiAgICAgIGdldEFsbERhdGE6IHJlcXVlc3QuZ2V0QWxsRGF0YSxcclxuICAgICAgc3VtbWFyaWVzOiByZXF1ZXN0LnN1bW1hcmllc1xyXG4gICAgfTtcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RIYXZlU3VtbWFyeVByb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBsZXQgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gICAgbGV0IGhhdmVTdW1tYXJ5Q29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmhhdmVTdW1tYXJ5ID09PSB0cnVlKTtcclxuICAgIGlmIChoYXZlU3VtbWFyeUNvbHVtbnMgJiYgaGF2ZVN1bW1hcnlDb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcHJvcGVydGllcyA9IGhhdmVTdW1tYXJ5Q29sdW1ucy5tYXAoYyA9PiBjLmZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHJvcGVydGllcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RTdW1tYXJpZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYWdlLnN1bW1hcmllcykge1xyXG4gICAgICB0aGlzLnBhZ2Uuc3VtbWFyaWVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgICAgdGhpcy5zdW1tYXJpZXNbcy5wcm9wcmV0eV0gPSBzLnN1bW1hcnk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXh0cmFjdE11bHRpU29ydE1ldGFJdGVtcygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3NvcnQgPSBbXTtcclxuICAgIGlmICh0aGlzLnNvcnRNZXRhcykge1xyXG4gICAgICB0aGlzLnNvcnRNZXRhcy5mb3JFYWNoKChzOiBTb3J0TWV0YSkgPT4ge1xyXG4gICAgICAgIGxldCBzb3J0OiBJU29ydEJ5UHJvcHJldHkgPSB7XHJcbiAgICAgICAgICBwcm9wZXJ0eTogcy5maWVsZCxcclxuICAgICAgICAgIG9yZGVyOiBzLm9yZGVyID09IDEgPyAnQVNDJyA6ICdERVNDJ1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHNvcnRJdGVtID0gdGhpcy5fc29ydC5maW5kKHMgPT4gcy5wcm9wZXJ0eSA9PSBzb3J0LnByb3BlcnR5KTtcclxuXHJcbiAgICAgICAgaWYgKHNvcnRJdGVtKSB7XHJcbiAgICAgICAgICBpZiAoc29ydEl0ZW0ub3JkZXIgIT0gc29ydC5vcmRlcikge1xyXG4gICAgICAgICAgICBzb3J0SXRlbS5vcmRlciA9IHNvcnQub3JkZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc29ydC5wdXNoKHNvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90b1NvcnRNZXRhKHRhYmxlTGF6eUxvYWRFdmVudDogVGFibGVMYXp5TG9hZEV2ZW50KTogYW55IHtcclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuU2luZ2xlKSB7XHJcbiAgICAgIGlmICh0YWJsZUxhenlMb2FkRXZlbnQuc29ydEZpZWxkICYmIHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0T3JkZXIpIHtcclxuICAgICAgICBsZXQgc29ydE1ldGE6IElTb3J0TWV0YSA9IHtcclxuICAgICAgICAgIGZpZWxkOiB0YWJsZUxhenlMb2FkRXZlbnQuc29ydEZpZWxkLFxyXG4gICAgICAgICAgb3JkZXI6IHRhYmxlTGF6eUxvYWRFdmVudC5zb3J0T3JkZXJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNvcnRNZXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNvcnRNb2RlID09PSBHcmlkU29ydE1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHRhYmxlTGF6eUxvYWRFdmVudC5tdWx0aVNvcnRNZXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhYmxlTGF6eUxvYWRFdmVudC5tdWx0aVNvcnRNZXRhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBbc29ydE1vZGVdIGhhdmUgYmVlbiBzZXQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlRmlsdGVyc0h0bWxUZW1wbGF0ZSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgPSBcIlwiXHJcbiAgICAvL2V4Y2x1ZGUgdXNlbGVzcyBHcmlkIGZpbHRlciBcclxuICAgIHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzID0gdGhpcy5fZXhjbHVkZVVzZWxlc3NHcmlkRmlsdGVyKHRoaXMuX2dyaWRIZWFkZXJGaWx0ZXJzKVxyXG5cclxuICAgIC8vYWRkIHNlYXJjaCBCb3ggZmlsdGVycyBodG1sXHJcbiAgICBpZiAodGhpcy5fc2VhcmNoQm94RmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgPSB0aGlzLl9odG1sVGVtcGxhdGVHZW5lcmF0b3JTZXJ2aWNlXHJcbiAgICAgICAgLmdlbmVyYXRlR3JpZEZpbHRlcnNUZW1wbGF0ZSh0aGlzLl9zZWFyY2hCb3hGaWx0ZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FkZCBncmlkIGhlYWRlciBmaWx0ZXJzIGh0bWxcclxuICAgIGlmICh0aGlzLl9ncmlkSGVhZGVyRmlsdGVycykge1xyXG4gICAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUgKz0gdGhpcy5faHRtbFRlbXBsYXRlR2VuZXJhdG9yU2VydmljZVxyXG4gICAgICAgIC5nZW5lcmF0ZUdyaWRGaWx0ZXJzVGVtcGxhdGUodGhpcy5fZ3JpZEhlYWRlckZpbHRlcnMsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGVDaGFuZ2UuZW1pdCh0aGlzLmZpbHRlcnNIdG1sVGVtcGxhdGUpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4Y2x1ZGVVc2VsZXNzR3JpZEZpbHRlcihmaWx0ZXJzOiBJRmlsdGVyZWRSZXF1ZXN0W10pIHtcclxuICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcih4ID0+XHJcbiAgICAgIHguZmlsdGVyVmFsdWUgIT09IG51bGwgJiYgeC5maWx0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHguZmlsdGVyVmFsdWUgIT09IFwiXCIgJiYgeC5vcGVyYXRvciAhPT0gdW5kZWZpbmVkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZXhjbHVkZVVzZWxlc3NGaWx0ZXJzKHBhZ2VkUmVxdWVzdDogSVBhZ2VkUmVxdWVzdCk6IElQYWdlZFJlcXVlc3Qge1xyXG4gICAgaWYgKHBhZ2VkUmVxdWVzdCAmJiBwYWdlZFJlcXVlc3QuZmlsdGVycykge1xyXG4gICAgICBwYWdlZFJlcXVlc3QuZmlsdGVycyA9IHBhZ2VkUmVxdWVzdC5maWx0ZXJzLmZpbHRlcihmID0+IGYuZmlsdGVyVmFsdWUgIT0gdW5kZWZpbmVkICYmIGYuZmlsdGVyVmFsdWUgIT0gbnVsbClcclxuICAgIH1cclxuICAgIHJldHVybiBwYWdlZFJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBleHBvcnRFeGNlbCgpIHtcclxuICAgIHRoaXMucGFnZWRSZXF1ZXN0ISEuZ2V0QWxsRGF0YSA9IHRydWVcclxuICAgIGlmICh0aGlzLmNydWRTZXJ2aWNlICE9IG51bGwgJiYgdGhpcy5jcnVkU2VydmljZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5pc0dyaWREYXRhUGFnZWRJbkFwaSkge1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmdldEFsbFBhZ2VkKHRoaXMucGFnZWRSZXF1ZXN0ISEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHZhbHVlOiBJUGFnZWRSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFsdWUpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEl0ZW1zID0gRXhwb3J0RXhjZWxIZWxwZXIucHJlcHJvY2Vzc0RhdGVGb3JFeGNlbCh2YWx1ZS5pdGVtcyk7XHJcbiAgICAgICAgICAgIHZhbHVlLml0ZW1zID0gZm9ybWF0dGVkSXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YUZyb21BcGlUb0V4Y2VsU2hlZXQodmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBhZ2UubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVycm9yKGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgZmlsdGVyZWREYXRhID0gdGhpcy5wYWdlLml0ZW1zLmZpbHRlcigoY29sOiBhbnkpID0+ICFjb2wuaXNCdXR0b24pO1xyXG4gICAgICBmaWx0ZXJlZERhdGEgPSBFeHBvcnRFeGNlbEhlbHBlci5wcmVwcm9jZXNzRGF0ZUZvckV4Y2VsKGZpbHRlcmVkRGF0YSk7XHJcbiAgICAgIHRoaXMucGFnZS5pdGVtcyA9IGZpbHRlcmVkRGF0YVxyXG4gICAgICB0aGlzLmV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHRoaXMucGFnZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydERhdGFGcm9tQXBpVG9FeGNlbFNoZWV0KHZhbHVlOiBhbnkpIHtcclxuICAgIGltcG9ydChcInhsc3hcIikudGhlbih4bHN4ID0+IHtcclxuICAgICAgY29uc3Qgd29ya2Jvb2sgPSB4bHN4LnV0aWxzLmJvb2tfbmV3KCk7XHJcbiAgICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCEuZmlsdGVycz8ubGVuZ3RoICE9IDApIHtcclxuICAgICAgICBjb25zdCBtYXBwZWRGaWx0ZXJzID0gdGhpcy5wYWdlZFJlcXVlc3QhLmZpbHRlcnM/Lm1hcChmaWx0ZXIgPT4gKHtcclxuICAgICAgICAgIHByb3BlcnR5OiBmaWx0ZXIucHJvcHJldHlOYW1lLFxyXG4gICAgICAgICAgb3BlcmF0b3JOYW1lOiB0aGlzLmdldEZpbHRlck9wZXJhdG9yTmFtZShmaWx0ZXIub3BlcmF0b3IpLFxyXG4gICAgICAgICAgdmFsdWU6IGZpbHRlci5maWx0ZXJWYWx1ZVxyXG4gICAgICAgIH0pKTtcclxuICAgICAgICBjb25zdCBmaWx0ZXJzID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KDxhbnlbXT5tYXBwZWRGaWx0ZXJzKVxyXG4gICAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIGZpbHRlcnMsICdGaWx0ZXJzJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5pc0J1dHRvbikubWFwKGNvbHVtbiA9PiBjb2x1bW4udHJhbnNsYXRlZEhlYWRlciEhKVxyXG4gICAgICBzZWxlY3RlZENvbHVtbnNGaWVsZHMgPSBzZWxlY3RlZENvbHVtbnNGaWVsZHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpXHJcbiAgICAgIGNvbnN0IHdvcmtzaGVldERhdGEgPSB2YWx1ZS5pdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGE6IHsgW2hlYWRlcjogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgcm93RGF0YVtjb2wudHJhbnNsYXRlZEhlYWRlciEhXSA9IGl0ZW1bY29sLmZpZWxkXTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gcm93RGF0YTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGZpbHRlcmVkV29ya3NoZWV0RGF0YSA9IHRoaXMucmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGEsIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcylcclxuICAgICAgY29uc3Qgd29ya3NoZWV0ID0geGxzeC51dGlscy5qc29uX3RvX3NoZWV0KGZpbHRlcmVkV29ya3NoZWV0RGF0YSk7XHJcbiAgICAgIHhsc3gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod29ya2Jvb2ssIHdvcmtzaGVldCwgJ0RhdGEnKTtcclxuICAgICAgY29uc3QgZXhjZWxCdWZmZXI6IGFueSA9IHhsc3gud3JpdGUod29ya2Jvb2ssIHsgYm9va1R5cGU6ICd4bHN4JywgdHlwZTogJ2FycmF5JyB9KTtcclxuICAgICAgdGhpcy5zYXZlQXNFeGNlbEZpbGUoZXhjZWxCdWZmZXIsIFwiZXhjZWxcIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVBc0V4Y2VsRmlsZShidWZmZXI6IGFueSwgZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IEVYQ0VMX1RZUEUgPSAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQ7Y2hhcnNldD1VVEYtOCc7XHJcbiAgICBsZXQgRVhDRUxfRVhURU5TSU9OID0gJy54bHN4JztcclxuICAgIGNvbnN0IGRhdGE6IEJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICB0eXBlOiBFWENFTF9UWVBFXHJcbiAgICB9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoZGF0YSwgZmlsZU5hbWUgKyAnX2V4cG9ydF8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBFWENFTF9FWFRFTlNJT04pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyT3BlcmF0b3JOYW1lKG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTDogcmV0dXJuICdFUVVBTCc7XHJcbiAgICAgIGNhc2UgRmlsdGVyT3BlcmF0b3JUeXBlLkxFU1NPUkVRVUFMOiByZXR1cm4gJ0xFU1MgT1IgRVFVQUwnO1xyXG4gICAgICBjYXNlIEZpbHRlck9wZXJhdG9yVHlwZS5HUkVBVEVST1JFUVVBTDogcmV0dXJuICdHUkVBVEVSIE9SIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTEVTUzogcmV0dXJuICdMRVNTJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuR1JFQVRFUjogcmV0dXJuICdHUkVBVEVSJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuTk9URVFVQUw6IHJldHVybiAnTk9UIEVRVUFMJztcclxuICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRvclR5cGUuQ09OVEFJTlM6IHJldHVybiAnQ09OVEFJTlMnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ1VOS05PV05fT1BFUkFUT1InO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlTm9uRXhpc3RpbmdDb2x1bW5zKHdvcmtzaGVldERhdGE6IGFueVtdLCBzZWxlY3RlZENvbHVtbnNGaWVsZHM6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHdvcmtzaGVldERhdGEubWFwKHJvdyA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1JvdzogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHNlbGVjdGVkQ29sdW1uc0ZpZWxkcykge1xyXG4gICAgICAgIGlmIChyb3cuaGFzT3duUHJvcGVydHkoY29sKSkge1xyXG4gICAgICAgICAgbmV3Um93W2NvbF0gPSByb3dbY29sXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5ld1JvdztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlSGVhZGVyRmlsdGVycygpIHtcclxuICAgIGlmICh0aGlzLnNob3dIZWFkZXJGaWx0ZXJzID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWx0ZXJJY29uID0gXCJwaSBwaS1maWx0ZXJcIjtcclxuICAgICAgdGhpcy5maWx0ZXJUb29sdGlwID0gXCJzaG93X2ZpbHRlclwiO1xyXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYClcclxuICAgIH1cclxuICAgIGVsc2UgeyAvL3RoaXMuc2hvd0hlYWRlckZpbHRlcnMgPT09IGZhbHNlXHJcbiAgICAgIHRoaXMuc2hvd0hlYWRlckZpbHRlcnMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZpbHRlckljb24gPSBcInBpIHBpLWZpbHRlci1zbGFzaFwiO1xyXG4gICAgICB0aGlzLmZpbHRlclRvb2x0aXAgPSBcImhpZGVfZmlsdGVyXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVIZWFkZXJGaWx0ZXJzTW9kZSgpIHtcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcbiAgICAgIHRoaXMuZHQuY2xlYXIoKVxyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHt0aGlzLmZvcm1OYW1lfS1maWx0ZXJNb2RlYCwgdGhpcy5maWx0ZXJNb2RlVG9vbHRpcClcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPT09IFwibWVudV9tb2RlXCIpIHtcclxuICAgICAgICB0aGlzLmNoYW5nZUhlYWRlckZpbHRlcnNNb2RlID0gXCJtZW51XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktY2hlY2tcIjtcclxuICAgICAgICB0aGlzLmZpbHRlck1vZGVUb29sdGlwID0gXCJyb3dfbW9kZVwiO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNlbGVjdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5kdC5maWx0ZXJzW2NvbC5maWVsZF0gPSBbeyB2YWx1ZTogbnVsbCwgbWF0Y2hNb2RlOiB1bmRlZmluZWQgfV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHQuX2ZpbHRlcigpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZSA9IFwicm93XCI7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJNb2RlSWNvbiA9IFwicGkgcGktZWxsaXBzaXMtdlwiO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTW9kZVRvb2x0aXAgPSBcIm1lbnVfbW9kZVwiO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNlbGVjdGVkQ29sdW1ucykge1xyXG4gICAgICAgICAgdGhpcy5kdC5maWx0ZXJzW2NvbC5maWVsZF0gPSB7IHZhbHVlOiBudWxsLCBtYXRjaE1vZGU6IHVuZGVmaW5lZCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmR0Ll9maWx0ZXIoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJDbGFzc0NvbG9yKGNvbHVtblR5cGU6IERpc3BsYXlUeXBlcyk6IHN0cmluZyB7XHJcbiAgICBsZXQgY29sb3JmdWwgPSB0aGlzLmxheW91dEhlbHBlclNlcnZpY2UubGF5b3V0Q29uZmlndXJhdGlvbi5pc0NvbG9yZnVsTW9kZUVuYWJsZWQ7XHJcbiAgICBpZiAoY29sb3JmdWwgPT09IHRydWUpIHtcclxuICAgICAgbGV0IGNvbG9yRm9ySW50ZWdlckRpc3BsYXkgPSBEaXNwbGF5VHlwZUNvbG9yc1tjb2x1bW5UeXBlXSB8fCAnd2hpdGUtZ3JpZCc7XHJcbiAgICAgIHJldHVybiBjb2xvckZvckludGVnZXJEaXNwbGF5O1xyXG4gICAgfSBlbHNlIHJldHVybiAnd2hpdGUtZ3JpZCdcclxuICB9XHJcblxyXG4gIGdldCBjb2xvcmZ1bCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxheW91dEhlbHBlclNlcnZpY2UubGF5b3V0Q29uZmlndXJhdGlvbi5pc0NvbG9yZnVsTW9kZUVuYWJsZWQ7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGluaXRpYWxDb2x1bW5zUHJvY2VzcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRldmlzZVNvY2lldGVOdW1PZkRlY2ltYWw6IG51bWJlciA9IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLmFwcFNldHRpbmdzLmRldmlzZVNvY2lldGUubm9tYnJlRGVjaW1hbGVzID8/IERlZmF1bHRTb2NpZXRlRGV2aXNlLm5vbWJyZURlY2ltYWxlcztcclxuXHJcbiAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goKGNvbDogR3JpZENvbHVtbikgPT4ge1xyXG4gICAgICAvLyBzZXQgaXNOdW1lcmljXHJcbiAgICAgIGNvbC5pc051bWVyaWMgPSBjb2wudHlwZSAhPSB1bmRlZmluZWQgJiYgY29sLnR5cGUgIT0gbnVsbCAmJiAoTnVtZXJpY0Rpc3BsYXlUeXBlcy5pbmRleE9mKGNvbC50eXBlKSA+PSAwKTtcclxuXHJcbiAgICAgIC8vIHNldCBmaWx0ZXJJbnB1dFR5cGVcclxuICAgICAgc3dpdGNoIChjb2wudHlwZSkge1xyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkRBVEVfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdkYXRlJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuREFURVRJTUVfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdkYXRlJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5JTlRFR0VSX0RJU1BMQVk6XHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWTpcclxuICAgICAgICBjYXNlIERpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZOlxyXG4gICAgICAgIGNhc2UgRGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdudW1lcmljJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSBEaXNwbGF5VHlwZXMuQ0hFQ0tCT1hfRElTUExBWToge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICdib29sZWFuJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgY29sLmZpbHRlcklucHV0VHlwZSA9ICd0ZXh0JztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBudW1PZkRlY2ltYWxcclxuICAgICAgaWYgKGNvbC5udW1PZkRlY2ltYWwpIHJldHVybjtcclxuXHJcbiAgICAgIGlmICghY29sLnR5cGUpIHtcclxuICAgICAgICBjb2wubnVtT2ZEZWNpbWFsID0gMDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghY29sLmlzTnVtZXJpYykge1xyXG4gICAgICAgIGNvbC5udW1PZkRlY2ltYWwgPSAwO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbC50eXBlID09PSBEaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IGRldmlzZVNvY2lldGVOdW1PZkRlY2ltYWw7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbC50eXBlID09PSBEaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZKSB7XHJcbiAgICAgICAgY29sLm51bU9mRGVjaW1hbCA9IDA7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDYWxlbmRhckV2ZW50Q2xpY2soaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5tb2RlID09PSBcIlNFQVJDSFwiKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5jYWxlbmRhckV2ZW50Q2xpY2suZW1pdChpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZURhdGVSYW5nZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBsZXQgc3RhcnQgPSB0aGlzLnNlYXJjaEZpZWxkcz8uZmluZCh4ID0+IHguZmllbGQgPT09IHRoaXMuY2FsZW5kZXJTY2hlbWE/LnN0YXJ0KVxyXG4gICAgbGV0IGVuZCA9IHRoaXMuc2VhcmNoRmllbGRzPy5maW5kKHggPT4geC5maWVsZCA9PT0gdGhpcy5jYWxlbmRlclNjaGVtYT8uZW5kKVxyXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xyXG4gICAgICBzdGFydC52YWx1ZSA9IGV2ZW50LnN0YXJ0O1xyXG4gICAgICBlbmQudmFsdWUgPSBldmVudC5lbmQ7XHJcbiAgICAgIHN0YXJ0LmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgZW5kLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zZWFyY2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGxTZWFyY2hIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnBhZ2VkUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5tYXhSZXN1bHRDb3VudCA9IGV2ZW50Lm1heFJlc3VsdENvdW50O1xyXG4gICAgICB0aGlzLnBhZ2VkUmVxdWVzdC5za2lwQ291bnQgPSBldmVudC5za2lwQ291bnQ7XHJcbiAgICAgIHRoaXMuc2VhcmNoKCk7XHJcbiAgICAgIHRoaXMucGFnZSQubmV4dCh7IC4uLnRoaXMucGFnZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEhlYWRlclRpdGxlcyh0aXRsZXM6IHN0cmluZ1tdLCBpdGVtOiBhbnkpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRpdGxlcyB8fCAhaXRlbSlcclxuICAgICAgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IGtleSA9IGl0ZW0udWlkO1xyXG4gICAgaWYgKHRoaXMudGl0bGVDYWNoZS5oYXMoa2V5KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy50aXRsZUNhY2hlLmdldChrZXkpIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlcyA9IHRpdGxlcy5tYXAodCA9PiBpdGVtW3RdKS5maWx0ZXIodiA9PiAhIXYpO1xyXG4gICAgdGhpcy50aXRsZUNhY2hlLnNldChrZXksIHJlcyk7XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgb25TdGF0dXNGaWx0ZXJDaGFuZ2VkKGV2dDogYW55KSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9IGV2dDtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHM/LmZpbHRlcihzZiA9PiBzZi5maWVsZCAhPT0gdGhpcy5lbnRpdHlJbmZvPy5zdGF0dXNDb2x1bW5OYW1lKTtcclxuICAgIHRoaXMuc2VhcmNoRmllbGRzPy5wdXNoKHtcclxuICAgICAgZmllbGQ6IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZSA/PyBcIlwiLFxyXG4gICAgICB2YWx1ZTogZXZ0LFxyXG4gICAgICBsYWJlbFZhbHVlOiAnJyxcclxuICAgICAgdHlwZTogSW5wdXRUeXBlcy5DT01CT0JPWCxcclxuICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yVHlwZS5FUVVBTCxcclxuICAgICAgc3R5bGVDbGFzczogXCJoaWRkZW5cIlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRlbXBTZWFyY2hGaWVsZHMgPSB0aGlzLnNlYXJjaEZpZWxkcyA/PyB0aGlzLnRlbXBTZWFyY2hGaWVsZHNcclxuICB9XHJcblxyXG4gIG9uV29ya2Zsb3dFdGF0RmlsdGVyQ2hhbmdlZChldnQ6IGFueSkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBldnQ7XHJcbiAgICB0aGlzLnNlYXJjaEZpZWxkcyA9IHRoaXMuc2VhcmNoRmllbGRzPy5maWx0ZXIoc2YgPT4gc2YuZmllbGQgIT09IFwiV29ya2Zsb3dFdGF0XCIpO1xyXG4gICAgdGhpcy5zZWFyY2hGaWVsZHM/LnB1c2goe1xyXG4gICAgICBmaWVsZDogXCJXb3JrZmxvd0V0YXRcIixcclxuICAgICAgdmFsdWU6IGV2dCxcclxuICAgICAgbGFiZWxWYWx1ZTogJycsXHJcbiAgICAgIHR5cGU6IElucHV0VHlwZXMuQ09NQk9CT1gsXHJcbiAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvclR5cGUuRVFVQUwsXHJcbiAgICAgIHN0eWxlQ2xhc3M6IFwiaGlkZGVuXCJcclxuICAgIH0pO1xyXG4gICAgdGhpcy50ZW1wU2VhcmNoRmllbGRzID0gdGhpcy5zZWFyY2hGaWVsZHMgPz8gdGhpcy50ZW1wU2VhcmNoRmllbGRzXHJcbiAgfVxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICBvbkRyb3AoZXZlbnQ6IERyYWdFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uLCBpdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xyXG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGUudGFyZ2V0Py5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XHJcbiAgICAgIGlmICghYXJyYXlCdWZmZXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSB0aGlzLmFycmF5QnVmZmVyVG9CYXNlNjQoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgY29uc3QgZmljaGllclRvU2VuZCA9IG5ldyBGaWNoaWVyKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGF0ZUZpY2hpZXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbSA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5vYmpldCA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm5vbUZpY2hpZXJDb21wbGV0ID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRlc2NyaXB0aW9uID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuY29udGVudSA9IGJhc2U2NENvbnRlbnQ7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQudGFibGVMaWVlID0gdGhpcy5idXNpbmVzc0NsYXNzO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnBrZXkgPSBpdGVtLnVpZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlLmNyZWF0ZShmaWNoaWVyVG9TZW5kKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MoXCJmaWNoaWVyX2pvaW50XCIpO1xyXG4gICAgICAgICAgdGhpcy5vblNhdmUuZW1pdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgfVxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUwLFxyXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnTGVhdmUoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQtLTtcclxuXHJcbiAgICBpZiAodGhpcy5kcmFnRW50ZXJDb3VudCA8PSAwKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRyYWdFbnRlckNvdW50ID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICB4OiBldmVudC5jbGllbnRYICsgNTAsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyAzMCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkNvbmZpcm1TZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvblxyXG4gICAgICB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbilcclxuICAgICAgfHwgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIHRoaXMuX3JlZj8uY2xvc2UoW10pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNlbGVjdGlvbjogYW55W10gPSBbXTtcclxuICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgc2VsZWN0aW9uID0gIHRoaXMuc2VsZWN0aW9uLm1hcChpID0+IGlbdGhpcy5rZXldKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgbGV0IGRyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQ6IERyb3Bkb3duRXh0ZXJuYWxTZWxlY3Rpb25PdXRwdXQgPSB7XHJcbiAgICAgIGl0ZW1LZXlQcm9wZXJ0eU5hbWU6IHRoaXMua2V5LFxyXG4gICAgICBpdGVtczogc2VsZWN0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX3JlZj8uY2xvc2UoZHJvcGRvd25FeHRlcm5hbFNlbGVjdGlvbk91dHB1dCk7XHJcbiAgfVxyXG5cclxuICBvbkNhbmNlbFNlbGVjdGlvbigpIDogdm9pZCB7XHJcbiAgICBpZighdGhpcy5fcmVmKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fcmVmLmNsb3NlKFtdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEoKSA6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgIGlmKCF0aGlzLmNvbmZpZz8uZGF0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNvbmZpZ0RhdGE6IGFueSA9IHRoaXMuY29uZmlnLmRhdGE7XHJcblxyXG4gICAgaWYgKCdpc0FkdmFuY2VkU2VhcmNoJyBpbiBjb25maWdEYXRhKSB7XHJcbiAgICAgIHRoaXMuaXNBZHZhbmNlZFNlYXJjaCA9IGNvbmZpZ0RhdGEuaXNBZHZhbmNlZFNlYXJjaCA/PyBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoJ3NlbGVjdGlvbk1vZGUnIGluIGNvbmZpZ0RhdGEpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gY29uZmlnRGF0YS5zZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgnc2VsZWN0S2V5T25seScgaW4gY29uZmlnRGF0YSkge1xyXG4gICAgICB0aGlzLnNlbGVjdEtleU9ubHkgPSBjb25maWdEYXRhLnNlbGVjdEtleU9ubHk7XHJcbiAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyb3IpXHJcbiAgICB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VyZWQgYXQgZXh0cmFjdERpYWxvZ0NvbmZpZ0RhdGEgOiAnLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImdyaWRcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtAc2xpZGVJbk91dF09XCJzaG93U2VhcmNoRmllbGQgPyAnaW4nIDogJ291dCdcIiAqbmdJZj1cInNob3dHbG9iYWxTZWFyY2hcIj5cclxuICAgIDx0c2ktc2VhcmNoLWJveCBcclxuICAgICAgW2lzUnRsTW9kZV09XCJpc1J0bE1vZGVcIiBcclxuICAgICAgWyhzZWFyY2hGaWVsZHMpXT1cInNlYXJjaEZpZWxkc1wiIFxyXG4gICAgICBbYnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCJcclxuICAgICAgW2VudGl0eUluZm9dPVwiZW50aXR5SW5mb1wiXHJcbiAgICAgIFtzdGF0dXNNZXRhZGF0YV09XCJzdGF0dXNNZXRhZGF0YVwiXHJcbiAgICAgIFtkZXNjcmltaW5hdG9yVmFsdWVdPVwiZGVzY3JpbWluYXRvclZhbHVlXCJcclxuICAgICAgKHNlYXJjaEZpZWxkc0NoYW5nZSk9XCJzZWFyY2hGaWVsZHNWYWx1ZUNoYW5nZXMoJGV2ZW50KVwiIFxyXG4gICAgICAoa2V5d29yZFZhbHVlQ2hhbmdlZCk9XCJrZXl3b3JkVmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAoc2VhcmNoRmllbGRzQXBwbGllZCk9XCJzZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgIChzdGF0dXNGaWx0ZXJDaGFuZ2VkKT1cIm9uU3RhdHVzRmlsdGVyQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgKHdvcmtmbG93RXRhdEZpbHRlckNoYW5nZWQpPVwib25Xb3JrZmxvd0V0YXRGaWx0ZXJDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAoY29tYm9Cb3hMYWJlbENoYW5nZWQpPVwiY29tYm9Cb3hMYWJlbENoYW5nZWQoJGV2ZW50KVwiPlxyXG4gICAgPC90c2ktc2VhcmNoLWJveD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93Q2FsZW5kZXJWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0NhcmRWaWV3ID09PSBmYWxzZSAmJiBfc2hvd0thbmJhblZpZXcgPT09IGZhbHNlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIFxyXG4gICAgPHAtdGFibGUgI2R0IFxyXG4gICAgICBbbGF6eV09XCJpc0dyaWREYXRhUGFnZWRJbkFwaVwiIFxyXG4gICAgICBbbGF6eUxvYWRPbkluaXRdPVwic2VhcmNoT25Jbml0XCIgXHJcbiAgICAgIFt0b3RhbFJlY29yZHNdPVwicGFnZS50b3RhbENvdW50XCIgXHJcbiAgICAgIFtsb2FkaW5nXT1cInBhZ2UubG9hZGluZ1wiIFxyXG4gICAgICBbcmVvcmRlcmFibGVDb2x1bW5zXT1cInRydWVcIlxyXG4gICAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCIgXHJcbiAgICAgIFtjb2x1bW5zXT1cInNlbGVjdGVkQ29sdW1uc1wiIFxyXG4gICAgICBbdmFsdWVdPVwicGFnZS5pdGVtc1wiXHJcbiAgICAgIFtwYWdpbmF0b3JdPVwidHJ1ZVwiIFxyXG4gICAgICBbc2Nyb2xsYWJsZV09XCJ0cnVlXCIgXHJcbiAgICAgIFsocm93cyldPVwicGFnZS5wYWdlU2l6ZVwiXHJcbiAgICAgIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiIFxyXG4gICAgICBbZ2xvYmFsRmlsdGVyRmllbGRzXT1cImZpZWxkcygpXCIgXHJcbiAgICAgIFt0YWJsZVN0eWxlXT1cInsgJ21pbi13aWR0aCc6ICc1MHJlbScgfVwiXHJcbiAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEsIDEwLCAyNSwgNTBdXCIgXHJcbiAgICAgIFtzb3J0TW9kZV09XCJzb3J0TW9kZVwiXHJcbiAgICAgIFttdWx0aVNvcnRNZXRhXT1cInNvcnRNZXRhc1wiIFxyXG4gICAgICBbc2VsZWN0QWxsXT1cInNlbGVjdEFsbFwiXHJcbiAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIiBcclxuICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGlvblwiIFxyXG4gICAgICAob25MYXp5TG9hZCk9XCJsYXp5TG9hZCgkZXZlbnQpXCJcclxuICAgICAgKG9uUm93VW5zZWxlY3QpPVwib25TZWxlY3RlZEl0ZW1zQ2hhbmdlZCgpXCJcclxuICAgICAgKHNlbGVjdEFsbENoYW5nZSk9XCJvblNlbGVjdEFsbENoYW5nZSgkZXZlbnQpXCIgXHJcbiAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdGVkSXRlbXNDaGFuZ2VkKClcIlxyXG4gICAgICBjb2x1bW5SZXNpemVNb2RlPVwiZXhwYW5kXCIgXHJcbiAgICAgIGRhdGFLZXk9XCJ7eyBrZXkgfX1cIiBcclxuICAgICAgc2Nyb2xsSGVpZ2h0PVwiNjAwcHhcIiBcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLWdyaWRsaW5lc1wiIFxyXG4gICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie3sgJ1Nob3dpbmcnIHwgbG9jYWxpemUgfX0ge3tnZXRGaXJzdEVsZW1lbnRJbmRleCgpfX0ge3tcclxuICAgICAgICAndG8nIHwgbG9jYWxpemVcclxuICAgICAgfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSBcclxuICAgICAge3RvdGFsUmVjb3Jkc30ge3sgJ2VudHJpZXMnIHwgbG9jYWxpemUgfX1cIiBcclxuICAgICAgPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yXCI+XHJcbiAgICAgICAgICAgIHt7IGhlYWRlciB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xIGZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyQnV0dG9uXCIgcHJlc2VudGF0aW9uRGVzaWduZXJCYXNlPVwiZ3JpZF90b2dnbGVfaGVhZGVyX2ZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBbaWNvbl09XCJmaWx0ZXJJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgW3Rvb2x0aXBUZXh0XT1cImZpbHRlclRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVycygpXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVhZGVyRmlsdGVyc1wiIHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfdG9nZ2xlX2hlYWRlcl9maWx0ZXJfbW9kZVwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtpY29uXT1cImZpbHRlck1vZGVJY29uXCIgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwVGV4dF09XCJmaWx0ZXJNb2RlVG9vbHRpcFwiIFtzdHlsZUNsYXNzXT1cIidtbC0xIHAtYnV0dG9uLXByaW1hcnkgcC1idXR0b24taWNvbi1vbmx5J1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlSGVhZGVyRmlsdGVyc01vZGUoKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IHByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZT1cImdyaWRfY2xlYXJfZmlsdGVyX2J1dHRvblwiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCInaWNvbi1jbGVhci1maWx0ZXInXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJtbC0xIHAtZWxlbWVudCBob3ZlcjpzaGFkb3ctNiBwLWJ1dHRvbi1wcmltYXJ5IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGVhckZpbHRlcnMoKVwiIFtpY29uU3JjXT1cIidhc3NldHMvbGF5b3V0L2ltYWdlcy9pY29uL2ljb24tY2xlYXItZmlsdGVyLnN2ZydcIj5cclxuICAgICAgICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIiBwcmVzZW50YXRpb25EZXNpZ25lckJhc2U9XCJncmlkX2V4cG9ydF9idXR0b25cIj5cclxuICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1maWxlLWV4Y2VsXCIgKG9uQ2xpY2spPVwiZXhwb3J0RXhjZWwoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXN1Y2Nlc3MgaG92ZXI6c2hhZG93LTYgbWwtMiBwLTEgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwiWExTXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IGNsYXNzPVwibWwtMVwiIFtvcHRpb25zXT1cImNvbHVtbnNcIiBbbmdNb2RlbF09XCJzZWxlY3RlZENvbHVtbnNcIiBvcHRpb25MYWJlbD1cInRyYW5zbGF0ZWRIZWFkZXJcIlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSB7eyAnY29sdW1uc19zZWxlY3RlZCcgfCBsb2NhbGl6ZSB9fVwiIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMTgwcHgnIH1cIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWxlY3RlZENvbHVtbnNDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIDxkaXY+IC0tPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2hvd0dsb2JhbFNlYXJjaFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNlYXJjaFwiIChjbGljayk9XCJzZWFyY2goKVwiPjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0aCBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBnZXRDaGVja2JveFN0eWxlKCkgOiB7fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICd6LTEnXCIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cIiEoY29sLmlzQnV0dG9uICYmIGNvbC5hY3Rpb25EaXNwbGF5ID09IGFjdGlvblBsYWNlbWVudC5PdmVyZmxvdylcIlxyXG4gICAgICAgICAgICAgIHNjb3BlPVwiY29sXCIgW3N0eWxlXT1cImNvbC5zdHlsZVwiIHBUb29sdGlwPVwie3sgY29sLnRvb2xUaXBUZXh0IHwgbG9jYWxpemUgfX1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiKCFjb2wuaXNCdXR0b24gfHwgIWlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKSB8fCAhKGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5JTUFHRV9ESVNQTEFZKSkgPyBcclxuICAgICAgICAgICAgICBjb2wuZmllbGQgOiBudWxsXCJcclxuICAgICAgICAgICAgICBbcFJlc2l6YWJsZUNvbHVtbkRpc2FibGVkXT1cImNvbC5pc0J1dHRvbiB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVkgfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cImNvbC5pc0J1dHRvbiB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZClcIiBcclxuICAgICAgICAgICAgICBbcFJlb3JkZXJhYmxlQ29sdW1uRGlzYWJsZWRdPVwiY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKVwiIHBSZW9yZGVyYWJsZUNvbHVtblxyXG4gICAgICAgICAgICAgIHBSZXNpemFibGVDb2x1bW4gW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLmhlYWRlckNvbHVtblN0eWxlIDoge31cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZC1jb2x1bW5dPVwiY29sLmlzQnV0dG9uIHx8IGlzT3ZlcmZsb3dDb2x1bW4oY29sLmZpZWxkKSB8fCBjb2wudHlwZSA9PT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVlcIiBcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJbXHJcbiAgICAgICAgICAgICAgICBnZXRIZWFkZXJDbGFzc0NvbG9yKGNvbC50eXBlKSxcclxuICAgICAgICAgICAgICAgIChjb2wuaXNCdXR0b24gfHwgaXNPdmVyZmxvd0NvbHVtbihjb2wuZmllbGQpKSA/ICd3LTFyZW0nIDogJycsXHJcbiAgICAgICAgICAgICAgICAoY29sLmlzQnV0dG9uIHx8IGNvbC50eXBlID09PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWSB8fCBpc092ZXJmbG93Q29sdW1uKGNvbC5maWVsZCkpID8gJ25vbi1yZXNpemFibGUtY29sdW1uJyA6ICcnLFxyXG4gICAgICAgICAgICAgICAgXVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLmhlYWRlckNvbHVtblN0eWxlIDoge31cIj5cclxuXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdEluU3BlY2lmaWVkQ29sdW1uKGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJwLTAgbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY29sIHAtMCBtLTBcIiBbbmdDbGFzc109XCJ7J3ctMXJlbSc6IGNvbC5pc0J1dHRvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2wuaGVhZGVyIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjb2wtZml4ZWQgcC0wIG0tMFwiIHN0eWxlPVwid2lkdGg6IDFyZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wudHlwZSAhPT0gZGlzcGxheVR5cGVzLklNQUdFX0RJU1BMQVlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xcmVtIG0tMCBwLTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkPVwie3sgY29sLmZpZWxkIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgPHRyICpuZ0lmPVwic2hvd0hlYWRlckZpbHRlcnNcIj5cclxuICAgICAgICAgIDwhLS0gPHRoIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJ3aWR0aDozcmVtXCI+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJ3aWR0aDozcmVtXCI+PC90aD4gLS0+XHJcbiAgICAgICAgICA8dGggW25nQ2xhc3NdPVwicGFnZS5sb2FkaW5nID8gJ25vLXotaW5kZXgnIDogJydcIiAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIj48L3RoPlxyXG4gICAgICAgICAgPHRoIHN0eWxlPVwib3ZlcmZsb3c6IGluaGVyaXRcIiBzY29wZT1cImNvbFwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXIgW3R5cGVdPVwiY29sLmZpbHRlcklucHV0VHlwZVwiIFtmaWVsZF09XCJjb2wuZmllbGRcIiBbZGlzcGxheV09XCJjaGFuZ2VIZWFkZXJGaWx0ZXJzTW9kZVwiXHJcbiAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiY29sLm51bU9mRGVjaW1hbFwiIFtzaG93QnV0dG9uc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW21hdGNoTW9kZV09XCJmaWx0ZXJNYXRjaE1vZGUuRVFVQUxTXCI+XHJcbiAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgXHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1pdGVtIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiIGxldC1pbmRleD1cInJvd0luZGV4XCI+XHJcblxyXG4gICAgICAgIDwhLS0gQ0FTRSA6IG11bHRpcGxlIHNlbGVjdGlvbiAtLT5cclxuICAgICAgICA8dHIgW25nU3R5bGVdPVwiaXRlbS5jb2xvciAmJiBpdGVtLmNvbG9yICE9PSAnJyA/IHsnYmFja2dyb3VuZC1jb2xvcic6IGl0ZW0uY29sb3J9IDoge31cIiAqbmdJZj1cIlxyXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGU7XHJcbiAgICAgICAgICAgIGVsc2Ugbm90TXVsdGlwbGVTZWxlY3Rpb25Nb2RlQmxvY2tcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCxpdGVtKVwiIChkcmFnZW50ZXIpPVwib25EcmFnRW50ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRyYWdsZWF2ZSk9XCJvbkRyYWdMZWF2ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8dGQgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gZ2V0Q2hlY2tib3hTdHlsZSgpIDoge31cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwiaXRlbVwiPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwhLS0gPHRkIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGVuY2lsXCIgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQoaXRlbSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXJcIiAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPiAtLT5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuXHJcbiAgICAgICAgICAgIDx0ZCAgKm5nSWY9XCIhKGNvbC5pc0J1dHRvbiAmJiBjb2wuYWN0aW9uRGlzcGxheSA9PSBhY3Rpb25QbGFjZW1lbnQuT3ZlcmZsb3cpXCIgW25nU3R5bGVdPVwicGFnZS5pdGVtcy5sZW5ndGggPiAwID8gY29sLm5nU3R5bGUgOiB7fVwiIFtuZ0NsYXNzXT1cInBhZ2UubG9hZGluZyA/ICduby16LWluZGV4JyA6ICcnXCJcclxuICAgICAgICAgICAgICA+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gc3R5bGU9XCJoZWlnaHQ6IG1pbi1jb250ZW50OyBtYXJnaW4tbGVmdDogLS41cmVtO1wiIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgLS0+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSBjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNVUlJFTkNZX09USEVSX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5Q29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGF0ZVRpbWVQaWNrZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVUaW1lUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREFURVRJTUVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjaGVja0JveE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCIgW3Nob3dUaW1lXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DSEVDS0JPWF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ2hlY2tib3gtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGludGVnZXJPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXIgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHJhdGVPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheU5lc3RlZFByb3BPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktbmVzdGVkLXByb3AgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5TmVzdGVkUHJvcE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5ORVNURURfUFJPUF9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGlzcGxheVN0YXR1c0NvbG9yQmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktRGlzcGxheS1OZXN0ZWQtUHJvcCBbc291cmNlVXJsXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlTb3VyY2VVcmxcIiBbaWRdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVZhbHVlXT1cImNvbC5kaXNwbGF5TmVzdGVkUHJvcGVydHlsYWJlbEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvVHNpLURpc3BsYXktTmVzdGVkLVByb3A+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNDb2xvckJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbG9yOyBlbHNlIGRpc3BsYXlTdGF0dXNWYWx1ZUNvbHVtbkJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIHJvdW5kZWQgdGV4dC13aGl0ZSB0ZXh0LXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj4gXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNWYWx1ZUNvbHVtbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbHVtblZhbHVlOyBlbHNlIGRpc3BsYXlTdGF0dXNDb2x1bW5CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLTxwLXRhZyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0U3RhdHVzQ29sb3IoaXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWc+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgJiYgZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShpdGVtW2NvbC5maWVsZF0pIGFzIG9wdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwib3B0LmNvbG9ySGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LmNvbG9ySGV4ID8gJ3doaXRlJyA6ICdibGFjaydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtYmxhY2sgYmctd2hpdGUnOiAhb3B0LmNvbG9ySGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC13aGl0ZSc6IG9wdC5jb2xvckhleFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5ICYmICFnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIGZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS1zdGF0dXMtY29sdW1uIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheVN0YXR1c0NvbHVtbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbHVtbjsgZWxzZSBkaXNwbGF5QnV0dG9uQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS08cC10YWcgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZENvbG9yXT1cImdldFN0YXR1c0NvbG9yKGl0ZW1bY29sLmZpZWxkXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPi0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhICYmIGdldFN0YXR1c09wdGlvbihpdGVtW2NvbC5maWVsZF0pIGFzIG9wdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFJlYWRhYmxlVGV4dENvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcF09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LnRyYW5zbGF0ZWRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YSAmJiAhZ2V0U3RhdHVzT3B0aW9uKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheUJ1dHRvbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc0J1dHRvbjsgZWxzZSBkaXNwbGF5VGV4dEV5ZUJsb2NrXCIgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGZyb3plbi1jb2x1bW4tcnRsLW1vZGUganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiAgW3N0eWxlQ2xhc3NdPVwiY29sLnN0eWxlQ2xhc3NcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ7eyBjb2wuYnV0dG9uSWNvbiB9fVwiIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIFt0b29sdGlwVGV4dF09XCJjb2wudG9vbFRpcFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiY29sLmJ1dHRvbkxhYmVsID8gY29sLmJ1dHRvbkxhYmVsIDogaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJidXR0b25DbGlja2VkKGl0ZW0sIGNvbC5maWVsZClcIiA+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgIDwhLS0gZGlzcGxheS10ZXh0LWV5ZSAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlUZXh0RXllQmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlRFWFRfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIG1vcmVBY3Rpb25zQmxvY2tcclxuICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW1bY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSBtb3JlIGFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbW9yZUFjdGlvbnNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmZpZWxkID09IG92ZXJmbG93Q29sdW1uRmllbGQ7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwLW1lbnUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjbWVudU1vcmVBY3Rpb25zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbW9kZWxdPVwib3ZlcmZsb3dBY3Rpb25zTWVudVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJvdmVyZmxvdy1tZW51XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ3dpZHRoJzogJ2F1dG8nLCAnbWluLXdpZHRoJzogJzBweCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cIml0ZW1cIiBsZXQtbWVudUl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmlwcGxlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwLW1lbnVpdGVtLWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uc3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25PdmVyZmxvd0FjdGlvbkNsaWNrZWQoaXRlbSwgbWVudUl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVJdGVtLmlkID09PSAnbm90ZXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBtZW51SXRlbS5pY29uQ2xhc3MgfX0gcC1tZW51aXRlbS1pY29uIGJhZGdlLWljb24gaGFzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFkZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS5ub3Rlc0NvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhZGdlRGlzYWJsZWRdPVwiaXRlbS5ub3Rlc0NvdW50ID09IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVBvc2l0aW9uPVwidG9wLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51SXRlbS5pZCAhPT0gJ25vdGVzJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3ttZW51SXRlbS5pY29uQ2xhc3N9fSBwLW1lbnVpdGVtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5pY29uU3R5bGVDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtZW51SXRlbS5sYWJlbCB8IGxvY2FsaXplIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9wLW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ7e2NvbC5idXR0b25JY29ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ7e2NvbC5zdHlsZUNsYXNzfX0gb3ZlcmZsb3ctYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvdmVyZmxvd0NvbHVtbkNsaWNrZWQobWVudU1vcmVBY3Rpb25zLCAkZXZlbnQsIGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1idXR0b24+ICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuICAgICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0RyYWdPdmVyXCIgW25nU3R5bGVdPVwieyBsZWZ0OiBtZXNzYWdlUG9zaXRpb24ueCArICdweCcsIHRvcDogbWVzc2FnZVBvc2l0aW9uLnkgKyAncHgnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJhZy1tZXNzYWdlIGN1cnNvci1mb2xsb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBcIkpvaW50dXJlXCIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIDwhLS0gQ0FTRSA6IHNpbmdsZSBvciBub25lIHNlbGVjdGlvbiAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vdE11bHRpcGxlU2VsZWN0aW9uTW9kZUJsb2NrPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPHRyIFtuZ1N0eWxlXT1cIml0ZW0uY29sb3IgJiYgaXRlbS5jb2xvciAhPT0gJycgPyB7J2JhY2tncm91bmQtY29sb3InOiBpdGVtLmNvbG9yfSA6IHt9XCJcclxuICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd0luZGV4XT1cImluZGV4XCIgaWQ9XCJ0c2ktZ3JpZC1yb3cte3tpbmRleH19XCI+XHJcblxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiIFtuZ1N0eWxlXT1cInBhZ2UuaXRlbXMubGVuZ3RoID4gMCA/IGNvbC5uZ1N0eWxlIDoge31cIiBcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IG1pbi1jb250ZW50O1wiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAndy0xcmVtJzogY29sLmlzQnV0dG9uLFxyXG4gICAgICAgICAgICAgICAgICAgICdiZy13aGl0ZSc6IGNvbC5pc0J1dHRvblxyXG4gICAgICAgICAgICAgICAgICB9XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxzZSBjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lDb2RlXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLVBpY2tlciAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRhdGVUaW1lUGlja2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVUaW1lUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuREFURVRJTUVfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjaGVja0JveE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCIgW3Nob3dUaW1lXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkNIRUNLQk9YX0RJU1BMQVk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tib3gtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ2hlY2tib3gtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlciAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU5URUdFUl9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJhdGVPdXRwdXRCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRpc3BsYXlOZXN0ZWRQcm9wT3V0cHV0QmxvY2tcclxuICAgICAgICAgICAgICAgICAgICAgIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlOZXN0ZWRQcm9wT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuTkVTVEVEX1BST1BfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkaXNwbGF5U3RhdHVzQ29sb3JCbG9ja1xyXG4gICAgICAgICAgICAgICAgICAgICAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8VHNpLURpc3BsYXktTmVzdGVkLVByb3AgW3NvdXJjZVVybF09XCJjb2wuZGlzcGxheU5lc3RlZFByb3BlcnR5U291cmNlVXJsXCIgW2lkXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5VmFsdWVdPVwiY29sLmRpc3BsYXlOZXN0ZWRQcm9wZXJ0eWxhYmVsRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvVHNpLURpc3BsYXktTmVzdGVkLVByb3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNDb2xvckJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaXNTdGF0dXNDb2xvcjsgZWxzZSBkaXNwbGF5U3RhdHVzVmFsdWVDb2x1bW5CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgcm91bmRlZCB0ZXh0LXdoaXRlIHRleHQtc21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bY29sLmZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNWYWx1ZUNvbHVtbkJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5pc1N0YXR1c0NvbHVtblZhbHVlOyBlbHNlIGRpc3BsYXlTdGF0dXNDb2x1bW5CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxwLXRhZyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0U3RhdHVzQ29sb3IoaXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWc+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdGF0dXNNZXRhZGF0YUZvclN0YXR1c0hpc3RvcnkgJiYgZ2V0U3RhdHVzT3B0aW9uRm9yU3RhdHVzSGlzdG9yeShpdGVtW2NvbC5maWVsZF0pIGFzIG9wdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJweC0yIHB5LTEgZm9udC1ib2xkIHN0YXR1cy1iYWRnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwib3B0LmNvbG9ySGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwib3B0LmNvbG9ySGV4ID8gJ3doaXRlJyA6ICdibGFjaydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtYmxhY2sgYmctd2hpdGUnOiAhb3B0LmNvbG9ySGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC13aGl0ZSc6IG9wdC5jb2xvckhleFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdC50cmFuc2xhdGVkTGFiZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGFGb3JTdGF0dXNIaXN0b3J5ICYmICFnZXRTdGF0dXNPcHRpb25Gb3JTdGF0dXNIaXN0b3J5KGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMiBweS0xIGZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LXN0YXR1cy1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlTdGF0dXNDb2x1bW5CbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzU3RhdHVzQ29sdW1uOyBlbHNlIGRpc3BsYXlCdXR0b25CbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHAtdGFnIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kQ29sb3JdPVwiZ2V0U3RhdHVzQ29sb3IoaXRlbVtjb2wuZmllbGRdKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtdGFnPi0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3RhdHVzTWV0YWRhdGEgJiYgZ2V0U3RhdHVzT3B0aW9uKGl0ZW1bY29sLmZpZWxkXSkgYXMgb3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhdHVzLWJhZGdlIGZvbnQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJsaWdodGVuQ29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0UmVhZGFibGVUZXh0Q29sb3Iob3B0LmNvbG9ySGV4KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy10b3BdPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cIicwLjFyZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQudHJhbnNsYXRlZExhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0YXR1c01ldGFkYXRhICYmICAhZ2V0U3RhdHVzT3B0aW9uKGl0ZW1bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGF0dXMtYmFkZ2UgZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5LW5lc3RlZC1wcm9wIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc3BsYXlCdXR0b25CbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzQnV0dG9uOyBlbHNlIGRpc3BsYXlJbWFnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJwYWdlLml0ZW1zLmxlbmd0aCA+IDAgPyBjb2wubmdTdHlsZSA6IHt9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicGFnZS5sb2FkaW5nID8gJ25vLXotaW5kZXgnIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZyb3plbi1jb2x1bW4tcnRsLW1vZGUganVzdGlmeS1jb250ZW50LWNlbnRlciBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW3N0eWxlQ2xhc3NdPVwiY29sLnN0eWxlQ2xhc3NcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInt7IGNvbC5idXR0b25JY29uIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiBbdG9vbHRpcFRleHRdPVwiY29sLnRvb2xUaXBUZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uQ2xpY2tlZChpdGVtLCBjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjb2wuaXNJY29uQnV0dG9uID8gJycgOiAoY29sLmJ1dHRvbkxhYmVsID8/IGl0ZW1bY29sLmZpZWxkXSlcIj48L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXktaW1hZ2UgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGlzcGxheUltYWdlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuSU1BR0VfRElTUExBWTsgZWxzZSBkaXNwbGF5VGV4dEV5ZUJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0ycmVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0c2ktaW1hZ2UtZGlzcGxheSBbaGVhZGVyVGl0bGVzXT1cImdldEhlYWRlclRpdGxlcyhjb2wuaGVhZGVyVGl0bGVzLCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUm91bmRlZF09XCJjb2wuaXNSb3VuZGVkXCIgW3NyY109XCJpdGVtW2NvbC5maWVsZF1cIiBbYWx0XT1cImNvbC5oZWFkZXIgfHwgJ2ltYWdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzEwMCUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHNpLWltYWdlLWRpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheS10ZXh0LWV5ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNwbGF5VGV4dEV5ZUJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLlRFWFRfRElTUExBWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBtb3JlQWN0aW9uc0Jsb2NrXHJcbiAgICAgICAgICAgICAgICAgICAgICBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHBpIHBpLWV5ZVwiIChjbGljayk9XCJleWVDbGlja2VkKGl0ZW1bY29sLmZpZWxkXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRydW5jYXRlU3RyaW5nKGl0ZW1bY29sLmZpZWxkXSwgNTApIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8IS0tIG1vcmUgYWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtb3JlQWN0aW9uc0Jsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuZmllbGQgPT0gb3ZlcmZsb3dDb2x1bW5GaWVsZDsgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPHAtbWVudSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNtZW51TW9yZUFjdGlvbnMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJvdmVyZmxvd0FjdGlvbnNNZW51XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3B1cF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cIm92ZXJmbG93LW1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyAnd2lkdGgnOiAnYXV0bycsICdtaW4td2lkdGgnOiAnMHB4JyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaXRlbVwiIGxldC1tZW51SXRlbT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHAtbWVudWl0ZW0tbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5zdHlsZUNsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk92ZXJmbG93QWN0aW9uQ2xpY2tlZChpdGVtLCBtZW51SXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibWVudUl0ZW0uaWQgPT09ICdub3RlcydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IG1lbnVJdGVtLmljb25DbGFzcyB9fSBwLW1lbnVpdGVtLWljb24gYmFkZ2UtaWNvbiBoYXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJtZW51SXRlbS5pY29uU3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYWRnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eT1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLm5vdGVzQ291bnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFkZ2VEaXNhYmxlZF09XCJpdGVtLm5vdGVzQ291bnQgPT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlUG9zaXRpb249XCJ0b3AtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm1lbnVJdGVtLmlkICE9PSAnbm90ZXMnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e21lbnVJdGVtLmljb25DbGFzc319IHAtbWVudWl0ZW0taWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVJdGVtLmljb25TdHlsZUNsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1lbnVJdGVtLmxhYmVsIHwgbG9jYWxpemUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3AtbWVudT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInt7Y29sLmJ1dHRvbkljb259fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInt7Y29sLnN0eWxlQ2xhc3N9fSBvdmVyZmxvdy1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm92ZXJmbG93Q29sdW1uQ2xpY2tlZChtZW51TW9yZUFjdGlvbnMsICRldmVudCwgaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWJ1dHRvbj4gIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmb290ZXJcIj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj48L3RkPlxyXG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBzZWxlY3RlZENvbHVtbnNcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwicHItMFwiICpuZ0lmPVwiIShjb2wuaXNCdXR0b24gJiYgY29sLmFjdGlvbkRpc3BsYXkgPT0gYWN0aW9uUGxhY2VtZW50Lk92ZXJmbG93KVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuc2hvd1N1bW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gQ1VSUkVOQ1lfU09DSUVURV9ESVNQTEFZIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0RJU1BMQVlcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJTlRFR0VSX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLklOVEVHRVJfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFJBVEVfRElTUExBWSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBkaXNwbGF5VHlwZXMuUkFURV9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uID8/IGZhbHNlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBERUNJTUFMX0RJU1BMQVkgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gZGlzcGxheVR5cGVzLkRFQ0lNQUxfRElTUExBWVwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGRpc3BsYXlUeXBlcy5DVVJSRU5DWV9PVEhFUl9ESVNQTEFZXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+ICBcclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICBcclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgICB7eyBwYWdlLnRvdGFsQ291bnQgfX0ge3sgXCJyZWNvcmRzX2xhYmVsXCIgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29sb3JmdWxcIj5cclxuICAgICAgICAgIDxzcGFuPlZpZXcgR3JpZDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPnwgU2VhcmNoT25Jbml0IDoge3sgc2VhcmNoT25Jbml0IH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+fCBQYWdpbmF0aW9uIEluIEFwaSA6IHt7IGlzR3JpZERhdGFQYWdlZEluQXBpIH19PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC10YWJsZT5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhbGVuZGVyVmlldyA9PT0gdHJ1ZVwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8dHNpLWNhbGVuZGVyIFtzY2hlbWFdPVwiY2FsZW5kZXJTY2hlbWFcIiBbZXZlbnRzRGF0YV09XCJwYWdlLml0ZW1zXCIgW2NydWRTZXJ2aWNlXT1cImNydWRTZXJ2aWNlXCJcclxuICAgICAgKGRhdGVSYW5nZUNoYW5nZSk9XCJoYW5kbGVEYXRlUmFuZ2VDaGFuZ2UoJGV2ZW50KVwiIChldmVudENsaWNrKT1cImhhbmRsZUNhbGVuZGFyRXZlbnRDbGljaygkZXZlbnQpXCI+PC90c2ktY2FsZW5kZXI+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJfc2hvd0NhcmRWaWV3ID09PSB0cnVlXCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxUc2ktY2FyZC1saXN0IFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgKGNhbGxTZWFyY2gpPVwiY2FsbFNlYXJjaEhhbmRsZXIoJGV2ZW50KVwiPlxyXG4gICAgPC9Uc2ktY2FyZC1saXN0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiX3Nob3dLYW5iYW5WaWV3ID09PSB0cnVlICYmICFfc2hvd0thbmJhblZpZXdPZldvcmtGbG93RXRhdFwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8VHNpLWthbmJhbiBbY2FyZEJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIFtpZF09XCJpZFwiIChidXR0b25DbGlja2VkKT1cImJ1dHRvbkNvbHVtbkNsaWNrZWQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgW3BhZ2UkXT1cInBhZ2UkXCIgW3BhZ2VdPVwicGFnZVwiIChjYWxsU2VhcmNoKT1cImNhbGxTZWFyY2hIYW5kbGVyKCRldmVudClcIiBbY3J1ZFNlcnZpY2VdPVwiY3J1ZFNlcnZpY2VcIj5cclxuICAgIDwvVHNpLWthbmJhbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cIl9zaG93S2FuYmFuVmlldyA9PT0gdHJ1ZSAmJiBfc2hvd0thbmJhblZpZXdPZldvcmtGbG93RXRhdFwiIGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8VHNpLWthbmJhbi13b3JrZmxvdy1ldGF0IFtjYXJkQnVzaW5lc3NDbGFzc109XCJidXNpbmVzc0NsYXNzXCIgW2lkXT1cImlkXCIgKGJ1dHRvbkNsaWNrZWQpPVwiYnV0dG9uQ29sdW1uQ2xpY2tlZC5lbWl0KCRldmVudClcIlxyXG4gICAgICBbcGFnZSRdPVwicGFnZSRcIiBbcGFnZV09XCJwYWdlXCIgW2Rlc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIiAoY2FsbFNlYXJjaCk9XCJjYWxsU2VhcmNoSGFuZGxlcigkZXZlbnQpXCI+XHJcbiAgICA8L1RzaS1rYW5iYW4td29ya2Zsb3ctZXRhdD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiAqbmdJZj1cImlzQWR2YW5jZWRTZWFyY2ggJiYgc2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICA8VHNpLU1vZGFsLUZvb3RlciBbc2hvd1NhdmVBbmRDbG9zZUJ1dHRvbl09XCJmYWxzZVwiIChvblNhdmVDbGljayk9XCJvbkNvbmZpcm1TZWxlY3Rpb24oKVwiIChvbkNhbmNlbENsaWNrKT1cIm9uQ2FuY2VsU2VsZWN0aW9uKClcIiAvPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|