cilog-lib 1.3.3 → 1.3.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.
|
@@ -449,10 +449,10 @@ export class CilogTableComponent {
|
|
|
449
449
|
}
|
|
450
450
|
}
|
|
451
451
|
CilogTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: CilogTableComponent, deps: [{ token: i1.ConfirmationService }, { token: i1.FilterService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
452
|
-
CilogTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: CilogTableComponent, selector: "cilog-table", inputs: { columns: "columns", values: "values", options: "options", loading: "loading" }, outputs: { columnsChange: "columnsChange", valuesChange: "valuesChange", onEdit: "onEdit", onEditInit: "onEditInit", onDelete: "onDelete", onSelect: "onSelect", onUnselect: "onUnselect", onFilter: "onFilter", onFilterInit: "onFilterInit", onSort: "onSort", onPage: "onPage" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }], ngImport: i0, template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScroll != null ? options.virtualScrollItemSize : 60\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [groupRowsByOrder]=\"0\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && (checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"!col.invisible && (checkType('Number', col) || checkType('CilogNumber', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-inputNumber *ngIf=\"!col.disableFilter\"\r\n mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\"\r\n [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotal(col) }}</div>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!--Groupheader-->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.coldiv]=\"columns.length + 1\"\r\n pFrozenColumn>\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOADING BODY -->\r\n <!--<ng-template pTemplate=\"loadingbody\" let-columns=\"columns\">\r\n \r\n <tr style=\"height:41px\">\r\n <td class=\"cellDelete\"\r\n pFrozenColumn\r\n [fozen]=\"col.frozen\"\r\n *ngIf=\"isModeCheckboxSelection()\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td *ngFor=\"let col of columns; let even = even\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td class=\"cellDelete\" *ngIf=\"options.rowsDeletable\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n </tr>\r\n </ng-template>-->\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\" />\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [virtualScrollItemSize]=\"30\"\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n class=\"text-center\"\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\"\r\n pInputText\r\n type=\"text\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\"\r\n [style]=\"{ 'background-color': rowData[col.id].value.backgroundColor, 'color': rowData[col.id].value.textColor }\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:1!important}:host ::ng-deep .p-datatable-thead{z-index:2!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important;width:5%;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "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", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.RowGroupHeader, selector: "[pRowGroupHeader]" }, { kind: "directive", type: i4.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i4.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]" }, { kind: "component", type: i6.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "component", type: i10.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i11.Tag, selector: "p-tag", inputs: ["styleClass", "style", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: i12.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i13.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "directive", type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.CilogInputNumberComponent, selector: "cilog-input-number", inputs: ["min", "max", "maxDecimals", "prefixe", "suffixe", "inputStyleClass"], outputs: ["onInput", "onChange", "onFocus", "onBlur"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
452
|
+
CilogTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: CilogTableComponent, selector: "cilog-table", inputs: { columns: "columns", values: "values", options: "options", loading: "loading" }, outputs: { columnsChange: "columnsChange", valuesChange: "valuesChange", onEdit: "onEdit", onEditInit: "onEditInit", onDelete: "onDelete", onSelect: "onSelect", onUnselect: "onUnselect", onFilter: "onFilter", onFilterInit: "onFilterInit", onSort: "onSort", onPage: "onPage" }, viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true, static: true }], ngImport: i0, template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScroll != null ? options.virtualScrollItemSize : 41\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [groupRowsByOrder]=\"0\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && (checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"!col.invisible && (checkType('Number', col) || checkType('CilogNumber', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-inputNumber *ngIf=\"!col.disableFilter\"\r\n mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\"\r\n [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotal(col) }}</div>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!--Groupheader-->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.coldiv]=\"columns.length + 1\"\r\n pFrozenColumn>\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOADING BODY -->\r\n <!--<ng-template pTemplate=\"loadingbody\" let-columns=\"columns\">\r\n \r\n <tr style=\"height:41px\">\r\n <td class=\"cellDelete\"\r\n pFrozenColumn\r\n [fozen]=\"col.frozen\"\r\n *ngIf=\"isModeCheckboxSelection()\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td *ngFor=\"let col of columns; let even = even\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td class=\"cellDelete\" *ngIf=\"options.rowsDeletable\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n </tr>\r\n </ng-template>-->\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\" />\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [virtualScrollItemSize]=\"30\"\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n class=\"text-center\"\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\"\r\n pInputText\r\n type=\"text\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\"\r\n [style]=\"{ 'background-color': rowData[col.id].value.backgroundColor, 'color': rowData[col.id].value.textColor }\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:1!important}:host ::ng-deep .p-datatable-thead{z-index:2!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important;width:5%;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "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", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i4.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i4.RowGroupHeader, selector: "[pRowGroupHeader]" }, { kind: "directive", type: i4.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i4.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i4.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]" }, { kind: "component", type: i6.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "component", type: i10.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i11.Tag, selector: "p-tag", inputs: ["styleClass", "style", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: i12.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i13.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "directive", type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.CilogInputNumberComponent, selector: "cilog-input-number", inputs: ["min", "max", "maxDecimals", "prefixe", "suffixe", "inputStyleClass"], outputs: ["onInput", "onChange", "onFocus", "onBlur"] }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
453
453
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: CilogTableComponent, decorators: [{
|
|
454
454
|
type: Component,
|
|
455
|
-
args: [{ selector: 'cilog-table', template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScroll != null ? options.virtualScrollItemSize : 60\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [groupRowsByOrder]=\"0\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && (checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"!col.invisible && (checkType('Number', col) || checkType('CilogNumber', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-inputNumber *ngIf=\"!col.disableFilter\"\r\n mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\"\r\n [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotal(col) }}</div>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!--Groupheader-->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.coldiv]=\"columns.length + 1\"\r\n pFrozenColumn>\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOADING BODY -->\r\n <!--<ng-template pTemplate=\"loadingbody\" let-columns=\"columns\">\r\n \r\n <tr style=\"height:41px\">\r\n <td class=\"cellDelete\"\r\n pFrozenColumn\r\n [fozen]=\"col.frozen\"\r\n *ngIf=\"isModeCheckboxSelection()\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td *ngFor=\"let col of columns; let even = even\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td class=\"cellDelete\" *ngIf=\"options.rowsDeletable\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n </tr>\r\n </ng-template>-->\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\" />\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [virtualScrollItemSize]=\"30\"\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n class=\"text-center\"\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\"\r\n pInputText\r\n type=\"text\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\"\r\n [style]=\"{ 'background-color': rowData[col.id].value.backgroundColor, 'color': rowData[col.id].value.textColor }\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:1!important}:host ::ng-deep .p-datatable-thead{z-index:2!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important;width:5%;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}\n"] }]
|
|
455
|
+
args: [{ selector: 'cilog-table', template: "<div [ngStyle]=\"{ 'height': options.scrollHeight != null ? options.scrollHeight : '100%' }\">\r\n <p-table #table\r\n [columns]=\"columns\"\r\n [value]=\"values\"\r\n dataKey=\"id\"\r\n [selectionMode]=\"options.selectable && !isModeCheckboxSelection() ? 'single' : null\"\r\n [(selection)]=\"selectedRows\"\r\n (onRowSelect)=\"onSelectRow($event)\"\r\n (onRowUnselect)=\"onUnselectRow($event)\"\r\n (sortFunction)=\"customSort($event)\"\r\n [customSort]=\"options.grouping == null ? true : false\"\r\n [scrollable]=\"true\"\r\n [loading]=\"loading\"\r\n [scrollHeight]=\"'flex'\"\r\n [rowGroupMode]=\"options.grouping != null ? 'subheader' : null\"\r\n [groupRowsBy]=\"options.grouping != null ? options.grouping.obj + '.' + options.grouping.id : null\"\r\n [virtualScroll]=\"options.virtualScroll == true && options.scrollHeight != null ? true : false\"\r\n [virtualScrollItemSize]=\"options.virtualScroll != null ? options.virtualScrollItemSize : 41\"\r\n [paginator]=\"options.paginator == null ? false : true\"\r\n [rows]=\"options.paginatorRows\"\r\n (onPage)=\"onPageTable($event)\"\r\n [groupRowsByOrder]=\"0\"\r\n [tableStyleClass]=\"!options.themeGrille ? 'grid_grey' : options.themeGrille\"\r\n [lazy]=\"options.lazy == true ? true : false\"\r\n (onFilter)=\"onFilterTable($event)\"\r\n [rowTrackBy]=\"trackByFunction\">\r\n\r\n <!-- HEADER -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <!-- HEADERS -->\r\n <tr class=\"rowHeader\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': col.backgroundColor ? col.backgroundColor : null }\"\r\n [ngClass]=\"{ 'text-center' : options.centerHeaders }\"\r\n [pSortableColumn]=\"col.id\"\r\n [pSortableColumnDisabled]=\"!options.sortable || options.grouping != null || col.libelle == null || col.libelle == ''\"\r\n id=\"{{ col.id }}\"\r\n (click)=\"refreshData()\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div [ngStyle]=\"{ 'color': col.textColor ? col.textColor : null }\">\r\n {{ col.libelle }}\r\n </div>\r\n <p-sortIcon *ngIf=\"options.sortable && options.grouping == null && col.libelle != null && col.libelle != ''\"\r\n [field]=\"col.id\">\r\n </p-sortIcon>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- FILTRES -->\r\n <tr *ngIf=\"options.filterable\" class=\"rowFilter\">\r\n\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n <!-- Text -->\r\n <th *ngIf=\"!col.invisible && (checkType('Text', col) || checkType('File', col) || (checkType('Button', col) && col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <input *ngIf=\"!col.disableFilter\"\r\n pInputText\r\n type=\"text\"\r\n (input)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </th>\r\n\r\n <!-- Date -->\r\n <th *ngIf=\"!col.invisible && checkType('Date', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-calendar *ngIf=\"!col.disableFilter\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n [inputId]=\"col.id + '_filter'\"\r\n firstDayOfWeek=\"1\"\r\n [readonlyInput]=\"true\"\r\n appendTo=\"body\"\r\n selectionMode=\"range\"\r\n (onSelect)=\"onFilterCol($event, col)\"\r\n showButtonBar=\"true\"\r\n (onClearClick)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-calendar>\r\n </th>\r\n\r\n <!-- Number -->\r\n <th *ngIf=\"!col.invisible && (checkType('Number', col) || checkType('CilogNumber', col))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-inputNumber *ngIf=\"!col.disableFilter\"\r\n mode=\"decimal\"\r\n locale=\"fr-FR\"\r\n [minFractionDigits]=\"2\"\r\n [showButtons]=\"true\"\r\n (onInput)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-inputNumber>\r\n </th>\r\n\r\n <!-- Liste -->\r\n <th *ngIf=\"!col.invisible && checkType('Dropdown', col) || checkType('MultiSelect', col) || checkType('SelectButton', col) || checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"col.options?.options\"\r\n [filter]=\"true\"\r\n dataKey=\"ID\"\r\n [optionLabel]=\"col.options?.optionLabel\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScroll]=\"true\"\r\n [virtualScrollItemSize]=\"35\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\"\r\n [group]=\"col.options.optionGroupChildren != null ? true : false\"\r\n [optionGroupLabel]=\"col.options.optionGroupLabel\"\r\n [optionGroupChildren]=\"col.options.optionGroupChildren\"\r\n [showToggleAll]=\"false\"\r\n [showClear]=\"true\"\r\n (onClear)=\"onFilterCol(null, col)\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Switch -->\r\n <th *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <p-multiSelect *ngIf=\"!col.disableFilter\"\r\n [options]=\"optionsSwitch\"\r\n [showHeader]=\"false\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"onFilterCol($event, col)\"\r\n [(ngModel)]=\"col.options.defaultFilters\">\r\n </p-multiSelect>\r\n </th>\r\n\r\n <!-- Non filtrable -->\r\n <th *ngIf=\"!col.invisible && (checkType('Image', col) || (checkType('Button', col) && !col.options.filterCol))\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n\r\n <!-- TOTAL -->\r\n <tr *ngIf=\"options.rowTotal\"\r\n class=\"rowTotal\">\r\n <th class=\"cellDelete\"\r\n *ngIf=\"isModeCheckboxSelection()\"\r\n pFrozenColumn>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns\">\r\n <th *ngIf=\"!col.invisible\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\"\r\n [ngClass]=\"{ 'text-center' : true }\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div>{{ getTotal(col) }}</div>\r\n </th>\r\n </ng-container>\r\n <th class=\"cellDelete\" *ngIf=\"options.rowsDeletable\"></th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!--Groupheader-->\r\n <ng-template pTemplate=\"groupheader\" let-rowData>\r\n <tr pRowGroupHeader class=\"rowGrouping\">\r\n <td [attr.coldiv]=\"columns.length + 1\"\r\n pFrozenColumn>\r\n <div class=\"text_bold\">{{ rowData[options.grouping.obj][options.grouping.libelle] }}</div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- LOADING BODY -->\r\n <!--<ng-template pTemplate=\"loadingbody\" let-columns=\"columns\">\r\n \r\n <tr style=\"height:41px\">\r\n <td class=\"cellDelete\"\r\n pFrozenColumn\r\n [fozen]=\"col.frozen\"\r\n *ngIf=\"isModeCheckboxSelection()\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td *ngFor=\"let col of columns; let even = even\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null }\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n <td class=\"cellDelete\" *ngIf=\"options.rowsDeletable\">\r\n <p-skeleton [ngStyle]=\"{ 'width' : '100%' }\"></p-skeleton>\r\n </td>\r\n </tr>\r\n </ng-template>-->\r\n\r\n <!-- Body -->\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr id=\"{{ rowData.id }}\"\r\n [ngStyle]=\"{ 'background-color': rowData.color ? rowData.color : null }\"\r\n [pSelectableRow]=\"rowData\"\r\n [pSelectableRowDisabled]=\"!options.selectable\">\r\n\r\n <td *ngIf=\"isModeCheckboxSelection()\"\r\n class=\"cellDelete\"\r\n pFrozenColumn>\r\n <p-tableCheckbox [value]=\"rowData\" [disabled]=\"rowData.readonly\"></p-tableCheckbox>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let col of columns\">\r\n\r\n <!-- Text -->\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [pEditableColumn]=\"rowData\"\r\n [pEditableColumnField]=\"col.id\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <input pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n (change)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (keyup.enter)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (click)=\"onEditInitCell(rowData, col, rowData[col.id].value)\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\" />\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Text', col) && (!isModeEdition() || rowData.readonly || rowData[col.id]?.readonly)\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color' : rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"{ 'paddingCell': rowData[col.id] != null }\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value }}</div>\r\n </td>\r\n\r\n <!-- Dropdown -->\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-dropdown *ngIf=\"rowData[col.id] != null\"\r\n dataKey=\"ID\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [autoDisplayFirst]=\"false\"\r\n appendTo=\"body\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [virtualScrollItemSize]=\"30\"\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-dropdown>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Dropdown', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value != null ? rowData[col.id].value[getOption(col, rowData, 'optionLabel')] : '' }}</div>\r\n </td>\r\n\r\n <!-- Cilog Number -->\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <cilog-input-number *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffixe]=\"getOption(col, rowData, 'suffix')\"\r\n [prefixe]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [maxDecimals]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </cilog-input-number>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('CilogNumber', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Number -->\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputNumber *ngIf=\"rowData[col.id] && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n locale=\"fr-FR\"\r\n (onInput)=\"onInputNumber($event)\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [showButtons]=\"getOption(col, rowData, 'showButtons')\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [suffix]=\"getOption(col, rowData, 'suffix')\"\r\n [prefix]=\"getOption(col, rowData, 'prefix') != null ? getOption(col, rowData, 'prefix') + ' ' : null\"\r\n [min]=\"getOption(col, rowData, 'min')\"\r\n [max]=\"getOption(col, rowData, 'max')\"\r\n [minFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'minDecimales') != null ? getOption(col, rowData, 'minDecimales') : 0\"\r\n [maxFractionDigits]=\"getOption(col, rowData, 'modeInteger') != null && getOption(col, rowData, 'modeInteger') == true ? 0 : getOption(col, rowData, 'maxDecimales') != null ? getOption(col, rowData, 'maxDecimales') : 2 \"\r\n (ngModelChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onFocus)=\"onEditInitCell(rowData, col, rowData[col.id].value)\">\r\n </p-inputNumber>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Number', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | number\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getFormattedNumber(col, rowData, rowData[col.id].value) }}</div>\r\n </td>\r\n\r\n <!-- Date -->\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-calendar [(ngModel)]=\"rowData[col.id].value\"\r\n [view]=\"getOption(col, rowData, 'mode') == null ? 'date' : getOption(col, rowData, 'mode')\"\r\n [dateFormat]=\"getOption(col, rowData, 'mode') == 'year' ? 'yy' : getOption(col, rowData, 'mode') == 'month' ? 'mm/yy' : 'dd/mm/yy'\"\r\n firstDayOfWeek=\"1\"\r\n (onSelect)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n (onClear)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n [inputStyleClass]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n [readonlyInput]=\"true\"\r\n [showClear]=\"getOption(col, rowData, 'clear')\"\r\n [minDate]=\"getOption(col, rowData, 'minDate')\"\r\n [maxDate]=\"getOption(col, rowData, 'maxDate')\"\r\n [defaultDate]=\"getOption(col, rowData, 'defaultDate')\"\r\n appendTo=\"body\">\r\n </p-calendar>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('Date', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'min-width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value | date: 'dd/MM/yyyy'\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'right' ? 'text-right' : col.position == 'left' ? 'text-left' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value | date: (getOption(col, rowData, 'mode') == 'year' ? 'yyyy' : getOption(col, rowData, 'mode') == 'month' ? 'MM/yyyy' : 'dd/MM/yyyy') }}</div>\r\n </td>\r\n\r\n <!-- MultiSelect -->\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-multiSelect *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [filter]=\"getOption(col, rowData, 'filter')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n appendTo=\"body\"\r\n dataKey=\"ID\"\r\n emptyFilterMessage=\"Aucun r\u00E9sultat\"\r\n emptyMessage=\"Aucun r\u00E9sultat\"\r\n [baseZIndex]=\"getOption(col, rowData, 'baseZIndex')\"\r\n [virtualScroll]=\"getOption(col, rowData, 'virtualScroll')\"\r\n [readonly]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n [virtualScrollItemSize]=\"30\"\r\n selectedItemsLabel=\"{0} selectionn\u00E9s\"\r\n (onChange)=\"editMultiselect(rowData, col, $event)\"\r\n [showToggleAll]=\"false\"\r\n [showHeader]=\"getOption(col, rowData, 'filter')\"\r\n [group]=\"getOption(col, rowData, 'optionGroupChildren') != null ? true : false\"\r\n [optionGroupLabel]=\"getOption(col, rowData, 'optionGroupLabel')\"\r\n [optionGroupChildren]=\"getOption(col, rowData, 'optionGroupChildren')\"\r\n ngDefaultControl\r\n [styleClass]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\">\r\n <ng-template let-group pTemplate=\"group\">\r\n <div>{{group[col.options.optionGroupLabel]}}</div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('MultiSelect', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel'))\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n [class]=\"col.position == null || col.position == 'left' ? 'text-left' : col.position == 'right' ? 'text-right' : 'text-center'\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getMultiSelectConcat(rowData[col.id].value, getOption(col, rowData, 'optionLabel')) }}</div>\r\n </td>\r\n\r\n <!-- Image -->\r\n <td *ngIf=\"!col.invisible && checkType('Image', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <img *ngIf=\"rowData[col.id]\" style=\"vertical-align: middle; width: 40px;\" src=\"{{ rowData[col.id].value }}\" />\r\n </td>\r\n\r\n <!-- Button -->\r\n <td *ngIf=\"!col.invisible && checkType('Button', col)\"\r\n class=\"paddingCell text-center\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <button pButton\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly\"\r\n [ngClass]=\"'p-button-' + getOption(col, rowData, 'severity')\"\r\n [label]=\"getOption(col, rowData, 'label')\"\r\n [icon]=\"getOption(col, rowData, 'icon')\"\r\n (click)=\"rowData[col.id].value()\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : getOption(col, rowData, 'label')\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n </button>\r\n </td>\r\n\r\n <!-- SelectButton -->\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n class=\"text-center\"\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-selectButton *ngIf=\"rowData[col.id] != null\"\r\n [options]=\"getOption(col, rowData, 'options')\"\r\n [optionLabel]=\"getOption(col, rowData, 'optionLabel')\"\r\n [optionValue]=\"getOption(col, rowData, 'optionValue') != null ? getOption(col, rowData, 'optionValue') : 'value'\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\">\r\n </p-selectButton>\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('SelectButton', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\"\r\n class=\"text-center\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ getSelectLibelleByValue(rowData, col) }}</div>\r\n </td>\r\n\r\n <!-- Switch -->\r\n <td *ngIf=\"!col.invisible && checkType('Switch', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n class=\"text-center\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-inputSwitch *ngIf=\"rowData[col.id] != null\"\r\n [(ngModel)]=\"rowData[col.id].value\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || (getOption(col, rowData, 'action') == null && !isModeEdition())\"\r\n (onChange)=\"onEditCell(rowData, col, rowData[col.id].value)\"\r\n ngDefaultControl>\r\n </p-inputSwitch>\r\n </td>\r\n\r\n <!-- File -->\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && isModeEdition() && !rowData.readonly && !rowData[col.id]?.readonly\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div class=\"p-inputgroup\" *ngIf=\"rowData[col.id] != null\">\r\n <button type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-upload\"\r\n (click)=\"clickById('input_' + rowData[col.id].id)\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n <input id=\"{{'output_' + rowData[col.id].id}}\"\r\n pInputText\r\n type=\"text\"\r\n value=\"{{ rowData[col.id].value != null ? rowData[col.id].value : '' }}\"\r\n readonly\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\">\r\n <button *ngIf=\"getOption(col, rowData, 'downloadPath') && rowData[col.id].value != null\"\r\n type=\"button\"\r\n pButton\r\n pRipple\r\n icon=\"pi pi-download\"\r\n (click)=\"downloadFile(rowData[col.id])\"\r\n [disabled]=\"rowData.readonly || rowData[col.id]?.readonly || !isModeEdition()\">\r\n </button>\r\n </div>\r\n <input *ngIf=\"rowData[col.id]\" id=\"{{'input_' + rowData[col.id].id}}\" #inputFile pInputText type=\"file\" hidden (change)=\"rowData[col.id].value = inputFile.files[0].name; onEditCell(rowData, col, inputFile.files[0])\">\r\n </td>\r\n <td *ngIf=\"!col.invisible && checkType('File', col) && (rowData.readonly || rowData[col.id]?.readonly || !isModeEdition())\"\r\n [ngStyle]=\"{\r\n 'width' : col.width ? col.width : null,\r\n 'background-color': rowData[col.id].color ? rowData[col.id].color : null,\r\n 'color' : rowData[col.id].textColor ? rowData[col.id].textColor : null\r\n }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n [pTooltip]=\"rowData[col.id].tooltip != null ? rowData[col.id].tooltip : rowData[col.id].value ? rowData[col.id].value : ''\"\r\n [tooltipDisabled]=\"!col.tooltip\"\r\n tooltipPosition=\"bottom\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <div *ngIf=\"rowData[col.id]\">{{ rowData[col.id].value ? rowData[col.id].value : '' }}</div>\r\n </td>\r\n\r\n <!-- State -->\r\n <td *ngIf=\"!col.invisible && checkType('State', col)\"\r\n [ngStyle]=\"{ 'width' : col.width ? col.width : null, 'background-color': rowData[col.id].color ? rowData[col.id].color : null }\"\r\n id=\"{{ rowData[col.id] != null ? rowData[col.id].id : '' }}\"\r\n [ngClass]=\"rowData[col.id] != null ? 'paddingCell' : null\"\r\n class=\"text-center\"\r\n pFrozenColumn\r\n [frozen]=\"col.frozen\">\r\n <div class=\"p-column-title\">{{ col.libelle }} : </div>\r\n <p-tag *ngIf=\"rowData[col.id].value != null\"\r\n [value]=\"rowData[col.id].value[getOption(col, rowData, 'optionLabel')]\"\r\n [severity]=\"rowData[col.id].value.severity\"\r\n [icon]=\"rowData[col.id].value.icon\"\r\n [style]=\"{ 'background-color': rowData[col.id].value.backgroundColor, 'color': rowData[col.id].value.textColor }\">\r\n </p-tag>\r\n </td>\r\n\r\n </ng-container>\r\n\r\n <!-- Deletion -->\r\n <td *ngIf=\"options.rowsDeletable\"\r\n class=\"cellDelete\"\r\n [ngClass]=\"rowData.deletable ? 'paddingCell' : null\">\r\n <button *ngIf=\"rowData.deletable\"\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n class=\"p-button-danger buttonDelete p-button-text\"\r\n [disabled]=\"rowData.readonly\"\r\n (click)=\"onDeleteLine(rowData)\">\r\n </button>\r\n </td>\r\n\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n</div>\r\n", styles: ["::ng-deep .p-tooltip .p-tooltip-text{overflow-wrap:break-word!important}:host ::ng-deep .grid_brown .rowHeader>th{background-color:#795548}:host ::ng-deep .grid_brown .rowHeader>th div{color:#fff}:host ::ng-deep .grid_brown .rowHeader>th i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover{background-color:#a47767}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column:hover i{color:#fff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight div{color:#76c7ff}:host ::ng-deep .grid_brown .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#76c7ff}:host ::ng-deep .grid_brown .rowFilter th{background-color:#795548}:host ::ng-deep .grid_grey .rowHeader>th{background-color:#dedddd}:host ::ng-deep .grid_grey .rowHeader>th div{color:#495057}:host ::ng-deep .grid_grey .rowHeader>th i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover{background-color:#e7e7e7}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column:hover i{color:#495057}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight div{color:#008bff}:host ::ng-deep .grid_grey .rowHeader .p-sortable-column.p-highlight .p-sortable-column-icon{color:#008bff}:host ::ng-deep .grid_grey .rowFilter th{background-color:#dedddd}:host ::ng-deep .p-frozen-column{z-index:1!important}:host ::ng-deep .p-datatable-thead{z-index:2!important}:host ::ng-deep .p-checkbox{border-radius:inherit!important}:host ::ng-deep p-inputnumber{width:100%}:host ::ng-deep .p-calendar,:host ::ng-deep .p-inputtext,:host ::ng-deep .p-inputnumber,:host ::ng-deep .p-inputnumber-input,:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{width:100%}:host ::ng-deep .p-multiselect-label-container,:host ::ng-deep .p-dropdown-label{width:1px!important}:host ::ng-deep .p-scroller-content{min-height:50%}:host ::ng-deep .rowTotal>th{background-color:#edcbaa!important}:host ::ng-deep .rowGrouping{background:#faeada!important}:host ::ng-deep .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:#30e130}:host ::ng-deep .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:#2bd12b}:host ::ng-deep .p-datatable-table{table-layout:fixed;min-width:50rem}:host ::ng-deep .p-datatable-thead>tr>th{border:1px solid rgba(0,0,0,.12)!important;padding:8px;font-weight:600;height:40px}:host ::ng-deep .p-datatable-thead>tr>th div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td{border:1px solid rgba(0,0,0,.12)!important;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-datatable-tbody>tr>td div{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-tag{max-width:100%}:host ::ng-deep .p-tag .p-tag-value{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host ::ng-deep .p-button{padding:5px;max-width:100%}:host ::ng-deep .p-button .p-button-label{overflow:hidden!important;white-space:nowrap!important;text-overflow:ellipsis!important}:host ::ng-deep .text_bold{font-weight:700!important}:host ::ng-deep .cellDelete{flex:0 0 50px!important;width:5%;text-align:center!important;padding:0!important}:host ::ng-deep .p-tooltip .p-tooltip-text{background-color:red!important}:host ::ng-deep .p-skeleton{background-color:#dee2e6;border-radius:6px;padding:0}:host ::ng-deep .p-datatable-tbody>tr{height:35px}:host ::ng-deep .p-inputtext{height:25px!important;padding:4px 5px!important}:host ::ng-deep .p-inputnumber{height:25px;padding:0!important}:host ::ng-deep .p-inputnumber-input{padding:0 5px!important}:host ::ng-deep .p-inputgroup .p-inputtext{height:25px;padding:4px 5px!important}:host ::ng-deep .p-dropdown,:host ::ng-deep .p-multiselect{vertical-align:middle}:host ::ng-deep .p-dropdown-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-multiselect-label{padding-top:2px;padding-bottom:2px}:host ::ng-deep .p-editable-column{padding:3px 10px!important}:host ::ng-deep .paddingCell{padding:3px 10px!important}:host ::ng-deep .p-selectbutton>.p-button{width:50%;height:25px}:host ::ng-deep .p-inputgroup>.p-button{height:25px}:host ::ng-deep .buttonDelete{width:100%;height:20px}:host ::ng-deep .p-column-title{display:none}:host ::ng-deep .p-datatable-loading-icon{color:#fff}\n"] }]
|
|
456
456
|
}], ctorParameters: function () { return [{ type: i1.ConfirmationService }, { type: i1.FilterService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { columns: [{
|
|
457
457
|
type: Input
|
|
458
458
|
}], columnsChange: [{
|
|
@@ -487,4 +487,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
|
|
|
487
487
|
type: ViewChild,
|
|
488
488
|
args: ['table', { static: true }]
|
|
489
489
|
}] } });
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFlLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT3RGLE1BQU0sT0FBTyxtQkFBbUI7SUErQjVCLFlBQ1ksbUJBQXdDLEVBQ3hDLGFBQTRCLEVBQzVCLEtBQXdCO1FBRnhCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFoQ3BDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFHakIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRzlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUsxQyxXQUFNLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDOUQsZUFBVSxHQUEyQixJQUFJLFlBQVksRUFBWSxDQUFDO1FBQ2xFLGFBQVEsR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDeEUsYUFBUSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3BFLGVBQVUsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN0RSxhQUFRLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDOUQsaUJBQVksR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNoRSxXQUFNLEdBQXdCLElBQUksWUFBWSxFQUFTLENBQUM7UUFDeEQsV0FBTSxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO0lBYzlELENBQUM7SUFFTCxRQUFRO1FBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNqQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtZQUM3QixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtTQUNqQyxDQUFBO1FBRUQsT0FBTztRQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzVELElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDaEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELElBQUksS0FBSyxHQUFXLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxJQUFJLEdBQVcsQ0FBQztZQUNoQixJQUFJLE9BQWEsQ0FBQztZQUNsQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDWCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUN0RztpQkFBTTtnQkFDSCxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUN0RztZQUNELEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQztRQUNyRyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87UUFDUCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdkQsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZDLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNwQixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pELElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDaEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ3BCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVE7UUFDUixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVE7UUFDUixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEQsSUFBSSxFQUFFLEdBQVksS0FBSyxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7b0JBQy9CLEVBQUUsR0FBRyxJQUFJLENBQUM7aUJBQ2I7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxTQUFTO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUV6RCxJQUFJLGNBQWMsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUQsSUFBSSxpQkFBaUIsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFFbEUsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtnQkFDckYsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUVELElBQUksaUJBQWlCLElBQUksSUFBSSxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQ2hGO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7YUFDNUg7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7Z0JBQ3JCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDMUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxFQUFFO2dCQUMxRSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO3dCQUNqQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzdCLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0NBQy9ELEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNyQzt3QkFDTCxDQUFDLENBQUMsQ0FBQztxQkFDTjt5QkFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTt3QkFDckMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRTs0QkFDekcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDbEQ7cUJBQ0o7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25KO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFO2dCQUNoQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTtvQkFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMxRTthQUNKO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBSztRQUNmLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFLO0lBRW5CLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBb0I7UUFDekIsMEVBQTBFO0lBQzlFLENBQUM7SUFFRCxPQUFPO0lBQ1AsVUFBVSxDQUFDLEtBQVU7UUFDakIsSUFBSSxHQUFHLEdBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ3JELElBQUksT0FBTyxHQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDaEMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUNYLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSTtnQkFDckMsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDVixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUk7Z0JBQ3JDLE1BQU0sR0FBRyxDQUFDLENBQUM7aUJBQ1YsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUk7Z0JBQ3ZELE1BQU0sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JMO2lCQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7Z0JBQ25HLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9IO2lCQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQzdELE1BQU0sR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvRDtpQkFBTSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTTtnQkFDaEMsTUFBTSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRW5ELE1BQU0sSUFBSSxDQUFDLENBQUM7WUFFaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQWUsRUFBRSxHQUFZO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQVU7UUFDaEIsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVMsRUFBRSxNQUFlLEVBQUUsS0FBVTtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNoRTtJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBUyxFQUFFLE1BQWUsRUFBRSxLQUFLO1FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JKLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBUztRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBUztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFTO1FBQ2xCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO2FBQU07WUFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDO2dCQUM3QixHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsa0RBQWtEO2dCQUMzRCxNQUFNLEVBQUUsR0FBRyxFQUFFO29CQUNULElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDckMsQ0FBQzthQUNKLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFTLEVBQUUsTUFBZSxFQUFFLEtBQVU7UUFDakQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFjO1FBQzlCLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDNUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ3JDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEM7U0FDSjtRQUNELElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUNwQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUM3QixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDN0I7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsS0FBYTtRQUNyQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5RDthQUFNO1lBQ0gsT0FBTyxFQUFFLENBQUM7U0FDYjtJQUNMLENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsR0FBRztRQUM1QixJQUFJLEtBQUssR0FBVyxFQUFFLENBQUM7UUFDdkIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDM0IsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUM3QixLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3ZIO2FBQU07WUFDSCxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUNyQixLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUN2RztTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFZO1FBQ3ZCLGdCQUFnQjtRQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUMxQixPQUFPLGlCQUFpQixDQUFDO1NBQzVCO1FBQ0QsU0FBUztRQUNULElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzVCLE9BQU8sY0FBYyxDQUFDO1NBQ3pCO1FBQ0QsUUFBUTtRQUNSLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDL0YsT0FBTyxhQUFhLENBQUM7U0FDeEI7UUFDRCxRQUFRO1FBQ1IsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDakMsT0FBTyxhQUFhLENBQUM7U0FDeEI7UUFDRCxRQUFRO1FBQ1IsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3RELE9BQU8sWUFBWSxDQUFDO1NBQ3ZCO1FBQ0QsU0FBUztRQUNULElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzVCLE9BQU8sY0FBYyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBWTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN2QixJQUFJLEtBQVUsQ0FBQztRQUVmLGdCQUFnQjtRQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtZQUMxQixLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDOUM7UUFDRCxTQUFTO1FBQ1QsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDNUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsUUFBUTtRQUNSLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDL0YsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztTQUMxQztRQUNELFFBQVE7UUFDUixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUNqQyxLQUFLLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztTQUMxQztRQUNELFFBQVE7UUFDUixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdEQsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztTQUN6QztRQUNELFNBQVM7UUFDVCxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUM1QixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDM0M7UUFDRCxTQUFTO1FBQ1QsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDNUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7SUFDOUYsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFZLEVBQUUsR0FBUSxFQUFFLE1BQWM7UUFFekMsOEhBQThIO1FBQzlILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDbEU7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQix3Q0FBd0M7SUFDNUMsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUN6SSxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVk7UUFDakIsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNoRCxJQUFJLE1BQU0sR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDeEUsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO2FBQ3JDO1lBQ0QsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO29CQUNwQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUU7d0JBQy9GLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUU7NEJBQ3RGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNoRTtxQkFDSjt5QkFBTTt3QkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDaEU7aUJBQ0o7cUJBQU07b0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2hFO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0RTthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsT0FBYSxFQUFFLEtBQWEsRUFBRSxRQUFpQixLQUFLO1FBRWpGLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNmLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILElBQUksVUFBVSxHQUFhLEVBQUUsQ0FBQztZQUU5QixVQUFVO1lBQ1YsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUNoRCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsU0FBUztZQUNULElBQUksS0FBSyxFQUFFO2dCQUNQLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzFHO2lCQUFNO2dCQUNILElBQUksWUFBb0IsQ0FBQztnQkFDekIsSUFBSSxZQUFvQixDQUFDO2dCQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBQ3RELFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7aUJBQy9EO2dCQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFJLElBQUksRUFBRTtvQkFDdEQsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztpQkFDL0Q7Z0JBQ0QsZ0RBQWdEO2dCQUNoRCxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQzthQUNoSTtZQUVELFVBQVU7WUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDM0Q7WUFFRCxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVc7UUFDcEIsSUFBSSxJQUFJLEdBQTBCLElBQUksQ0FBQyxPQUFRLENBQUMsWUFBWSxDQUFDO1FBQzdELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFzQixDQUFDO1FBQzlFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ3ZCLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDOztnSEE5ZFEsbUJBQW1CO29HQUFuQixtQkFBbUIsZ2hCQ1poQywwKy9DQW9xQkE7MkZEeHBCYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0ksYUFBYTtzS0FRZCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFFRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQVErQixLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIEZpbHRlclNlcnZpY2UsIExhenlMb2FkRXZlbnQgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IElFZGl0aW9uLCBJU3VwcHJlc3Npb24sIElTZWxlY3Rpb24sIElGaWx0ZXIsIElTb3J0LCBJUGFnZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW50ZXJmYWNlcy9lZGl0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IElDb2x1bW4sIElSb3csIElPcHRpb25zR3JpbGxlLCBJQ2VsbCwgSU9wdGlvbnNGaWxlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnRlcmZhY2VzL2dyaWxsZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBDb2xUeXBlLCBNb2RlU2VsZWN0aW9uLCBUaGVtZUdyaWxsZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bXMvZ3JpbGxlLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NpbG9nLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWxvZ1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBpbml0RmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBJQ29sdW1uW107XHJcbiAgICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbltdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIHZhbHVlczogSVJvd1tdO1xyXG4gICAgQE91dHB1dCgpIHZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1tdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG9wdGlvbnM6IElPcHRpb25zR3JpbGxlO1xyXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkVkaXRJbml0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uVW5zZWxlY3Q6IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPElGaWx0ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRmlsdGVySW5pdDogRXZlbnRFbWl0dGVyPElSb3dbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dbXT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNvcnQ6IEV2ZW50RW1pdHRlcjxJU29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUGFnZTogRXZlbnRFbWl0dGVyPElQYWdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2U+KCk7XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dzOiBJUm93W10gfCBJUm93O1xyXG5cclxuICAgIGZpbHRlckRhdGVzUmFuZ2U6IERhdGVbXTtcclxuXHJcbiAgICBvcHRpb25zU3dpdGNoOiBhbnlbXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0YWJsZScsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlOiBUYWJsZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N3aXRjaCA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogJ091aScsIHZhbHVlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb24nLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIC8vIERhdGVcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2RhdGVSYW5nZUZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGZpbHRlclswXS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGxldCBlbmQ6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IGVuZERhdGU6IERhdGU7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJbMV0pIHtcclxuICAgICAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShmaWx0ZXJbMV0uZ2V0RnVsbFllYXIoKSwgZmlsdGVyWzFdLmdldE1vbnRoKCksIGZpbHRlclsxXS5nZXREYXRlKCksIDIzLCA1OSwgNTkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGZpbHRlclswXS5nZXRGdWxsWWVhcigpLCBmaWx0ZXJbMF0uZ2V0TW9udGgoKSwgZmlsdGVyWzBdLmdldERhdGUoKSwgMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW5kID0gZW5kRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlID09IG51bGwgPyBmYWxzZSA6IGNlbGwudmFsdWUuZ2V0VGltZSgpID49IHN0YXJ0ICYmIGNlbGwudmFsdWUuZ2V0VGltZSgpIDw9IGVuZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBUZXh0XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCd0ZXh0RmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLnRyaW0oKSA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE51bWJlclxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignbnVtYmVyRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbC52YWx1ZSA9PSBmaWx0ZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gT2JqZXRcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ29iamV0RmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLmZpbmQodmFsID0+IHZhbC5JRCA9PSBjZWxsLnZhbHVlPy5JRCkgIT0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBMaXN0ZVxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignbGlzdGVGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmaWx0ZXIuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUuaW5kZXhPZih2YWwpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9rO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignc3dpdGNoRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKGZpbHRlci5pbmRleE9mKGNlbGwudmFsdWUpICE9IC0xKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBCdXR0b25cclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2J1dHRvbkZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJPYmpGaWVsZDogc3RyaW5nID0gY2VsbC5vcHRpb25zWydmaWx0ZXJPYmpGaWVsZCddO1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyT2JqU3ViRmllbGQ6IHN0cmluZyA9IGNlbGwub3B0aW9uc1snZmlsdGVyT2JqU3ViRmllbGQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsLm9iaiA9PSBudWxsIHx8IGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci50cmltKCkgPT0gJycgfHwgZmlsdGVyT2JqRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJPYmpTdWJGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5vYmpbZmlsdGVyT2JqRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwub2JqW2ZpbHRlck9iakZpZWxkXS5maW5kKHZhbCA9PiB2YWxbZmlsdGVyT2JqU3ViRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpKSAhPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9ucyA9IHsgZGVmYXVsdEZpbHRlcnM6IG51bGwgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbJ29ubHlMaXN0VmFsdWVzJ10gJiYgY29sLm9wdGlvbnNbJ29wdGlvbkdyb3VwTGFiZWwnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9uc1snb3B0aW9ucyddID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2NvbC5pZF0udmFsdWUuZm9yRWFjaCh2YWwyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC5JRCA9PSB2YWwyLklEKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5wdXNoKHZhbDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbFtjb2wuaWRdLnZhbHVlICE9IG51bGwgJiYgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQuSUQgPT0gdmFsW2NvbC5pZF0udmFsdWUuSUQpID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10ucHVzaCh2YWxbY29sLmlkXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10gPSBbLi4uY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5zb3J0KChhLCBiKSA9PiBhW2NvbC5vcHRpb25zWydvcHRpb25MYWJlbCddXS5sb2NhbGVDb21wYXJlKGFbY29sLm9wdGlvbnNbJ29wdGlvbkxhYmVsJ11dKSldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzICE9IG51bGwpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wuaW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIHRoaXMuZ2V0RmlsdGVyQnlDb2woY29sKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlclRhYmxlKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdEZpbHRlciA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25GaWx0ZXJJbml0LmVtaXQoZXZlbnQuZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbklucHV0TnVtYmVyKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRMYXp5KGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICAgICAgLy90aGlzLnZhbHVlcyA9IGV2ZW50LnJvd3Muc2xpY2UoZXZlbnQuZmlyc3QsIChldmVudC5maXJzdCArIGV2ZW50LnJvd3MpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0XHJcbiAgICBjdXN0b21Tb3J0KGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgY29sOiBJQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5pZCA9PSBldmVudC5maWVsZCk7XHJcbiAgICAgICAgdGhpcy5vblNvcnQuZW1pdCh7IGNvbHVtbjogY29sLCBvcmRlcjogZXZlbnQub3JkZXIgfSlcclxuICAgICAgICBsZXQgdHlwZUNvbDogQ29sVHlwZSA9IGNvbC50eXBlO1xyXG4gICAgICAgIGV2ZW50LmRhdGEuc29ydCgoZGF0YTEsIGRhdGEyKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZTEgPSBkYXRhMVtldmVudC5maWVsZF0udmFsdWU7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZTIgPSBkYXRhMltldmVudC5maWVsZF0udmFsdWU7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5UZXh0IHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5GaWxlKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlMSwgdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJykpLmxvY2FsZUNvbXBhcmUodGhpcy5nZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZTIsIHRoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTFbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJyldLmxvY2FsZUNvbXBhcmUodmFsdWUyW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk51bWJlciB8fCB0eXBlQ29sID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA8IHZhbHVlMikgPyAtMSA6ICh2YWx1ZTEgPiB2YWx1ZTIpID8gMSA6IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlN3aXRjaClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2YWx1ZTEgPT09IHZhbHVlMikgPyAwIDogdmFsdWUxID8gLTEgOiAxO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrVHlwZSh0eXBlQ29sOiBzdHJpbmcsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIHJldHVybiBjb2xbJ3R5cGUnXSA9PSB0eXBlQ29sO1xyXG4gICAgfVxyXG5cclxuICAgIGNsaWNrQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oY29sdW1uLCByb3csICdhY3Rpb24nKSgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uRWRpdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRNdWx0aXNlbGVjdChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgZXZlbnQpIHtcclxuICAgICAgICB0aGlzLm9uRWRpdENlbGwocm93LCBjb2x1bW4sIHsgbGlzdFNlbGVjdGVkOiBldmVudC52YWx1ZSwgaXRlbVNlbGVjdGVkOiBldmVudC5pdGVtVmFsdWUsIHNlbGVjdGVkOiBldmVudC52YWx1ZS5pbmRleE9mKGV2ZW50Lml0ZW1WYWx1ZSkgIT0gLTEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RSb3cocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHsgcm93OiByb3csIHNlbGVjdGVkUm93czogdGhpcy5zZWxlY3RlZFJvd3MgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25VbnNlbGVjdFJvdyhyb3c6IElSb3cpIHtcclxuICAgICAgICB0aGlzLm9uVW5zZWxlY3QuZW1pdCh7IHJvdzogcm93LCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydGFibGUgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBbLi4udGhpcy52YWx1ZXNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VUYWJsZShldmVudDogSVBhZ2UpIHtcclxuICAgICAgICB0aGlzLm9uUGFnZS5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxpbmUocm93OiBJUm93KSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxseURlbGV0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRGVsZXRlLmVtaXQoeyByb3c6IHJvdyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgICAgICAgICAgICBrZXk6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfDinRlcy12b3VzIHPDu3IgZGUgdm91bG9pciBzdXBwcmltZXIgY2V0dGUgbGlnbmUgPycsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zcGxpY2UodGhpcy52YWx1ZXMuaW5kZXhPZihyb3cpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlc107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRlbGV0ZS5lbWl0KHsgcm93OiByb3cgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRJbml0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25FZGl0SW5pdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlRWRpdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wdGlvbihjb2wsIHJvdywgb3B0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAocm93ICE9IG51bGwgJiYgcm93W2NvbC5pZF0ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zW29wdGlvbl0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tjb2wuaWRdLm9wdGlvbnNbb3B0aW9uXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sICE9IG51bGwgJiYgY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbb3B0aW9uXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLm9wdGlvbnNbb3B0aW9uXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlLCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2YWwgPT4geyByZXR1cm4gdmFsW2xhYmVsXTsgfSkuam9pbignLCAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvdywgY29sKSB7XHJcbiAgICAgICAgbGV0IGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICAgICAgICBpZiAocm93W2NvbC5pZF0udmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGFiZWwgPSByb3dbY29sLmlkXS5vcHRpb25zWydvcHRpb25zJ10uZmluZChvcHQgPT4gb3B0LnZhbHVlID09IHJvd1tjb2wuaWRdLnZhbHVlKVtyb3dbY29sLmlkXS5vcHRpb25zLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSByb3dbY29sLmlkXS52YWx1ZSlbY29sLm9wdGlvbnMub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJCeUNvbChjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICAvLyBEYXRlcyAocmFuZ2UpXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGVSYW5nZUZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE51bWJlclxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ251bWJlckZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9iamV0XHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TdGF0ZSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ29iamV0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2xpc3RlRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHRGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTd2l0Y2hcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5Td2l0Y2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdzd2l0Y2hGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlckNvbChldmVudCwgY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGNvbClcclxuICAgICAgICBsZXQgdmFsdWU6IGFueTtcclxuXHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycztcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ2RhdGVSYW5nZUZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOdW1iZXJcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ251bWJlckZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IGNvbC50eXBlID09IENvbFR5cGUuU3RhdGUgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24pIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudCA9PSBudWxsID8gbnVsbCA6IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ29iamV0RmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudCA9PSBudWxsID8gbnVsbCA6IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIHZhbHVlLCAnbGlzdGVGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ3RleHRGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuU3dpdGNoKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgdmFsdWUsICdzd2l0Y2hGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQnV0dG9uXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIHZhbHVlLCAnYnV0dG9uRmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW46IGNvbCwgdmFsdWU6IHZhbHVlLCBmaWx0ZXJlZFZhbHVlOiB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgfSlcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXIoY29sOiBJQ29sdW1uLCB2YWw6IGFueSwgZmlsdGVyOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWVyIC0gQ29sbGVyIGRlIGxhIG3DqXRob2RlIGZpbHRlcigpIGRlIHRhYmxlLnRzIGRlIFByaW1lTkcgc2FucyBsYSBkw6lzeW5jaHJvbmlzYXRpb24gY2F1c8OpZSBwYXIgZmlsdGVyRGVsYXkgKHNldFRpbWVvdXQpXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuZmlsdGVyVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlLmlzRmlsdGVyQmxhbmsodmFsKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXSA9IHsgdmFsdWU6IHZhbCwgbWF0Y2hNb2RlOiBmaWx0ZXIgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGUuZmlsdGVyc1tjb2wuaWRdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJsZS5fZmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRhYmxlLmFuY2hvclJvd0luZGV4ID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci52aWV3SW5pdCgpO1xyXG4gICAgICAgIC8vdGhpcy50YWJsZS5zY3JvbGxlci5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01vZGVDaGVja2JveFNlbGVjdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNlbGVjdGFibGUgPT0gdHJ1ZSAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uID09IE1vZGVTZWxlY3Rpb24uQ2hlY2tib3g7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgaWYgKGNvbC5kaXNwbGF5VG90YWwgJiYgY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlczogSVJvd1tdID0gdGhpcy52YWx1ZXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG90YWxCeUZpbHRlciA9PSB0cnVlICYmIHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gTW9kZVNlbGVjdGlvbi5DaGVja2JveCAmJiB0aGlzLm9wdGlvbnMudG90YWxCeVNlbGVjdGlvbiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cyAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PSB2YWwuaWQpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1hdHRlZE51bWJlcihjb2wsIG51bGwsICt0b3RhbC50b0ZpeGVkKDIpLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbDogSUNvbHVtbiwgcm93RGF0YTogSVJvdywgdmFsdWU6IG51bWJlciwgdG90YWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGZpbmFsVmFsdWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyBQcsOpZml4ZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxWYWx1ZS5wdXNoKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsZXVyXHJcbiAgICAgICAgICAgIGlmICh0b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxWYWx1ZS5wdXNoKHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdmci1GUicsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1pbkRlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1heERlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhEZWNpbWFsZXMgPSB0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluRGVjaW1hbGVzID0gdGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2ZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInKSlcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWluRGVjaW1hbGVzLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxlcyB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzdWZmaXgnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlLmpvaW4oJyAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRGaWxlKGNlbGw6IElDZWxsKSB7XHJcbiAgICAgICAgbGV0IHBhdGg6IHN0cmluZyA9ICg8SU9wdGlvbnNGaWxlPmNlbGwub3B0aW9ucykuZG93bmxvYWRQYXRoO1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgYS5ocmVmID0gcGF0aDtcclxuICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc0Zyb3plbkNvbHVtbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5mcm96ZW4gPT0gdHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0J5RnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbT8uaWQ7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBbbmdTdHlsZV09XCJ7ICdoZWlnaHQnOiBvcHRpb25zLnNjcm9sbEhlaWdodCAhPSBudWxsID8gb3B0aW9ucy5zY3JvbGxIZWlnaHQgOiAnMTAwJScgfVwiPlxyXG4gICAgPHAtdGFibGUgI3RhYmxlXHJcbiAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNcIlxyXG4gICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcclxuICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cIm9wdGlvbnMuc2VsZWN0YWJsZSAmJiAhaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKSA/ICdzaW5nbGUnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdFJvdygkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uVW5zZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoc29ydEZ1bmN0aW9uKT1cImN1c3RvbVNvcnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tU29ydF09XCJvcHRpb25zLmdyb3VwaW5nID09IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwiJ2ZsZXgnXCJcclxuICAgICAgICAgICAgIFtyb3dHcm91cE1vZGVdPVwib3B0aW9ucy5ncm91cGluZyAhPSBudWxsID8gJ3N1YmhlYWRlcicgOiBudWxsXCJcclxuICAgICAgICAgICAgIFtncm91cFJvd3NCeV09XCJvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgPyBvcHRpb25zLmdyb3VwaW5nLm9iaiArICcuJyArIG9wdGlvbnMuZ3JvdXBpbmcuaWQgOiBudWxsXCJcclxuICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cIm9wdGlvbnMudmlydHVhbFNjcm9sbCA9PSB0cnVlICYmIG9wdGlvbnMuc2Nyb2xsSGVpZ2h0ICE9IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCJvcHRpb25zLnZpcnR1YWxTY3JvbGwgIT0gbnVsbCA/IG9wdGlvbnMudmlydHVhbFNjcm9sbEl0ZW1TaXplIDogNjBcIlxyXG4gICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJvcHRpb25zLnBhZ2luYXRvciA9PSBudWxsID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgIFtyb3dzXT1cIm9wdGlvbnMucGFnaW5hdG9yUm93c1wiXHJcbiAgICAgICAgICAgICAob25QYWdlKT1cIm9uUGFnZVRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW2dyb3VwUm93c0J5T3JkZXJdPVwiMFwiXHJcbiAgICAgICAgICAgICBbdGFibGVTdHlsZUNsYXNzXT1cIiFvcHRpb25zLnRoZW1lR3JpbGxlID8gJ2dyaWRfZ3JleScgOiBvcHRpb25zLnRoZW1lR3JpbGxlXCJcclxuICAgICAgICAgICAgIFtsYXp5XT1cIm9wdGlvbnMubGF6eSA9PSB0cnVlID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgIChvbkZpbHRlcik9XCJvbkZpbHRlclRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW3Jvd1RyYWNrQnldPVwidHJhY2tCeUZ1bmN0aW9uXCI+XHJcblxyXG4gICAgICAgIDwhLS0gSEVBREVSIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSEVBREVSUyAtLT5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwicm93SGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW4+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sLmJhY2tncm91bmRDb2xvciA/IGNvbC5iYWNrZ3JvdW5kQ29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LWNlbnRlcicgOiBvcHRpb25zLmNlbnRlckhlYWRlcnMgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFvcHRpb25zLnNvcnRhYmxlIHx8IG9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbCB8fCBjb2wubGliZWxsZSA9PSBudWxsIHx8IGNvbC5saWJlbGxlID09ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyBjb2wuaWQgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVmcmVzaERhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwieyAnY29sb3InOiBjb2wudGV4dENvbG9yID8gY29sLnRleHRDb2xvciA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmxpYmVsbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uICpuZ0lmPVwib3B0aW9ucy5zb3J0YWJsZSAmJiBvcHRpb25zLmdyb3VwaW5nID09IG51bGwgJiYgY29sLmxpYmVsbGUgIT0gbnVsbCAmJiBjb2wubGliZWxsZSAhPSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cIm9wdGlvbnMucm93c0RlbGV0YWJsZVwiPjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZJTFRSRVMgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMuZmlsdGVyYWJsZVwiIGNsYXNzPVwicm93RmlsdGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiAoY2hlY2tUeXBlKCdUZXh0JywgY29sKSB8fCBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpIHx8IChjaGVja1R5cGUoJ0J1dHRvbicsIGNvbCkgJiYgY29sLm9wdGlvbnMuZmlsdGVyQ29sKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciAqbmdJZj1cIiFjb2wuZGlzYWJsZUZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aWV3XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gbnVsbCA/ICdkYXRlJyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICd5ZWFyJyA/ICd5eScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICdtb250aCcgPyAnbW0veXknIDogJ2RkL21tL3l5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5pZCArICdfZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J1dHRvbkJhcj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckNsaWNrKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIChjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgfHwgY2hlY2tUeXBlKCdDaWxvZ051bWJlcicsIGNvbCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiZGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGlzdGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgfHwgY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgfHwgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpIHx8IGNoZWNrVHlwZSgnU3RhdGUnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2wub3B0aW9ucz8ub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wub3B0aW9ucz8ub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBzZWxlY3Rpb25uw6lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBDaGlsZHJlbiAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkdyb3VwTGFiZWxdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cENoaWxkcmVuXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uRmlsdGVyQ29sKG51bGwsIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnU3dpdGNoJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiIWNvbC5kaXNhYmxlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1N3aXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOb24gZmlsdHJhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIChjaGVja1R5cGUoJ0ltYWdlJywgY29sKSB8fCAoY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpICYmICFjb2wub3B0aW9ucy5maWx0ZXJDb2wpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVE9UQUwgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMucm93VG90YWxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3dUb3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LWNlbnRlcicgOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGdldFRvdGFsKGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIj48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS1Hcm91cGhlYWRlci0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJncm91cGhlYWRlclwiIGxldC1yb3dEYXRhPlxyXG4gICAgICAgICAgICA8dHIgcFJvd0dyb3VwSGVhZGVyIGNsYXNzPVwicm93R3JvdXBpbmdcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xkaXZdPVwiY29sdW1ucy5sZW5ndGggKyAxXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0X2JvbGRcIj57eyByb3dEYXRhW29wdGlvbnMuZ3JvdXBpbmcub2JqXVtvcHRpb25zLmdyb3VwaW5nLmxpYmVsbGVdIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS0gTE9BRElORyBCT0RZIC0tPlxyXG4gICAgICAgIDwhLS08bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2JvZHlcIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDx0ciBzdHlsZT1cImhlaWdodDo0MXB4XCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgW2ZvemVuXT1cImNvbC5mcm96ZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6ICcxMDAlJyB9XCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBldmVuID0gZXZlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwieyAnd2lkdGgnIDogJzEwMCUnIH1cIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwieyAnd2lkdGgnIDogJzEwMCUnIH1cIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+LS0+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dHIgaWQ9XCJ7eyByb3dEYXRhLmlkIH19XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhLmNvbG9yID8gcm93RGF0YS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3dEaXNhYmxlZF09XCIhb3B0aW9ucy5zZWxlY3RhYmxlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIiBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5GaWVsZF09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnVGV4dCcsIGNvbCkgJiYgKCFpc01vZGVFZGl0aW9uKCkgfHwgcm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFzZVpJbmRleF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnYmFzZVpJbmRleCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ZpcnR1YWxTY3JvbGwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ2lsb2cgTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaWxvZy1pbnB1dC1udW1iZXIgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbklucHV0TnVtYmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1ZmZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgKyAnICcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEZWNpbWFsc109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSAhPSBudWxsICYmIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpID09IHRydWUgPyAwIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJykgOiAyIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NpbG9nLWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6ICd0ZXh0LWNlbnRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTnVtYmVyJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgbnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3Nob3dCdXR0b25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW4nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSA6IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgIT0gbnVsbCAmJiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSA9PSB0cnVlID8gMCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpIDogMiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyBnZXRGb3JtYXR0ZWROdW1iZXIoY29sLCByb3dEYXRhLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRGF0ZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09IG51bGwgPyAnZGF0ZScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAneWVhcicgPyAneXknIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAnbW9udGgnID8gJ21tL3l5JyA6ICdkZC9tbS95eSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERheU9mV2Vlaz1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5SW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2NsZWFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGF0ZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0RGF0ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnZGVmYXVsdERhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0RhdGUnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdtaW4td2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IGRhdGU6IChnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICd5ZWFyJyA/ICd5eXl5JyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ21vbnRoJyA/ICdNTS95eXl5JyA6ICdkZC9NTS95eXl5JykgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpU2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTXVsdGlTZWxlY3QnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiBnZXRNdWx0aVNlbGVjdENvbmNhdChyb3dEYXRhW2NvbC5pZF0udmFsdWUsIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiZWRpdE11bHRpc2VsZWN0KHJvd0RhdGEsIGNvbCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cENoaWxkcmVuJykgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cExhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6ICd0ZXh0LWNlbnRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ltYWdlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aWR0aDogNDBweDtcIiBzcmM9XCJ7eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFkZGluZ0NlbGwgdGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIncC1idXR0b24tJyArIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzZXZlcml0eScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2xhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpY29uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdsYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvblZhbHVlJykgOiAndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnU2VsZWN0QnV0dG9uJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvd0RhdGEsIGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFN3aXRjaCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N3aXRjaCcsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXRTd2l0Y2ggKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAoZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2FjdGlvbicpID09IG51bGwgJiYgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXRTd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRmlsZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdXBsb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQnlJZCgnaW5wdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwie3snb3V0cHV0XycgKyByb3dEYXRhW2NvbC5pZF0uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdkb3dubG9hZFBhdGgnKSAmJiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWRvd25sb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkRmlsZShyb3dEYXRhW2NvbC5pZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiIGlkPVwie3snaW5wdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZH19XCIgI2lucHV0RmlsZSBwSW5wdXRUZXh0IHR5cGU9XCJmaWxlXCIgaGlkZGVuIChjaGFuZ2UpPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlID0gaW5wdXRGaWxlLmZpbGVzWzBdLm5hbWU7IG9uRWRpdENlbGwocm93RGF0YSwgY29sLCBpbnB1dEZpbGUuZmlsZXNbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N0YXRlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC10YWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLmJhY2tncm91bmRDb2xvciwgJ2NvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLnRleHRDb2xvciB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERlbGV0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGEuZGVsZXRhYmxlID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm93RGF0YS5kZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgYnV0dG9uRGVsZXRlIHAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTGluZShyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC10YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
490
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2lsb2ctbGliL3NyYy9saWIvdmlld3MvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBSzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFlLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT3RGLE1BQU0sT0FBTyxtQkFBbUI7SUErQjVCLFlBQ1ksbUJBQXdDLEVBQ3hDLGFBQTRCLEVBQzVCLEtBQXdCO1FBRnhCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFoQ3BDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFHakIsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRzlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUsxQyxXQUFNLEdBQTJCLElBQUksWUFBWSxFQUFZLENBQUM7UUFDOUQsZUFBVSxHQUEyQixJQUFJLFlBQVksRUFBWSxDQUFDO1FBQ2xFLGFBQVEsR0FBK0IsSUFBSSxZQUFZLEVBQWdCLENBQUM7UUFDeEUsYUFBUSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBQ3BFLGVBQVUsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUN0RSxhQUFRLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDOUQsaUJBQVksR0FBeUIsSUFBSSxZ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Q1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQ3ZCLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDOztnSEE5ZFEsbUJBQW1CO29HQUFuQixtQkFBbUIsZ2hCQ1poQywwKy9DQW9xQkE7MkZEeHBCYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0ksYUFBYTtzS0FRZCxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFFRSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFFRSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQVErQixLQUFLO3NCQUExQyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbmZpcm1hdGlvblNlcnZpY2UsIEZpbHRlclNlcnZpY2UsIExhenlMb2FkRXZlbnQgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IElFZGl0aW9uLCBJU3VwcHJlc3Npb24sIElTZWxlY3Rpb24sIElGaWx0ZXIsIElTb3J0LCBJUGFnZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW50ZXJmYWNlcy9lZGl0aW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IElDb2x1bW4sIElSb3csIElPcHRpb25zR3JpbGxlLCBJQ2VsbCwgSU9wdGlvbnNGaWxlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbnRlcmZhY2VzL2dyaWxsZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBDb2xUeXBlLCBNb2RlU2VsZWN0aW9uLCBUaGVtZUdyaWxsZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZW51bXMvZ3JpbGxlLmVudW0nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2NpbG9nLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaWxvZ1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBpbml0RmlsdGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBjb2x1bW5zOiBJQ29sdW1uW107XHJcbiAgICBAT3V0cHV0KCkgY29sdW1uc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbltdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIHZhbHVlczogSVJvd1tdO1xyXG4gICAgQE91dHB1dCgpIHZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd1tdPigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG9wdGlvbnM6IElPcHRpb25zR3JpbGxlO1xyXG4gICAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkVkaXRJbml0OiBFdmVudEVtaXR0ZXI8SUVkaXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRWRpdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPElTdXBwcmVzc2lvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNlbGVjdDogRXZlbnRFbWl0dGVyPElTZWxlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIG9uVW5zZWxlY3Q6IEV2ZW50RW1pdHRlcjxJU2VsZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVNlbGVjdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkZpbHRlcjogRXZlbnRFbWl0dGVyPElGaWx0ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyPigpO1xyXG4gICAgQE91dHB1dCgpIG9uRmlsdGVySW5pdDogRXZlbnRFbWl0dGVyPElSb3dbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dbXT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblNvcnQ6IEV2ZW50RW1pdHRlcjxJU29ydD4gPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUGFnZTogRXZlbnRFbWl0dGVyPElQYWdlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBhZ2U+KCk7XHJcblxyXG4gICAgc2VsZWN0ZWRSb3dzOiBJUm93W10gfCBJUm93O1xyXG5cclxuICAgIGZpbHRlckRhdGVzUmFuZ2U6IERhdGVbXTtcclxuXHJcbiAgICBvcHRpb25zU3dpdGNoOiBhbnlbXTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCd0YWJsZScsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlOiBUYWJsZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNvbmZpcm1hdGlvblNlcnZpY2U6IENvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBmaWx0ZXJTZXJ2aWNlOiBGaWx0ZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgICApIHsgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N3aXRjaCA9IFtcclxuICAgICAgICAgICAgeyBsYWJlbDogJ091aScsIHZhbHVlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOb24nLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIC8vIERhdGVcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2RhdGVSYW5nZUZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3RhcnQ6IG51bWJlciA9IGZpbHRlclswXS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGxldCBlbmQ6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IGVuZERhdGU6IERhdGU7XHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJbMV0pIHtcclxuICAgICAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShmaWx0ZXJbMV0uZ2V0RnVsbFllYXIoKSwgZmlsdGVyWzFdLmdldE1vbnRoKCksIGZpbHRlclsxXS5nZXREYXRlKCksIDIzLCA1OSwgNTkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IG5ldyBEYXRlKGZpbHRlclswXS5nZXRGdWxsWWVhcigpLCBmaWx0ZXJbMF0uZ2V0TW9udGgoKSwgZmlsdGVyWzBdLmdldERhdGUoKSwgMjMsIDU5LCA1OSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZW5kID0gZW5kRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlID09IG51bGwgPyBmYWxzZSA6IGNlbGwudmFsdWUuZ2V0VGltZSgpID49IHN0YXJ0ICYmIGNlbGwudmFsdWUuZ2V0VGltZSgpIDw9IGVuZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBUZXh0XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnJlZ2lzdGVyKCd0ZXh0RmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLnRyaW0oKSA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIE51bWJlclxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignbnVtYmVyRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjZWxsLnZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY2VsbC52YWx1ZSA9PSBmaWx0ZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gT2JqZXRcclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ29iamV0RmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyLmZpbmQodmFsID0+IHZhbC5JRCA9PSBjZWxsLnZhbHVlPy5JRCkgIT0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBMaXN0ZVxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3RlcignbGlzdGVGaWx0ZXInLCAoY2VsbCwgZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBvazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmaWx0ZXIuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNlbGwudmFsdWUuaW5kZXhPZih2YWwpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2sgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIG9rO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFN3aXRjaFxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2VydmljZS5yZWdpc3Rlcignc3dpdGNoRmlsdGVyJywgKGNlbGwsIGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKGZpbHRlci5pbmRleE9mKGNlbGwudmFsdWUpICE9IC0xKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBCdXR0b25cclxuICAgICAgICB0aGlzLmZpbHRlclNlcnZpY2UucmVnaXN0ZXIoJ2J1dHRvbkZpbHRlcicsIChjZWxsLCBmaWx0ZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXJPYmpGaWVsZDogc3RyaW5nID0gY2VsbC5vcHRpb25zWydmaWx0ZXJPYmpGaWVsZCddO1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyT2JqU3ViRmllbGQ6IHN0cmluZyA9IGNlbGwub3B0aW9uc1snZmlsdGVyT2JqU3ViRmllbGQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjZWxsLm9iaiA9PSBudWxsIHx8IGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci50cmltKCkgPT0gJycgfHwgZmlsdGVyT2JqRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChmaWx0ZXJPYmpTdWJGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5vYmpbZmlsdGVyT2JqRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNlbGwub2JqW2ZpbHRlck9iakZpZWxkXS5maW5kKHZhbCA9PiB2YWxbZmlsdGVyT2JqU3ViRmllbGRdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyLnRvTG93ZXJDYXNlKCkpKSAhPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wub3B0aW9ucyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9ucyA9IHsgZGVmYXVsdEZpbHRlcnM6IG51bGwgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbJ29ubHlMaXN0VmFsdWVzJ10gJiYgY29sLm9wdGlvbnNbJ29wdGlvbkdyb3VwTGFiZWwnXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wub3B0aW9uc1snb3B0aW9ucyddID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2NvbC5pZF0udmFsdWUuZm9yRWFjaCh2YWwyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC5JRCA9PSB2YWwyLklEKSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5wdXNoKHZhbDIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbFtjb2wuaWRdLnZhbHVlICE9IG51bGwgJiYgY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5maW5kKG9wdCA9PiBvcHQuSUQgPT0gdmFsW2NvbC5pZF0udmFsdWUuSUQpID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10ucHVzaCh2YWxbY29sLmlkXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNvbC5vcHRpb25zWydvcHRpb25zJ10gPSBbLi4uY29sLm9wdGlvbnNbJ29wdGlvbnMnXS5zb3J0KChhLCBiKSA9PiBhW2NvbC5vcHRpb25zWydvcHRpb25MYWJlbCddXS5sb2NhbGVDb21wYXJlKGFbY29sLm9wdGlvbnNbJ29wdGlvbkxhYmVsJ11dKSldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zQ2hhbmdlLmVtaXQodGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzICE9IG51bGwpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wuaW52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIHRoaXMuZ2V0RmlsdGVyQnlDb2woY29sKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlclRhYmxlKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdEZpbHRlciA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25GaWx0ZXJJbml0LmVtaXQoZXZlbnQuZmlsdGVyZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEZpbHRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbklucHV0TnVtYmVyKGV2ZW50KSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGxvYWRMYXp5KGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XHJcbiAgICAgICAgLy90aGlzLnZhbHVlcyA9IGV2ZW50LnJvd3Muc2xpY2UoZXZlbnQuZmlyc3QsIChldmVudC5maXJzdCArIGV2ZW50LnJvd3MpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0XHJcbiAgICBjdXN0b21Tb3J0KGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBsZXQgY29sOiBJQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5pZCA9PSBldmVudC5maWVsZCk7XHJcbiAgICAgICAgdGhpcy5vblNvcnQuZW1pdCh7IGNvbHVtbjogY29sLCBvcmRlcjogZXZlbnQub3JkZXIgfSlcclxuICAgICAgICBsZXQgdHlwZUNvbDogQ29sVHlwZSA9IGNvbC50eXBlO1xyXG4gICAgICAgIGV2ZW50LmRhdGEuc29ydCgoZGF0YTEsIGRhdGEyKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZTEgPSBkYXRhMVtldmVudC5maWVsZF0udmFsdWU7XHJcbiAgICAgICAgICAgIGxldCB2YWx1ZTIgPSBkYXRhMltldmVudC5maWVsZF0udmFsdWU7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVDb2wgPT0gQ29sVHlwZS5UZXh0IHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5GaWxlKVxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk11bHRpU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLmdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlMSwgdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJykpLmxvY2FsZUNvbXBhcmUodGhpcy5nZXRNdWx0aVNlbGVjdENvbmNhdCh2YWx1ZTIsIHRoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IHR5cGVDb2wgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24gfHwgdHlwZUNvbCA9PSBDb2xUeXBlLlN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTFbdGhpcy5nZXRPcHRpb24oY29sLCBkYXRhMSwgJ29wdGlvbkxhYmVsJyldLmxvY2FsZUNvbXBhcmUodmFsdWUyW3RoaXMuZ2V0T3B0aW9uKGNvbCwgZGF0YTIsICdvcHRpb25MYWJlbCcpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLk51bWJlciB8fCB0eXBlQ29sID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gKHZhbHVlMSA8IHZhbHVlMikgPyAtMSA6ICh2YWx1ZTEgPiB2YWx1ZTIpID8gMSA6IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUNvbCA9PSBDb2xUeXBlLlN3aXRjaClcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICh2YWx1ZTEgPT09IHZhbHVlMikgPyAwIDogdmFsdWUxID8gLTEgOiAxO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPT0gMDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrVHlwZSh0eXBlQ29sOiBzdHJpbmcsIGNvbDogSUNvbHVtbikge1xyXG4gICAgICAgIHJldHVybiBjb2xbJ3R5cGUnXSA9PSB0eXBlQ29sO1xyXG4gICAgfVxyXG5cclxuICAgIGNsaWNrQnlJZChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2x1bW4sIHJvdywgJ2FjdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb24oY29sdW1uLCByb3csICdhY3Rpb24nKSgpO1xyXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uRWRpdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGVkaXRNdWx0aXNlbGVjdChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgZXZlbnQpIHtcclxuICAgICAgICB0aGlzLm9uRWRpdENlbGwocm93LCBjb2x1bW4sIHsgbGlzdFNlbGVjdGVkOiBldmVudC52YWx1ZSwgaXRlbVNlbGVjdGVkOiBldmVudC5pdGVtVmFsdWUsIHNlbGVjdGVkOiBldmVudC52YWx1ZS5pbmRleE9mKGV2ZW50Lml0ZW1WYWx1ZSkgIT0gLTEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RSb3cocm93OiBJUm93KSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHsgcm93OiByb3csIHNlbGVjdGVkUm93czogdGhpcy5zZWxlY3RlZFJvd3MgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25VbnNlbGVjdFJvdyhyb3c6IElSb3cpIHtcclxuICAgICAgICB0aGlzLm9uVW5zZWxlY3QuZW1pdCh7IHJvdzogcm93LCBzZWxlY3RlZFJvd3M6IHRoaXMuc2VsZWN0ZWRSb3dzIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hEYXRhKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydGFibGUgJiYgdGhpcy5vcHRpb25zLnZpcnR1YWxTY3JvbGwpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBbLi4udGhpcy52YWx1ZXNdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VUYWJsZShldmVudDogSVBhZ2UpIHtcclxuICAgICAgICB0aGlzLm9uUGFnZS5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRlbGV0ZUxpbmUocm93OiBJUm93KSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYW51YWxseURlbGV0YWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uRGVsZXRlLmVtaXQoeyByb3c6IHJvdyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcbiAgICAgICAgICAgICAgICBrZXk6ICdjb25maXJtJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfDinRlcy12b3VzIHPDu3IgZGUgdm91bG9pciBzdXBwcmltZXIgY2V0dGUgbGlnbmUgPycsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zcGxpY2UodGhpcy52YWx1ZXMuaW5kZXhPZihyb3cpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcyA9IFsuLi50aGlzLnZhbHVlc107XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRlbGV0ZS5lbWl0KHsgcm93OiByb3cgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkVkaXRJbml0Q2VsbChyb3c6IElSb3csIGNvbHVtbjogSUNvbHVtbiwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25FZGl0SW5pdC5lbWl0KHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uLCB2YWx1ZTogdmFsdWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNb2RlRWRpdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVkaXRhYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9wdGlvbihjb2wsIHJvdywgb3B0aW9uOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAocm93ICE9IG51bGwgJiYgcm93W2NvbC5pZF0ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zW29wdGlvbl0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tjb2wuaWRdLm9wdGlvbnNbb3B0aW9uXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29sICE9IG51bGwgJiYgY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnNbb3B0aW9uXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLm9wdGlvbnNbb3B0aW9uXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE11bHRpU2VsZWN0Q29uY2F0KHZhbHVlLCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCh2YWwgPT4geyByZXR1cm4gdmFsW2xhYmVsXTsgfSkuam9pbignLCAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvdywgY29sKSB7XHJcbiAgICAgICAgbGV0IGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICAgICAgICBpZiAocm93W2NvbC5pZF0udmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dbY29sLmlkXS5vcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGFiZWwgPSByb3dbY29sLmlkXS5vcHRpb25zWydvcHRpb25zJ10uZmluZChvcHQgPT4gb3B0LnZhbHVlID09IHJvd1tjb2wuaWRdLnZhbHVlKVtyb3dbY29sLmlkXS5vcHRpb25zLm9wdGlvbkxhYmVsXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29sLm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbGFiZWwgPSBjb2wub3B0aW9uc1snb3B0aW9ucyddLmZpbmQob3B0ID0+IG9wdC52YWx1ZSA9PSByb3dbY29sLmlkXS52YWx1ZSlbY29sLm9wdGlvbnMub3B0aW9uTGFiZWxdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJCeUNvbChjb2w6IElDb2x1bW4pIHtcclxuICAgICAgICAvLyBEYXRlcyAocmFuZ2UpXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2RhdGVSYW5nZUZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE51bWJlclxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ251bWJlckZpbHRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE9iamV0XHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuRHJvcGRvd24gfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TdGF0ZSB8fCBjb2wudHlwZSA9PSBDb2xUeXBlLlNlbGVjdEJ1dHRvbikge1xyXG4gICAgICAgICAgICByZXR1cm4gJ29iamV0RmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTGlzdGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5NdWx0aVNlbGVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ2xpc3RlRmlsdGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ3RleHRGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTd2l0Y2hcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5Td2l0Y2gpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdzd2l0Y2hGaWx0ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbHRlckNvbChldmVudCwgY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGNvbClcclxuICAgICAgICBsZXQgdmFsdWU6IGFueTtcclxuXHJcbiAgICAgICAgLy8gRGF0ZXMgKHJhbmdlKVxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRhdGUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVycztcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ2RhdGVSYW5nZUZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBOdW1iZXJcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudC52YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ251bWJlckZpbHRlcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPYmpldFxyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBDb2xUeXBlLkRyb3Bkb3duIHx8IGNvbC50eXBlID09IENvbFR5cGUuU3RhdGUgfHwgY29sLnR5cGUgPT0gQ29sVHlwZS5TZWxlY3RCdXR0b24pIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudCA9PSBudWxsID8gbnVsbCA6IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSlcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ29iamV0RmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIExpc3RlXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuTXVsdGlTZWxlY3QpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBldmVudCA9PSBudWxsID8gbnVsbCA6IGV2ZW50LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIHZhbHVlLCAnbGlzdGVGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVGV4dGVcclxuICAgICAgICBpZiAoY29sLnR5cGUgPT0gQ29sVHlwZS5GaWxlIHx8IGNvbC50eXBlID09IENvbFR5cGUuVGV4dCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXIoY29sLCB2YWx1ZSwgJ3RleHRGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU3dpdGNoXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuU3dpdGNoKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyKGNvbCwgdmFsdWUsICdzd2l0Y2hGaWx0ZXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQnV0dG9uXHJcbiAgICAgICAgaWYgKGNvbC50eXBlID09IENvbFR5cGUuQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcihjb2wsIHZhbHVlLCAnYnV0dG9uRmlsdGVyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW46IGNvbCwgdmFsdWU6IHZhbHVlLCBmaWx0ZXJlZFZhbHVlOiB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWUgfSlcclxuICAgIH1cclxuXHJcbiAgICBmaWx0ZXIoY29sOiBJQ29sdW1uLCB2YWw6IGFueSwgZmlsdGVyOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgLy8gQ29waWVyIC0gQ29sbGVyIGRlIGxhIG3DqXRob2RlIGZpbHRlcigpIGRlIHRhYmxlLnRzIGRlIFByaW1lTkcgc2FucyBsYSBkw6lzeW5jaHJvbmlzYXRpb24gY2F1c8OpZSBwYXIgZmlsdGVyRGVsYXkgKHNldFRpbWVvdXQpXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUuZmlsdGVyVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnRhYmxlLmlzRmlsdGVyQmxhbmsodmFsKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXSA9IHsgdmFsdWU6IHZhbCwgbWF0Y2hNb2RlOiBmaWx0ZXIgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGFibGUuZmlsdGVyc1tjb2wuaWRdKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRhYmxlLmZpbHRlcnNbY29sLmlkXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJsZS5fZmlsdGVyKCk7XHJcbiAgICAgICAgdGhpcy50YWJsZS5maWx0ZXJUaW1lb3V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnRhYmxlLmFuY2hvclJvd0luZGV4ID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy50YWJsZS5zY3JvbGxlci52aWV3SW5pdCgpO1xyXG4gICAgICAgIC8vdGhpcy50YWJsZS5zY3JvbGxlci5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc01vZGVDaGVja2JveFNlbGVjdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNlbGVjdGFibGUgPT0gdHJ1ZSAmJiB0aGlzLm9wdGlvbnMubW9kZVNlbGVjdGlvbiAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uID09IE1vZGVTZWxlY3Rpb24uQ2hlY2tib3g7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG90YWwoY29sOiBJQ29sdW1uKSB7XHJcbiAgICAgICAgaWYgKGNvbC5kaXNwbGF5VG90YWwgJiYgY29sLnR5cGUgPT0gQ29sVHlwZS5OdW1iZXIpIHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlczogSVJvd1tdID0gdGhpcy52YWx1ZXM7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG90YWxCeUZpbHRlciA9PSB0cnVlICYmIHRoaXMudGFibGUuZmlsdGVyZWRWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSB0aGlzLnRhYmxlLmZpbHRlcmVkVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlU2VsZWN0aW9uICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGVTZWxlY3Rpb24gPT0gTW9kZVNlbGVjdGlvbi5DaGVja2JveCAmJiB0aGlzLm9wdGlvbnMudG90YWxCeVNlbGVjdGlvbiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUm93cyAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PSB2YWwuaWQpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9ICh2YWxbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gdmFsW2NvbC5pZF0udmFsdWUgOiAwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvcm1hdHRlZE51bWJlcihjb2wsIG51bGwsICt0b3RhbC50b0ZpeGVkKDIpLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbDogSUNvbHVtbiwgcm93RGF0YTogSVJvdywgdmFsdWU6IG51bWJlciwgdG90YWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG5cclxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGZpbmFsVmFsdWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyBQcsOpZml4ZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxWYWx1ZS5wdXNoKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsZXVyXHJcbiAgICAgICAgICAgIGlmICh0b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgZmluYWxWYWx1ZS5wdXNoKHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdmci1GUicsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1pbkRlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1heERlY2ltYWxlczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhEZWNpbWFsZXMgPSB0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluRGVjaW1hbGVzID0gdGhpcy5nZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvL2ZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInKSlcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh2YWx1ZS50b0xvY2FsZVN0cmluZygnZnItRlInLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogbWluRGVjaW1hbGVzLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1heERlY2ltYWxlcyB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFN1ZmZpeGVcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUucHVzaCh0aGlzLmdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzdWZmaXgnKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlLmpvaW4oJyAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZG93bmxvYWRGaWxlKGNlbGw6IElDZWxsKSB7XHJcbiAgICAgICAgbGV0IHBhdGg6IHN0cmluZyA9ICg8SU9wdGlvbnNGaWxlPmNlbGwub3B0aW9ucykuZG93bmxvYWRQYXRoO1xyXG4gICAgICAgIGxldCBmaWxlTmFtZSA9IGNlbGwudmFsdWU7XHJcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgICAgICAgYS5ocmVmID0gcGF0aDtcclxuICAgICAgICBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcclxuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc0Zyb3plbkNvbHVtbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5mcm96ZW4gPT0gdHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0J5RnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcclxuICAgICAgICByZXR1cm4gaXRlbT8uaWQ7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBbbmdTdHlsZV09XCJ7ICdoZWlnaHQnOiBvcHRpb25zLnNjcm9sbEhlaWdodCAhPSBudWxsID8gb3B0aW9ucy5zY3JvbGxIZWlnaHQgOiAnMTAwJScgfVwiPlxyXG4gICAgPHAtdGFibGUgI3RhYmxlXHJcbiAgICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNcIlxyXG4gICAgICAgICAgICAgZGF0YUtleT1cImlkXCJcclxuICAgICAgICAgICAgIFtzZWxlY3Rpb25Nb2RlXT1cIm9wdGlvbnMuc2VsZWN0YWJsZSAmJiAhaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKSA/ICdzaW5nbGUnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRSb3dzXCJcclxuICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJvblNlbGVjdFJvdygkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uVW5zZWxlY3RSb3coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAoc29ydEZ1bmN0aW9uKT1cImN1c3RvbVNvcnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tU29ydF09XCJvcHRpb25zLmdyb3VwaW5nID09IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcclxuICAgICAgICAgICAgIFtzY3JvbGxIZWlnaHRdPVwiJ2ZsZXgnXCJcclxuICAgICAgICAgICAgIFtyb3dHcm91cE1vZGVdPVwib3B0aW9ucy5ncm91cGluZyAhPSBudWxsID8gJ3N1YmhlYWRlcicgOiBudWxsXCJcclxuICAgICAgICAgICAgIFtncm91cFJvd3NCeV09XCJvcHRpb25zLmdyb3VwaW5nICE9IG51bGwgPyBvcHRpb25zLmdyb3VwaW5nLm9iaiArICcuJyArIG9wdGlvbnMuZ3JvdXBpbmcuaWQgOiBudWxsXCJcclxuICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cIm9wdGlvbnMudmlydHVhbFNjcm9sbCA9PSB0cnVlICYmIG9wdGlvbnMuc2Nyb2xsSGVpZ2h0ICE9IG51bGwgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCJvcHRpb25zLnZpcnR1YWxTY3JvbGwgIT0gbnVsbCA/IG9wdGlvbnMudmlydHVhbFNjcm9sbEl0ZW1TaXplIDogNDFcIlxyXG4gICAgICAgICAgICAgW3BhZ2luYXRvcl09XCJvcHRpb25zLnBhZ2luYXRvciA9PSBudWxsID8gZmFsc2UgOiB0cnVlXCJcclxuICAgICAgICAgICAgIFtyb3dzXT1cIm9wdGlvbnMucGFnaW5hdG9yUm93c1wiXHJcbiAgICAgICAgICAgICAob25QYWdlKT1cIm9uUGFnZVRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW2dyb3VwUm93c0J5T3JkZXJdPVwiMFwiXHJcbiAgICAgICAgICAgICBbdGFibGVTdHlsZUNsYXNzXT1cIiFvcHRpb25zLnRoZW1lR3JpbGxlID8gJ2dyaWRfZ3JleScgOiBvcHRpb25zLnRoZW1lR3JpbGxlXCJcclxuICAgICAgICAgICAgIFtsYXp5XT1cIm9wdGlvbnMubGF6eSA9PSB0cnVlID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgIChvbkZpbHRlcik9XCJvbkZpbHRlclRhYmxlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgW3Jvd1RyYWNrQnldPVwidHJhY2tCeUZ1bmN0aW9uXCI+XHJcblxyXG4gICAgICAgIDwhLS0gSEVBREVSIC0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSEVBREVSUyAtLT5cclxuICAgICAgICAgICAgPHRyIGNsYXNzPVwicm93SGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTW9kZUNoZWNrYm94U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW4+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogY29sLmJhY2tncm91bmRDb2xvciA/IGNvbC5iYWNrZ3JvdW5kQ29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LWNlbnRlcicgOiBvcHRpb25zLmNlbnRlckhlYWRlcnMgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLmlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BTb3J0YWJsZUNvbHVtbkRpc2FibGVkXT1cIiFvcHRpb25zLnNvcnRhYmxlIHx8IG9wdGlvbnMuZ3JvdXBpbmcgIT0gbnVsbCB8fCBjb2wubGliZWxsZSA9PSBudWxsIHx8IGNvbC5saWJlbGxlID09ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyBjb2wuaWQgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVmcmVzaERhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwieyAnY29sb3InOiBjb2wudGV4dENvbG9yID8gY29sLnRleHRDb2xvciA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29sLmxpYmVsbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNvcnRJY29uICpuZ0lmPVwib3B0aW9ucy5zb3J0YWJsZSAmJiBvcHRpb25zLmdyb3VwaW5nID09IG51bGwgJiYgY29sLmxpYmVsbGUgIT0gbnVsbCAmJiBjb2wubGliZWxsZSAhPSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNlbGxEZWxldGVcIiAqbmdJZj1cIm9wdGlvbnMucm93c0RlbGV0YWJsZVwiPjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEZJTFRSRVMgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMuZmlsdGVyYWJsZVwiIGNsYXNzPVwicm93RmlsdGVyXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiAoY2hlY2tUeXBlKCdUZXh0JywgY29sKSB8fCBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpIHx8IChjaGVja1R5cGUoJ0J1dHRvbicsIGNvbCkgJiYgY29sLm9wdGlvbnMuZmlsdGVyQ29sKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbC5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRGF0ZScsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciAqbmdJZj1cIiFjb2wuZGlzYWJsZUZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aWV3XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gbnVsbCA/ICdkYXRlJyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICd5ZWFyJyA/ICd5eScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICdtb250aCcgPyAnbW0veXknIDogJ2RkL21tL3l5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5pZCArICdfZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5T2ZXZWVrPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seUlucHV0XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0J1dHRvbkJhcj1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhckNsaWNrKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIChjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgfHwgY2hlY2tUeXBlKCdDaWxvZ051bWJlcicsIGNvbCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPVwiZGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbklucHV0KT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTGlzdGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdEcm9wZG93bicsIGNvbCkgfHwgY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgfHwgY2hlY2tUeXBlKCdTZWxlY3RCdXR0b24nLCBjb2wpIHx8IGNoZWNrVHlwZSgnU3RhdGUnLCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCIhY29sLmRpc2FibGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2wub3B0aW9ucz8ub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb2wub3B0aW9ucz8ub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBzZWxlY3Rpb25uw6lzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRmlsdGVyQ29sKCRldmVudCwgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBDaGlsZHJlbiAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkdyb3VwTGFiZWxdPVwiY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cENoaWxkcmVuXT1cImNvbC5vcHRpb25zLm9wdGlvbkdyb3VwQ2hpbGRyZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RvZ2dsZUFsbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uRmlsdGVyQ29sKG51bGwsIGNvbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3dpdGNoIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnU3dpdGNoJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0ICpuZ0lmPVwiIWNvbC5kaXNhYmxlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1N3aXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25GaWx0ZXJDb2woJGV2ZW50LCBjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2wub3B0aW9ucy5kZWZhdWx0RmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBOb24gZmlsdHJhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIChjaGVja1R5cGUoJ0ltYWdlJywgY29sKSB8fCAoY2hlY2tUeXBlKCdCdXR0b24nLCBjb2wpICYmICFjb2wub3B0aW9ucy5maWx0ZXJDb2wpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+PC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVE9UQUwgLS0+XHJcbiAgICAgICAgICAgIDx0ciAqbmdJZj1cIm9wdGlvbnMucm93VG90YWxcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJyb3dUb3RhbFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2VsbERlbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc01vZGVDaGVja2JveFNlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIWNvbC5pbnZpc2libGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICd0ZXh0LWNlbnRlcicgOiB0cnVlIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGdldFRvdGFsKGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjZWxsRGVsZXRlXCIgKm5nSWY9XCJvcHRpb25zLnJvd3NEZWxldGFibGVcIj48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS1Hcm91cGhlYWRlci0tPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJncm91cGhlYWRlclwiIGxldC1yb3dEYXRhPlxyXG4gICAgICAgICAgICA8dHIgcFJvd0dyb3VwSGVhZGVyIGNsYXNzPVwicm93R3JvdXBpbmdcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xkaXZdPVwiY29sdW1ucy5sZW5ndGggKyAxXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0X2JvbGRcIj57eyByb3dEYXRhW29wdGlvbnMuZ3JvdXBpbmcub2JqXVtvcHRpb25zLmdyb3VwaW5nLmxpYmVsbGVdIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwhLS0gTE9BRElORyBCT0RZIC0tPlxyXG4gICAgICAgIDwhLS08bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwibG9hZGluZ2JvZHlcIiBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDx0ciBzdHlsZT1cImhlaWdodDo0MXB4XCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgW2ZvemVuXT1cImNvbC5mcm96ZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXNrZWxldG9uIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6ICcxMDAlJyB9XCI+PC9wLXNrZWxldG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBldmVuID0gZXZlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwieyAnd2lkdGgnIDogJzEwMCUnIH1cIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2VsbERlbGV0ZVwiICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtc2tlbGV0b24gW25nU3R5bGVdPVwieyAnd2lkdGgnIDogJzEwMCUnIH1cIj48L3Atc2tlbGV0b24+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+LS0+XHJcblxyXG4gICAgICAgIDwhLS0gQm9keSAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dHIgaWQ9XCJ7eyByb3dEYXRhLmlkIH19XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhLmNvbG9yID8gcm93RGF0YS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3ddPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICBbcFNlbGVjdGFibGVSb3dEaXNhYmxlZF09XCIhb3B0aW9ucy5zZWxlY3RhYmxlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXNNb2RlQ2hlY2tib3hTZWxlY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjZWxsRGVsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggW3ZhbHVlXT1cInJvd0RhdGFcIiBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seVwiPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdUZXh0JywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5dPVwicm93RGF0YVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwRWRpdGFibGVDb2x1bW5GaWVsZF09XCJjb2wuaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnVGV4dCcsIGNvbCkgJiYgKCFpc01vZGVFZGl0aW9uKCkgfHwgcm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncGFkZGluZ0NlbGwnOiByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd24gKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFLZXk9XCJJRFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJBdWN1biByw6lzdWx0YXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFzZVpJbmRleF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnYmFzZVpJbmRleCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ZpcnR1YWxTY3JvbGwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRWRpdENlbGwocm93RGF0YSwgY29sLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRHJvcGRvd24nLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZVtnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKV0gOiAnJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ2lsb2cgTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaWxvZy1pbnB1dC1udW1iZXIgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbklucHV0TnVtYmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1ZmZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3ByZWZpeCcpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgKyAnICcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEZWNpbWFsc109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSAhPSBudWxsICYmIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpID09IHRydWUgPyAwIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpICE9IG51bGwgPyBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWF4RGVjaW1hbGVzJykgOiAyIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NpbG9nLWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQ2lsb2dOdW1iZXInLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgfCBudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6IGNvbC5wb3NpdGlvbiA9PSAnbGVmdCcgPyAndGV4dC1sZWZ0JyA6ICd0ZXh0LWNlbnRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCI+e3sgZ2V0Rm9ybWF0dGVkTnVtYmVyKGNvbCwgcm93RGF0YSwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTnVtYmVyJywgY29sKSAmJiBpc01vZGVFZGl0aW9uKCkgJiYgIXJvd0RhdGEucmVhZG9ubHkgJiYgIXJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgbnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZT1cImZyLUZSXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25JbnB1dE51bWJlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3Nob3dCdXR0b25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRTdHlsZUNsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWZmaXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ3N1ZmZpeCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZWZpeF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAncHJlZml4JykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdwcmVmaXgnKSArICcgJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW4nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlSW50ZWdlcicpICE9IG51bGwgJiYgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgPT0gdHJ1ZSA/IDAgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGVjaW1hbGVzJykgIT0gbnVsbCA/IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtaW5EZWNpbWFsZXMnKSA6IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGVJbnRlZ2VyJykgIT0gbnVsbCAmJiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZUludGVnZXInKSA9PSB0cnVlID8gMCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtYXhEZWNpbWFsZXMnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERlY2ltYWxlcycpIDogMiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRWRpdEluaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ051bWJlcicsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IG51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbC5wb3NpdGlvbiA9PSBudWxsIHx8IGNvbC5wb3NpdGlvbiA9PSAncmlnaHQnID8gJ3RleHQtcmlnaHQnIDogY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogJ3RleHQtY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBGcm96ZW5Db2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF1cIj57eyBnZXRGb3JtYXR0ZWROdW1iZXIoY29sLCByb3dEYXRhLCByb3dEYXRhW2NvbC5pZF0udmFsdWUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRGF0ZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IGRhdGU6ICdkZC9NTS95eXl5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2FsZW5kYXIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2NvbC5pZF0udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld109XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09IG51bGwgPyAnZGF0ZScgOiBnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAneWVhcicgPyAneXknIDogZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21vZGUnKSA9PSAnbW9udGgnID8gJ21tL3l5JyA6ICdkZC9tbS95eSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdERheU9mV2Vlaz1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJvbkVkaXRDZWxsKHJvd0RhdGEsIGNvbCwgcm93RGF0YVtjb2wuaWRdLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFN0eWxlQ2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5SW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2NsZWFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbWluRGF0ZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ21heERhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0RGF0ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnZGVmYXVsdERhdGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0RhdGUnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdtaW4td2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwicm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS50b29sdGlwIDogcm93RGF0YVtjb2wuaWRdLnZhbHVlIHwgZGF0ZTogJ2RkL01NL3l5eXknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSB8IGRhdGU6IChnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnbW9kZScpID09ICd5ZWFyJyA/ICd5eXl5JyA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdtb2RlJykgPT0gJ21vbnRoJyA/ICdNTS95eXl5JyA6ICdkZC9NTS95eXl5JykgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE11bHRpU2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnTXVsdGlTZWxlY3QnLCBjb2wpICYmIGlzTW9kZUVkaXRpb24oKSAmJiAhcm93RGF0YS5yZWFkb25seSAmJiAhcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiBnZXRNdWx0aVNlbGVjdENvbmNhdChyb3dEYXRhW2NvbC5pZF0udmFsdWUsIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdmaWx0ZXInKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uTGFiZWwnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUtleT1cIklEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlGaWx0ZXJNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiQXVjdW4gcsOpc3VsdGF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Jhc2VaSW5kZXhdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2Jhc2VaSW5kZXgnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2aXJ0dWFsU2Nyb2xsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICd2aXJ0dWFsU2Nyb2xsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHNlbGVjdGlvbm7DqXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiZWRpdE11bHRpc2VsZWN0KHJvd0RhdGEsIGNvbCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2ZpbHRlcicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cENoaWxkcmVuJykgIT0gbnVsbCA/IHRydWUgOiBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Hcm91cExhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25Hcm91cExhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uR3JvdXBDaGlsZHJlbicpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJjb2wucG9zaXRpb24gPT0gbnVsbCB8fCBjb2wucG9zaXRpb24gPT0gJ2xlZnQnID8gJ3RleHQtbGVmdCcgOiBjb2wucG9zaXRpb24gPT0gJ3JpZ2h0JyA/ICd0ZXh0LXJpZ2h0JyA6ICd0ZXh0LWNlbnRlcidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZ3JvdXAgcFRlbXBsYXRlPVwiZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7Z3JvdXBbY29sLm9wdGlvbnMub3B0aW9uR3JvdXBMYWJlbF19fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWNvbC5pbnZpc2libGUgJiYgY2hlY2tUeXBlKCdNdWx0aVNlbGVjdCcsIGNvbCkgJiYgKHJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyA6IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgPyByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBEaXNhYmxlZF09XCIhY29sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sLnBvc2l0aW9uID09IG51bGwgfHwgY29sLnBvc2l0aW9uID09ICdsZWZ0JyA/ICd0ZXh0LWxlZnQnIDogY29sLnBvc2l0aW9uID09ICdyaWdodCcgPyAndGV4dC1yaWdodCcgOiAndGV4dC1jZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldE11bHRpU2VsZWN0Q29uY2F0KHJvd0RhdGFbY29sLmlkXS52YWx1ZSwgZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvbkxhYmVsJykpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJbWFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ltYWdlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdXCIgc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aWR0aDogNDBweDtcIiBzcmM9XCJ7eyByb3dEYXRhW2NvbC5pZF0udmFsdWUgfX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnQnV0dG9uJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFkZGluZ0NlbGwgdGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIncC1idXR0b24tJyArIGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdzZXZlcml0eScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2xhYmVsJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdpY29uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IGdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdsYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1NlbGVjdEJ1dHRvbicsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zyb3plbl09XCJjb2wuZnJvemVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiPnt7IGNvbC5saWJlbGxlIH19IDogPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25zJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJnZXRPcHRpb24oY29sLCByb3dEYXRhLCAnb3B0aW9uVmFsdWUnKSAhPSBudWxsID8gZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ29wdGlvblZhbHVlJykgOiAndmFsdWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnU2VsZWN0QnV0dG9uJywgY29sKSAmJiAocm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA/IHJvd0RhdGFbY29sLmlkXS50ZXh0Q29sb3IgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3sgcm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0uaWQgOiAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IGdldFNlbGVjdExpYmVsbGVCeVZhbHVlKHJvd0RhdGEsIGNvbCkgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFN3aXRjaCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N3aXRjaCcsIGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLCAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXRTd2l0Y2ggKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAoZ2V0T3B0aW9uKGNvbCwgcm93RGF0YSwgJ2FjdGlvbicpID09IG51bGwgJiYgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25FZGl0Q2VsbChyb3dEYXRhLCBjb2wsIHJvd0RhdGFbY29sLmlkXS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtaW5wdXRTd2l0Y2g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFjb2wuaW52aXNpYmxlICYmIGNoZWNrVHlwZSgnRmlsZScsIGNvbCkgJiYgaXNNb2RlRWRpdGlvbigpICYmICFyb3dEYXRhLnJlYWRvbmx5ICYmICFyb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGgnIDogY29sLndpZHRoID8gY29sLndpZHRoIDogbnVsbCwgJ2JhY2tncm91bmQtY29sb3InOiByb3dEYXRhW2NvbC5pZF0uY29sb3IgPyByb3dEYXRhW2NvbC5pZF0uY29sb3IgOiBudWxsIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7IHJvd0RhdGFbY29sLmlkXSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLmlkIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/ICdwYWRkaW5nQ2VsbCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiICpuZ0lmPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdXBsb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQnlJZCgnaW5wdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93RGF0YS5yZWFkb25seSB8fCByb3dEYXRhW2NvbC5pZF0/LnJlYWRvbmx5IHx8ICFpc01vZGVFZGl0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwie3snb3V0cHV0XycgKyByb3dEYXRhW2NvbC5pZF0uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnZhbHVlIDogJycgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInJvd0RhdGFbY29sLmlkXS50b29sdGlwICE9IG51bGwgPyByb3dEYXRhW2NvbC5pZF0udG9vbHRpcCA6IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcERpc2FibGVkXT1cIiFjb2wudG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImdldE9wdGlvbihjb2wsIHJvd0RhdGEsICdkb3dubG9hZFBhdGgnKSAmJiByb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWRvd25sb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkRmlsZShyb3dEYXRhW2NvbC5pZF0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHkgfHwgcm93RGF0YVtjb2wuaWRdPy5yZWFkb25seSB8fCAhaXNNb2RlRWRpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiIGlkPVwie3snaW5wdXRfJyArIHJvd0RhdGFbY29sLmlkXS5pZH19XCIgI2lucHV0RmlsZSBwSW5wdXRUZXh0IHR5cGU9XCJmaWxlXCIgaGlkZGVuIChjaGFuZ2UpPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlID0gaW5wdXRGaWxlLmZpbGVzWzBdLm5hbWU7IG9uRWRpdENlbGwocm93RGF0YSwgY29sLCBpbnB1dEZpbGUuZmlsZXNbMF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ0ZpbGUnLCBjb2wpICYmIChyb3dEYXRhLnJlYWRvbmx5IHx8IHJvd0RhdGFbY29sLmlkXT8ucmVhZG9ubHkgfHwgIWlzTW9kZUVkaXRpb24oKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgOiBjb2wud2lkdGggPyBjb2wud2lkdGggOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHJvd0RhdGFbY29sLmlkXS5jb2xvciA/IHJvd0RhdGFbY29sLmlkXS5jb2xvciA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcicgOiByb3dEYXRhW2NvbC5pZF0udGV4dENvbG9yID8gcm93RGF0YVtjb2wuaWRdLnRleHRDb2xvciA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJyb3dEYXRhW2NvbC5pZF0udG9vbHRpcCAhPSBudWxsID8gcm93RGF0YVtjb2wuaWRdLnRvb2x0aXAgOiByb3dEYXRhW2NvbC5pZF0udmFsdWUgPyByb3dEYXRhW2NvbC5pZF0udmFsdWUgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwRGlzYWJsZWRdPVwiIWNvbC50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEZyb3plbkNvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZnJvemVuXT1cImNvbC5mcm96ZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCI+e3sgY29sLmxpYmVsbGUgfX0gOiA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbY29sLmlkXVwiPnt7IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA/IHJvd0RhdGFbY29sLmlkXS52YWx1ZSA6ICcnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhY29sLmludmlzaWJsZSAmJiBjaGVja1R5cGUoJ1N0YXRlJywgY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ3dpZHRoJyA6IGNvbC53aWR0aCA/IGNvbC53aWR0aCA6IG51bGwsICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLmNvbG9yID8gcm93RGF0YVtjb2wuaWRdLmNvbG9yIDogbnVsbCB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7eyByb3dEYXRhW2NvbC5pZF0gIT0gbnVsbCA/IHJvd0RhdGFbY29sLmlkXS5pZCA6ICcnIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtjb2wuaWRdICE9IG51bGwgPyAncGFkZGluZ0NlbGwnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwRnJvemVuQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmcm96ZW5dPVwiY29sLmZyb3plblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIj57eyBjb2wubGliZWxsZSB9fSA6IDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC10YWcgKm5nSWY9XCJyb3dEYXRhW2NvbC5pZF0udmFsdWUgIT0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlW2dldE9wdGlvbihjb2wsIHJvd0RhdGEsICdvcHRpb25MYWJlbCcpXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2V2ZXJpdHldPVwicm93RGF0YVtjb2wuaWRdLnZhbHVlLnNldmVyaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInJvd0RhdGFbY29sLmlkXS52YWx1ZS5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLmJhY2tncm91bmRDb2xvciwgJ2NvbG9yJzogcm93RGF0YVtjb2wuaWRdLnZhbHVlLnRleHRDb2xvciB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcC10YWc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIERlbGV0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwib3B0aW9ucy5yb3dzRGVsZXRhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNlbGxEZWxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGEuZGVsZXRhYmxlID8gJ3BhZGRpbmdDZWxsJyA6IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm93RGF0YS5kZWxldGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIgYnV0dG9uRGVsZXRlIHAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTGluZShyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvcC10YWJsZT5cclxuPC9kaXY+XHJcbiJdfQ==
|