tnx-shared 5.2.28 → 5.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/docker/docker-entrypoint.sh +1 -1
- package/classes/base/list-component-base.d.ts +19 -5
- package/classes/base/list-component-base.d.ts.map +1 -1
- package/classes/environment-schema.d.ts +23 -20
- package/classes/environment-schema.d.ts.map +1 -1
- package/classes/public-function.d.ts +1 -0
- package/classes/public-function.d.ts.map +1 -1
- package/components/chat/chat-box/chat-box.component.d.ts.map +1 -1
- package/components/common-app-component/common-app-component.d.ts +1 -3
- package/components/common-app-component/common-app-component.d.ts.map +1 -1
- package/components/crud/advance-search/advance-search.component.d.ts +6 -6
- package/components/crud/advance-search/advance-search.component.d.ts.map +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +6 -0
- package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
- package/components/dropdown/dropdown.component.d.ts +5 -3
- package/components/dropdown/dropdown.component.d.ts.map +1 -1
- package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
- package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts +3 -0
- package/components/query-builders/query-builder-rule/query-builder-rule.component.d.ts.map +1 -1
- package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
- package/components/tn-tinymce/tn-tinymce.component.d.ts +2 -0
- package/components/tn-tinymce/tn-tinymce.component.d.ts.map +1 -1
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts +1 -0
- package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
- package/directives/primeng/tn-table.directive.d.ts +7 -6
- package/directives/primeng/tn-table.directive.d.ts.map +1 -1
- package/esm2020/classes/base/list-component-base.mjs +56 -32
- package/esm2020/classes/environment-schema.mjs +10 -1
- package/esm2020/classes/public-function.mjs +3 -1
- package/esm2020/components/add-news/add-news.component.mjs +3 -3
- package/esm2020/components/autocomplete-picker/autocomplete-picker.component.mjs +2 -2
- package/esm2020/components/chat/chat-box/chat-box.component.mjs +3 -4
- package/esm2020/components/chat/chat-send-message-box/chat-send-message-box.component.mjs +2 -2
- package/esm2020/components/common-app-component/common-app-component.mjs +57 -57
- package/esm2020/components/common-dashboard/common-dashboard.component.mjs +3 -3
- package/esm2020/components/crud/advance-search/advance-search.component.mjs +28 -19
- package/esm2020/components/crud/crud-form/crud-form.component.mjs +12 -4
- package/esm2020/components/crud/crud-list/crud-list.component.mjs +3 -3
- package/esm2020/components/crud/tree-table/tree-table.component.mjs +3 -3
- package/esm2020/components/dropdown/dropdown.component.mjs +29 -24
- package/esm2020/components/entity-permission/entity-permission.component.mjs +3 -3
- package/esm2020/components/entity-picker/entity-picker-box/entity-picker-box.component.mjs +3 -3
- package/esm2020/components/entity-picker/entity-picker-dialog/entity-picker-dialog.component.mjs +3 -3
- package/esm2020/components/file-explorer/file-manager/file-manager.component.mjs +3 -3
- package/esm2020/components/main-list/main-list.component.mjs +3 -3
- package/esm2020/components/query-builders/query-builder-rule/query-builder-rule.component.mjs +8 -3
- package/esm2020/components/radio-button-list/radio-button-list.component.mjs +3 -3
- package/esm2020/components/report-queue/report-queue.component.mjs +2 -2
- package/esm2020/components/settings/settings.component.mjs +3 -3
- package/esm2020/components/tn-app-help/tn-app-help.component.mjs +3 -3
- package/esm2020/components/tn-app-notification/tn-app-notification.component.mjs +3 -3
- package/esm2020/components/tn-custom-scrollbar/tn-custom-scrollbar.component.mjs +5 -4
- package/esm2020/components/tn-tinymce/tn-tinymce.component.mjs +7 -3
- package/esm2020/components/user-picker/user-picker-box/user-picker-box.component.mjs +3 -3
- package/esm2020/components/user-picker/user-picker.component.mjs +2 -2
- package/esm2020/components/workflow/workflow-picker/workflow-picker.component.mjs +3 -3
- package/esm2020/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.mjs +3 -3
- package/esm2020/congviec/congviec/congviec-form/congviec-form.component.mjs +6 -3
- package/esm2020/congviec/congviec/congviec.component.mjs +3 -3
- package/esm2020/directives/primeng/tn-table.directive.mjs +28 -13
- package/esm2020/services/common.service.mjs +11 -3
- package/esm2020/services/environment.service.mjs +48 -7
- package/esm2020/services/permission.service.mjs +12 -15
- package/esm2020/services/position.service.mjs +2 -2
- package/esm2020/services/signalr.service.mjs +3 -3
- package/esm2020/services/tn-client.service.mjs +30 -25
- package/esm2020/tnx-shared.module.mjs +14 -8
- package/fesm2015/tnx-shared.mjs +587 -445
- package/fesm2015/tnx-shared.mjs.map +1 -1
- package/fesm2020/tnx-shared.mjs +587 -445
- package/fesm2020/tnx-shared.mjs.map +1 -1
- package/package.json +2 -2
- package/services/common.service.d.ts +6 -0
- package/services/common.service.d.ts.map +1 -1
- package/services/environment.service.d.ts +32 -23
- package/services/environment.service.d.ts.map +1 -1
- package/services/permission.service.d.ts +5 -0
- package/services/permission.service.d.ts.map +1 -1
- package/services/position.service.d.ts.map +1 -1
- package/services/signalr.service.d.ts +1 -1
- package/services/signalr.service.d.ts.map +1 -1
- package/services/tn-client.service.d.ts +3 -1
- package/services/tn-client.service.d.ts.map +1 -1
- package/tnx-shared.module.d.ts +12 -11
- package/tnx-shared.module.d.ts.map +1 -1
|
@@ -75,9 +75,9 @@ export class TreeTableComponent extends ListComponentBase {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
TreeTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: TreeTableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
78
|
-
TreeTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: TreeTableComponent, selector: "tn-tree-table", usesInheritance: true, ngImport: i0, template: "<div #container class=\"custom-card card card-w-title tn-g-page-layout-1\">\r\n <div class=\"ui-helper-clearfix tn-g-page-layout-1__header-area\">\r\n <div *ngIf=\"hasTemplate('searchCustom')\" class=\"p-grid ui-fluid custom-p-col custom-search-area\"\r\n [class.collapsed]=\"!expandedSearch\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('searchCustom'); context: {$implicit: this}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"collapse-expand\" (click)=\"expandedSearch = !expandedSearch\">\r\n <span class=\"pi\" [class.pi-caret-up]=\"expandedSearch\" [class.pi-caret-down]=\"!expandedSearch\"></span>\r\n </div>\r\n </div>\r\n <div class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div class=\"main-title p-col-8\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{\r\n crudList: this,\r\n buttonAdd: buttonAdd, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div class=\"p-col-4\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"p-grid crudListToolbar tn-g-page-layout-1__toolbar-area\">\r\n <div class=\"p-col-7 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button pButton pRipple type=\"button\" label=\"\u0110\u00E1nh l\u1EA1i m\u00E3 ph\u00E2n c\u1EA5p\" icon=\"pi pi-share-alt\"\r\n class=\"p-button-text\" style=\"display: none;\" (click)=\"handleDanhMaPC($event)\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n <div class=\"p-col-5 p-inputgroup advance-search-container\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListAdvanceSearch']; context: {\r\n parentSetting: setting, searchInfo: searchInfo, loading: model.loading, onSearch: handleSearchAdvs,\r\n onInit: handleInitAdvanceSearch\r\n }\"></ng-container>\r\n <!-- <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\" [loading]=\"model.loading\"\r\n (onSearch)=\"handleSearchAdvs($event)\" (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div class=\"tn-g-page-layout-1__table-area\">\r\n <tn-custom-scrollbar [showScrollHorizontal]=\"true\" class=\"--has-border\">\r\n <p-treeTable #treetable [value]=\"_dataSource\" [columns]=\"setting.cols\" styleClass=\"treeOrganization\">\r\n <ng-template pTemplate=\"colgroup\" let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" style=\"width: 50px\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" style=\"width: 50px\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox\">\r\n <button type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\r\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"getData()\"></button>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ttSortableColumn]=\"col.field\"\r\n [className]=\"col.class\" [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\"\r\n style=\"text-align: center;\">\r\n {{col.label}}\r\n <p-treeTableSortIcon [field]=\"col.field\"></p-treeTableSortIcon>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n Ch\u1EE9c n\u0103ng\r\n </th>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\" let-index=\"rowIndex\"\r\n let-columns=\"columns\">\r\n <tr [ttRow]=\"rowNode\" [class.generated-by-base]=\"rowData._GeneratedByBase\"\r\n [attr.rowIndex]=\"rowData[fieldIndexInDataSource]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\"\r\n (onChange)=\"handleCheckRowData(rowData)\">\r\n </p-checkbox>\r\n </td>\r\n <td class=\"chkbox link-or-action cell-checkbox\">{{rowData[fieldOrder]}}</td>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, rowNode: rowNode, col: col, index: index, i: i}\">\r\n </ng-container>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n [disabled]=\"disableEdit(rowData)\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-pencil\" (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <!-- <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button> -->\r\n </div>\r\n </td>\r\n </tr>\r\n <after-view-checked *ngIf=\"rowData._index == _rawDataSource.length - 1\" style=\"display: none;\"\r\n [renderKey]=\"dataSource\" (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n </p-treeTable>\r\n <div class=\"row-bottom-sticky\"></div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</div>\r\n<ng-template #buttonAdd>\r\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\r\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n </span>\r\n</ng-template>\r\n<ng-template #buttonDelete>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-rowNode=\"rowNode\" let-col=\"col\" let-index=\"index\" let-i=\"i\"\r\n let-expanded=\"expanded\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <tn-treeTableToggler *ngIf=\"col.colHasToggleIcon\" [rowNode]=\"rowNode\"></tn-treeTableToggler>\r\n <span *ngIf=\"col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"col.template; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #customTemplateCell let-template let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-col=\"col\"\r\n let-expanded=\"expanded\">\r\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{\r\n $implicit: rowData, \r\n crudList: this,\r\n rowIndex,\r\n col,\r\n field: col.field,\r\n expanded,\r\n iconToggleRowData: this.iconToggleRowData\r\n }\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"handleCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <!-- <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button> -->\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>", styles: [".filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.advance-search-container{display:flex;justify-content:flex-end}::ng-deep tn-tree-table advance-search{display:block;flex:1;max-width:400px}::ng-deep tn-tree-table .ps__rail-x,::ng-deep tn-tree-table .ps__rail-y{z-index:5}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep tn-tree-table tr.generated-by-base td.chkbox{background:#e9ecef}::ng-deep tn-tree-table .cell-header-filter{position:relative}::ng-deep tn-tree-table .cell-header-filter .tn-dropdown{height:32px}::ng-deep tn-tree-table .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep tn-tree-table .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep tn-tree-table .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep tn-tree-table .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;outline:none}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep tn-tree-table .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep tn-tree-table .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep tn-tree-table .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep tn-tree-table .cell-header-filter:focus-within,::ng-deep tn-tree-table .cell-header-filter.focus-within{z-index:10!important}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px #00000045}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>div{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep tn-tree-table .cell-header-filter:last-child .filter-box{right:3px}::ng-deep tn-tree-table .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep tn-tree-table .table-border-line.--left,::ng-deep tn-tree-table .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep tn-tree-table .table-border-line.--top,::ng-deep tn-tree-table .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep tn-tree-table .table-border-line.--left{left:0}::ng-deep tn-tree-table .table-border-line.--right{right:0}::ng-deep tn-tree-table .table-border-line.--top{top:0}::ng-deep tn-tree-table .table-border-line.--bottom{bottom:0}::ng-deep tn-tree-table .filter-boolean-box{text-align:center}::ng-deep tn-tree-table .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep tn-tree-table .custom-search-area crud-form{width:100%}::ng-deep tn-tree-table>p-contextmenu{display:none}\n"], dependencies: [{ kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "component", type: i7.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "directive", type: i8.InputText, selector: "[pInputText]" }, { kind: "component", type: i9.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "virtualRowHeight", "value", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel"] }, { kind: "directive", type: i9.TTSortableColumn, selector: "[ttSortableColumn]", inputs: ["ttSortableColumn", "ttSortableColumnDisabled"] }, { kind: "component", type: i9.TTSortIcon, selector: "p-treeTableSortIcon", inputs: ["field", "ariaLabelDesc", "ariaLabelAsc"] }, { kind: "directive", type: i9.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: i10.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i11.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i12.DatetimePickerRangeComponent, selector: "tn-datetime-picker-range", inputs: ["control", "disabled"], outputs: ["onInit", "onClose", "onChanged"] }, { kind: "component", type: i13.DropdownComponent, selector: "dropdown", inputs: ["showClear", "disableDisplayFieldServerSearch", "filter", "control", "defaultLabel", "appendTo", "dataSource", "value", "itemSelectedStyleClass"], outputs: ["onInit", "onChanged", "onCollapse", "onExpand", "onDropdownClick", "onShow", "onShowSmartEvent", "onHide", "onHideSmartEvent", "onFocus", "onBlur", "onReady", "onDataSourceLoaded", "valueChange", "adjustValue"] }, { kind: "component", type: i14.NumberPickerRangeComponent, selector: "tn-number-picker-range", inputs: ["readonly", "maskType", "placeholder", "disabled", "suffix", "prefix", "min", "max", "decimalPlaces"], outputs: ["onInit", "focus", "enterSmart", "enter", "blur", "change"] }, { kind: "component", type: i15.PagingNextBackOnlyComponent, selector: "paging-next-back-only", inputs: ["model", "setting", "ngClass"], outputs: ["onNext", "onPrev", "onLatest", "onRefresh", "onOldest", "onChangeLimitPage", "onChanged"] }, { kind: "component", type: i16.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "directive", type: i17.AuthorizeDirective, selector: "[appAuthorize]", inputs: ["appAuthorize", "permissionType", "isNavigationPermission", "controller", "permission", "enableAuthorize", "keepHTML"] }, { kind: "component", type: i18.TnTreeTableToggler, selector: "tn-treeTableToggler", inputs: ["rowNode"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }, { kind: "pipe", type: i20.SafeHtmlPipe, name: "safeHtml" }, { kind: "pipe", type: i21.UserFormatPipe, name: "userFormat" }, { kind: "pipe", type: i22.UsersFormatPipe, name: "usersFormat" }] });
|
|
78
|
+
TreeTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: TreeTableComponent, selector: "tn-tree-table", usesInheritance: true, ngImport: i0, template: "<div #container class=\"custom-card card card-w-title tn-g-page-layout-1\">\r\n <div class=\"ui-helper-clearfix tn-g-page-layout-1__header-area\">\r\n <div *ngIf=\"hasTemplate('searchCustom')\" class=\"grid ui-fluid custom-col custom-search-area\"\r\n [class.collapsed]=\"!expandedSearch\">\r\n <div class=\"col-12 main-container-search\">\r\n <div class=\"grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('searchCustom'); context: {$implicit: this}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"collapse-expand\" (click)=\"expandedSearch = !expandedSearch\">\r\n <span class=\"pi\" [class.pi-caret-up]=\"expandedSearch\" [class.pi-caret-down]=\"!expandedSearch\"></span>\r\n </div>\r\n </div>\r\n <div class=\"grid ui-fluid custom-col page-title-area\">\r\n <div class=\"main-title col-8\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{\r\n crudList: this,\r\n buttonAdd: buttonAdd, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div class=\"col-4\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"grid crudListToolbar tn-g-page-layout-1__toolbar-area\">\r\n <div class=\"col-7 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button pButton pRipple type=\"button\" label=\"\u0110\u00E1nh l\u1EA1i m\u00E3 ph\u00E2n c\u1EA5p\" icon=\"pi pi-share-alt\"\r\n class=\"p-button-text\" style=\"display: none;\" (click)=\"handleDanhMaPC($event)\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n <div class=\"col-5 p-inputgroup advance-search-container\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListAdvanceSearch']; context: {\r\n parentSetting: setting, searchInfo: searchInfo, loading: model.loading, onSearch: handleSearchAdvs,\r\n onInit: handleInitAdvanceSearch\r\n }\"></ng-container>\r\n <!-- <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\" [loading]=\"model.loading\"\r\n (onSearch)=\"handleSearchAdvs($event)\" (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div class=\"tn-g-page-layout-1__table-area\">\r\n <tn-custom-scrollbar [showScrollHorizontal]=\"true\" class=\"--has-border\">\r\n <p-treeTable #treetable [value]=\"_dataSource\" [columns]=\"setting.cols\" styleClass=\"treeOrganization\">\r\n <ng-template pTemplate=\"colgroup\" let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" style=\"width: 50px\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" style=\"width: 50px\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox\">\r\n <button type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\r\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"getData()\"></button>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ttSortableColumn]=\"col.field\"\r\n [className]=\"col.class\" [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\"\r\n style=\"text-align: center;\">\r\n {{col.label}}\r\n <p-treeTableSortIcon [field]=\"col.field\"></p-treeTableSortIcon>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n Ch\u1EE9c n\u0103ng\r\n </th>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\" let-index=\"rowIndex\"\r\n let-columns=\"columns\">\r\n <tr [ttRow]=\"rowNode\" [class.generated-by-base]=\"rowData._GeneratedByBase\"\r\n [attr.rowIndex]=\"rowData[fieldIndexInDataSource]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\"\r\n (onChange)=\"handleCheckRowData(rowData)\">\r\n </p-checkbox>\r\n </td>\r\n <td class=\"chkbox link-or-action cell-checkbox\">{{rowData[fieldOrder]}}</td>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, rowNode: rowNode, col: col, index: index, i: i}\">\r\n </ng-container>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n [disabled]=\"disableEdit(rowData)\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-pencil\" (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <!-- <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button> -->\r\n </div>\r\n </td>\r\n </tr>\r\n <after-view-checked *ngIf=\"rowData._index == _rawDataSource.length - 1\" style=\"display: none;\"\r\n [renderKey]=\"dataSource\" (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n </p-treeTable>\r\n <div class=\"row-bottom-sticky\"></div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</div>\r\n<ng-template #buttonAdd>\r\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\r\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n </span>\r\n</ng-template>\r\n<ng-template #buttonDelete>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-rowNode=\"rowNode\" let-col=\"col\" let-index=\"index\" let-i=\"i\"\r\n let-expanded=\"expanded\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <tn-treeTableToggler *ngIf=\"col.colHasToggleIcon\" [rowNode]=\"rowNode\"></tn-treeTableToggler>\r\n <span *ngIf=\"col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"col.template; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #customTemplateCell let-template let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-col=\"col\"\r\n let-expanded=\"expanded\">\r\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{\r\n $implicit: rowData, \r\n crudList: this,\r\n rowIndex,\r\n col,\r\n field: col.field,\r\n expanded,\r\n iconToggleRowData: this.iconToggleRowData\r\n }\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"handleCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <!-- <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button> -->\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>", styles: [".filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.advance-search-container{display:flex;justify-content:flex-end}::ng-deep tn-tree-table advance-search{display:block;flex:1;max-width:400px}::ng-deep tn-tree-table .ps__rail-x,::ng-deep tn-tree-table .ps__rail-y{z-index:5}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep tn-tree-table tr.generated-by-base td.chkbox{background:#e9ecef}::ng-deep tn-tree-table .cell-header-filter{position:relative}::ng-deep tn-tree-table .cell-header-filter .tn-dropdown{height:32px}::ng-deep tn-tree-table .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep tn-tree-table .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep tn-tree-table .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep tn-tree-table .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;outline:none}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep tn-tree-table .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep tn-tree-table .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep tn-tree-table .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep tn-tree-table .cell-header-filter:focus-within,::ng-deep tn-tree-table .cell-header-filter.focus-within{z-index:10!important}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px #00000045}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>div{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep tn-tree-table .cell-header-filter:last-child .filter-box{right:3px}::ng-deep tn-tree-table .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep tn-tree-table .table-border-line.--left,::ng-deep tn-tree-table .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep tn-tree-table .table-border-line.--top,::ng-deep tn-tree-table .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep tn-tree-table .table-border-line.--left{left:0}::ng-deep tn-tree-table .table-border-line.--right{right:0}::ng-deep tn-tree-table .table-border-line.--top{top:0}::ng-deep tn-tree-table .table-border-line.--bottom{bottom:0}::ng-deep tn-tree-table .filter-boolean-box{text-align:center}::ng-deep tn-tree-table .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep tn-tree-table .custom-search-area crud-form{width:100%}::ng-deep tn-tree-table>p-contextmenu{display:none}\n"], dependencies: [{ kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { 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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "component", type: i7.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "directive", type: i8.InputText, selector: "[pInputText]" }, { kind: "component", type: i9.TreeTable, selector: "p-treeTable", inputs: ["columns", "style", "styleClass", "tableStyle", "tableStyleClass", "autoLayout", "lazy", "lazyLoadOnInit", "paginator", "rows", "first", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "customSort", "selectionMode", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "compareSelectionBy", "rowHover", "loading", "loadingIcon", "showLoader", "scrollable", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "frozenColumns", "resizableColumns", "columnResizeMode", "reorderableColumns", "contextMenu", "rowTrackBy", "filters", "globalFilterFields", "filterDelay", "filterMode", "filterLocale", "virtualRowHeight", "value", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection"], outputs: ["selectionChange", "contextMenuSelectionChange", "onFilter", "onNodeExpand", "onNodeCollapse", "onPage", "onSort", "onLazyLoad", "sortFunction", "onColResize", "onColReorder", "onNodeSelect", "onNodeUnselect", "onContextMenuSelect", "onHeaderCheckboxToggle", "onEditInit", "onEditComplete", "onEditCancel"] }, { kind: "directive", type: i9.TTSortableColumn, selector: "[ttSortableColumn]", inputs: ["ttSortableColumn", "ttSortableColumnDisabled"] }, { kind: "component", type: i9.TTSortIcon, selector: "p-treeTableSortIcon", inputs: ["field", "ariaLabelDesc", "ariaLabelAsc"] }, { kind: "directive", type: i9.TTRow, selector: "[ttRow]", inputs: ["ttRow"] }, { kind: "component", type: i10.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i11.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i12.DatetimePickerRangeComponent, selector: "tn-datetime-picker-range", inputs: ["control", "disabled"], outputs: ["onInit", "onClose", "onChanged"] }, { kind: "component", type: i13.DropdownComponent, selector: "dropdown", inputs: ["showClear", "disableDisplayFieldServerSearch", "filter", "control", "defaultLabel", "appendTo", "dataSource", "value", "itemSelectedStyleClass"], outputs: ["onInit", "onChanged", "onCollapse", "onExpand", "onDropdownClick", "onShow", "onShowSmartEvent", "onHide", "onHideSmartEvent", "onFocus", "onBlur", "onReady", "onDataSourceLoaded", "valueChange", "adjustValue"] }, { kind: "component", type: i14.NumberPickerRangeComponent, selector: "tn-number-picker-range", inputs: ["readonly", "maskType", "placeholder", "disabled", "suffix", "prefix", "min", "max", "decimalPlaces"], outputs: ["onInit", "focus", "enterSmart", "enter", "blur", "change"] }, { kind: "component", type: i15.PagingNextBackOnlyComponent, selector: "paging-next-back-only", inputs: ["model", "setting", "ngClass"], outputs: ["onNext", "onPrev", "onLatest", "onRefresh", "onOldest", "onChangeLimitPage", "onChanged"] }, { kind: "component", type: i16.TnCustomScrollbarComponent, selector: "tn-custom-scrollbar", inputs: ["style", "useDefaultScrollBar", "autoMode", "class", "config", "whiteBackGround", "showScrollHorizontal"], outputs: ["scrollY", "scrollUp", "scrollDown", "scrollLeft", "scrollRight", "scrollYReachEnd", "scrollYReachStart", "scrollXReachEnd", "scrollXReachStart"] }, { kind: "directive", type: i17.AuthorizeDirective, selector: "[appAuthorize]", inputs: ["appAuthorize", "permissionType", "isNavigationPermission", "controller", "permission", "enableAuthorize", "keepHTML"] }, { kind: "component", type: i18.TnTreeTableToggler, selector: "tn-treeTableToggler", inputs: ["rowNode"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }, { kind: "pipe", type: i20.SafeHtmlPipe, name: "safeHtml" }, { kind: "pipe", type: i21.UserFormatPipe, name: "userFormat" }, { kind: "pipe", type: i22.UsersFormatPipe, name: "usersFormat" }] });
|
|
79
79
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: TreeTableComponent, decorators: [{
|
|
80
80
|
type: Component,
|
|
81
|
-
args: [{ selector: 'tn-tree-table', template: "<div #container class=\"custom-card card card-w-title tn-g-page-layout-1\">\r\n <div class=\"ui-helper-clearfix tn-g-page-layout-1__header-area\">\r\n <div *ngIf=\"hasTemplate('searchCustom')\" class=\"p-grid ui-fluid custom-p-col custom-search-area\"\r\n [class.collapsed]=\"!expandedSearch\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('searchCustom'); context: {$implicit: this}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"collapse-expand\" (click)=\"expandedSearch = !expandedSearch\">\r\n <span class=\"pi\" [class.pi-caret-up]=\"expandedSearch\" [class.pi-caret-down]=\"!expandedSearch\"></span>\r\n </div>\r\n </div>\r\n <div class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div class=\"main-title p-col-8\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{\r\n crudList: this,\r\n buttonAdd: buttonAdd, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div class=\"p-col-4\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"p-grid crudListToolbar tn-g-page-layout-1__toolbar-area\">\r\n <div class=\"p-col-7 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button pButton pRipple type=\"button\" label=\"\u0110\u00E1nh l\u1EA1i m\u00E3 ph\u00E2n c\u1EA5p\" icon=\"pi pi-share-alt\"\r\n class=\"p-button-text\" style=\"display: none;\" (click)=\"handleDanhMaPC($event)\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n <div class=\"p-col-5 p-inputgroup advance-search-container\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListAdvanceSearch']; context: {\r\n parentSetting: setting, searchInfo: searchInfo, loading: model.loading, onSearch: handleSearchAdvs,\r\n onInit: handleInitAdvanceSearch\r\n }\"></ng-container>\r\n <!-- <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\" [loading]=\"model.loading\"\r\n (onSearch)=\"handleSearchAdvs($event)\" (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div class=\"tn-g-page-layout-1__table-area\">\r\n <tn-custom-scrollbar [showScrollHorizontal]=\"true\" class=\"--has-border\">\r\n <p-treeTable #treetable [value]=\"_dataSource\" [columns]=\"setting.cols\" styleClass=\"treeOrganization\">\r\n <ng-template pTemplate=\"colgroup\" let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" style=\"width: 50px\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" style=\"width: 50px\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox\">\r\n <button type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\r\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"getData()\"></button>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ttSortableColumn]=\"col.field\"\r\n [className]=\"col.class\" [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\"\r\n style=\"text-align: center;\">\r\n {{col.label}}\r\n <p-treeTableSortIcon [field]=\"col.field\"></p-treeTableSortIcon>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n Ch\u1EE9c n\u0103ng\r\n </th>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\" let-index=\"rowIndex\"\r\n let-columns=\"columns\">\r\n <tr [ttRow]=\"rowNode\" [class.generated-by-base]=\"rowData._GeneratedByBase\"\r\n [attr.rowIndex]=\"rowData[fieldIndexInDataSource]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\"\r\n (onChange)=\"handleCheckRowData(rowData)\">\r\n </p-checkbox>\r\n </td>\r\n <td class=\"chkbox link-or-action cell-checkbox\">{{rowData[fieldOrder]}}</td>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, rowNode: rowNode, col: col, index: index, i: i}\">\r\n </ng-container>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n [disabled]=\"disableEdit(rowData)\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-pencil\" (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <!-- <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button> -->\r\n </div>\r\n </td>\r\n </tr>\r\n <after-view-checked *ngIf=\"rowData._index == _rawDataSource.length - 1\" style=\"display: none;\"\r\n [renderKey]=\"dataSource\" (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n </p-treeTable>\r\n <div class=\"row-bottom-sticky\"></div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</div>\r\n<ng-template #buttonAdd>\r\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\r\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n </span>\r\n</ng-template>\r\n<ng-template #buttonDelete>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-rowNode=\"rowNode\" let-col=\"col\" let-index=\"index\" let-i=\"i\"\r\n let-expanded=\"expanded\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <tn-treeTableToggler *ngIf=\"col.colHasToggleIcon\" [rowNode]=\"rowNode\"></tn-treeTableToggler>\r\n <span *ngIf=\"col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"col.template; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #customTemplateCell let-template let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-col=\"col\"\r\n let-expanded=\"expanded\">\r\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{\r\n $implicit: rowData, \r\n crudList: this,\r\n rowIndex,\r\n col,\r\n field: col.field,\r\n expanded,\r\n iconToggleRowData: this.iconToggleRowData\r\n }\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"handleCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <!-- <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button> -->\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>", styles: [".filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.advance-search-container{display:flex;justify-content:flex-end}::ng-deep tn-tree-table advance-search{display:block;flex:1;max-width:400px}::ng-deep tn-tree-table .ps__rail-x,::ng-deep tn-tree-table .ps__rail-y{z-index:5}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep tn-tree-table tr.generated-by-base td.chkbox{background:#e9ecef}::ng-deep tn-tree-table .cell-header-filter{position:relative}::ng-deep tn-tree-table .cell-header-filter .tn-dropdown{height:32px}::ng-deep tn-tree-table .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep tn-tree-table .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep tn-tree-table .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep tn-tree-table .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;outline:none}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep tn-tree-table .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep tn-tree-table .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep tn-tree-table .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep tn-tree-table .cell-header-filter:focus-within,::ng-deep tn-tree-table .cell-header-filter.focus-within{z-index:10!important}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px #00000045}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>div{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep tn-tree-table .cell-header-filter:last-child .filter-box{right:3px}::ng-deep tn-tree-table .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep tn-tree-table .table-border-line.--left,::ng-deep tn-tree-table .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep tn-tree-table .table-border-line.--top,::ng-deep tn-tree-table .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep tn-tree-table .table-border-line.--left{left:0}::ng-deep tn-tree-table .table-border-line.--right{right:0}::ng-deep tn-tree-table .table-border-line.--top{top:0}::ng-deep tn-tree-table .table-border-line.--bottom{bottom:0}::ng-deep tn-tree-table .filter-boolean-box{text-align:center}::ng-deep tn-tree-table .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep tn-tree-table .custom-search-area crud-form{width:100%}::ng-deep tn-tree-table>p-contextmenu{display:none}\n"] }]
|
|
81
|
+
args: [{ selector: 'tn-tree-table', template: "<div #container class=\"custom-card card card-w-title tn-g-page-layout-1\">\r\n <div class=\"ui-helper-clearfix tn-g-page-layout-1__header-area\">\r\n <div *ngIf=\"hasTemplate('searchCustom')\" class=\"grid ui-fluid custom-col custom-search-area\"\r\n [class.collapsed]=\"!expandedSearch\">\r\n <div class=\"col-12 main-container-search\">\r\n <div class=\"grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('searchCustom'); context: {$implicit: this}\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"collapse-expand\" (click)=\"expandedSearch = !expandedSearch\">\r\n <span class=\"pi\" [class.pi-caret-up]=\"expandedSearch\" [class.pi-caret-down]=\"!expandedSearch\"></span>\r\n </div>\r\n </div>\r\n <div class=\"grid ui-fluid custom-col page-title-area\">\r\n <div class=\"main-title col-8\">\r\n <h1 *ngIf=\"!hasTemplate('customTitle')\">\r\n {{setting.title != null ? setting.title : 'Danh s\u00E1ch ' + setting.objectName}}\r\n </h1>\r\n\r\n <ng-container *ngIf=\"hasTemplate('customTitle')\" [ngTemplateOutlet]=\"getTemplate('customTitle')\"\r\n [ngTemplateOutletContext]=\"{\r\n crudList: this,\r\n buttonAdd: buttonAdd, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div class=\"col-4\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"grid crudListToolbar tn-g-page-layout-1__toolbar-area\">\r\n <div class=\"col-7 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button pButton pRipple type=\"button\" label=\"\u0110\u00E1nh l\u1EA1i m\u00E3 ph\u00E2n c\u1EA5p\" icon=\"pi pi-share-alt\"\r\n class=\"p-button-text\" style=\"display: none;\" (click)=\"handleDanhMaPC($event)\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n <div class=\"col-5 p-inputgroup advance-search-container\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListAdvanceSearch']; context: {\r\n parentSetting: setting, searchInfo: searchInfo, loading: model.loading, onSearch: handleSearchAdvs,\r\n onInit: handleInitAdvanceSearch\r\n }\"></ng-container>\r\n <!-- <advance-search #advanceSearch [parentSetting]=\"setting\" [searchInfo]=\"searchInfo\" [loading]=\"model.loading\"\r\n (onSearch)=\"handleSearchAdvs($event)\" (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div class=\"tn-g-page-layout-1__table-area\">\r\n <tn-custom-scrollbar [showScrollHorizontal]=\"true\" class=\"--has-border\">\r\n <p-treeTable #treetable [value]=\"_dataSource\" [columns]=\"setting.cols\" styleClass=\"treeOrganization\">\r\n <ng-template pTemplate=\"colgroup\" let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" style=\"width: 50px\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" style=\"width: 50px\" />\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <col *ngIf=\"col && col.visible && col.field!='function'\" [style.width]=\"col.width\" />\r\n </ng-container>\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\"\r\n [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngIf=\"!setting.hiddenCheckbox\" class=\"chkbox\">\r\n <button type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\r\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"getData()\"></button>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\" (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col && col.visible && col.field!='function'\" [ttSortableColumn]=\"col.field\"\r\n [className]=\"col.class\" [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\"\r\n style=\"text-align: center;\">\r\n {{col.label}}\r\n <p-treeTableSortIcon [field]=\"col.field\"></p-treeTableSortIcon>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n Ch\u1EE9c n\u0103ng\r\n </th>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowNode let-rowData=\"rowData\" let-index=\"rowIndex\"\r\n let-columns=\"columns\">\r\n <tr [ttRow]=\"rowNode\" [class.generated-by-base]=\"rowData._GeneratedByBase\"\r\n [attr.rowIndex]=\"rowData[fieldIndexInDataSource]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\"\r\n (onChange)=\"handleCheckRowData(rowData)\">\r\n </p-checkbox>\r\n </td>\r\n <td class=\"chkbox link-or-action cell-checkbox\">{{rowData[fieldOrder]}}</td>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, rowNode: rowNode, col: col, index: index, i: i}\">\r\n </ng-container>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenFunctionColumn\" style=\"text-align: center;\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n [disabled]=\"disableEdit(rowData)\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-pencil\" (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <!-- <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button> -->\r\n </div>\r\n </td>\r\n </tr>\r\n <after-view-checked *ngIf=\"rowData._index == _rawDataSource.length - 1\" style=\"display: none;\"\r\n [renderKey]=\"dataSource\" (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n </p-treeTable>\r\n <div class=\"row-bottom-sticky\"></div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</div>\r\n<ng-template #buttonAdd>\r\n <span [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.ADD]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.ADD]\">\r\n <button type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n [disabled]=\"!model.baseReady\" (click)=\"add()\"></button>\r\n </span>\r\n</ng-template>\r\n<ng-template #buttonDelete>\r\n <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n [appAuthorize]=\"serviceCode\" [permission]=\"authorizePaths[commonConst.DELETE_MULTIPLE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE_MULTIPLE]\" type=\"button\" pButton pRipple\r\n [label]=\"'X\u00F3a ' + (model.selectedItems.length) | translate\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></button>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-rowNode=\"rowNode\" let-col=\"col\" let-index=\"index\" let-i=\"i\"\r\n let-expanded=\"expanded\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <tn-treeTableToggler *ngIf=\"col.colHasToggleIcon\" [rowNode]=\"rowNode\"></tn-treeTableToggler>\r\n <span *ngIf=\"col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: contentCell,\r\n rowData: rowData, rowIndex: index, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"col.template; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i [pTooltip]=\"rowData[field]\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy'\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" [pTooltip]=\"rowData[field] | date:'dd/MM/yyyy HH:mm'\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: getComponentByType(col.dataType),\r\n rowData: rowData, rowIndex: rowIndex, col: col, expanded: expanded\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #customTemplateCell let-template let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-col=\"col\"\r\n let-expanded=\"expanded\">\r\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{\r\n $implicit: rowData, \r\n crudList: this,\r\n rowIndex,\r\n col,\r\n field: col.field,\r\n expanded,\r\n iconToggleRowData: this.iconToggleRowData\r\n }\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n [class.tricheckbox-custom-false]=\"checkedAll === false\">\r\n <p-triStateCheckbox [(ngModel)]=\"checkedAll\" binary=\"true\" (onChange)=\"handleCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th class=\"chkbox nopad center\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"!setting.hiddenFunctionColumn\" class=\"center setting-cell column-function\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <!-- <button *ngIf=\"!setting.hiddenSetting\" type=\"button\" pButton pRipple icon=\"pi pi-cog\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB\" tooltipPosition=\"top\"\r\n (click)=\"showSettings()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingPermission\" type=\"button\" pButton pRipple icon=\"pi pi-users\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"Ph\u00E2n quy\u1EC1n d\u1EEF li\u1EC7u\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_PHAN_QUYEN)\" (click)=\"showSettingsPermission()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflow\" type=\"button\" pButton pRipple icon=\"pi pi-sitemap\"\r\n class=\"p-button-rounded p-button-text\" pTooltip=\"C\u1EA5u h\u00ECnh quy tr\u00ECnh\" tooltipPosition=\"left\"\r\n [disabled]=\"checkPermissionToUseButton(BUTTON_CAU_HINH_QUY_TRINH)\"\r\n (click)=\"showSettingsWorkflowNew()\"></button> -->\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </tr>\r\n</ng-template>\r\n<ng-template #filterDropdown let-col=\"col\">\r\n <div #filterBox style=\"width: 100%; border-radius: 4px;\">\r\n <dropdown *ngIf=\"col && filterSchema.dropdown[col.field]\" [control]=\"filterSchema.dropdown[col.field]\"\r\n [dataSource]=\"filterSchema.dropdown[col.field].dataSource\" [(value)]=\"filterData[col.field]\"\r\n (onHideSmartEvent)=\"onSearch()\" (onShow)=\"onShowFilterDropdownPanel($event)\"\r\n (onHide)=\"onHideFilterDropdownPanel($event)\" (mousedown)=\"initFilterBoxFocus(filterBox)\"></dropdown>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterText let-col=\"col\">\r\n <div #filterBox class=\"text-filter filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <input pInputText type=\"text\" class=\"input-search\" [placeholder]=\"col.label\"\r\n [(ngModel)]=\"filterData[col.field]\" (change)=\"onSearch()\"\r\n (keyup.esc)=\"onClearSearch(filterBox, col.field)\">\r\n </div>\r\n <span [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] != null && filterData[col.field] !== ''}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearSearch(filterBox, col.field)\"\r\n tabindex=\"-1\"><i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterNumber let-col=\"col\">\r\n <div #filterBox class=\"number-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-number-picker-range #numberRange [maskType]=\"col.dataType\" [(ngModel)]=\"filterData[col.field]\"\r\n [min]=\"col.min\" [max]=\"col.max\" (change)=\"onSearch()\">\r\n </tn-number-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\" (mousedown)=\"onClearNumberSearch(filterBox, numberRange)\"\r\n tabindex=\"-1\">\r\n <i class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterDate let-col=\"col\">\r\n <div #filterBox class=\"date-picker-range filter-box\" tabindex=\"-1\" (mousedown)=\"initFilterBoxFocus(filterBox)\">\r\n <div tabindex=\"-1\">\r\n <tn-datetime-picker-range #dateRange [control]=\"filterSchema.dateRange\"\r\n (onChanged)=\"onChangeDateTime($event, col.field)\">\r\n </tn-datetime-picker-range>\r\n </div>\r\n <span\r\n [ngClass]=\"{'action-clear': true, 'dirty': filterData[col.field] && ((filterData[col.field][0] != null && filterData[col.field][0] !== '') || (filterData[col.field][1] != null && filterData[col.field][1] !== ''))}\"\r\n [pTooltip]=\"'B\u1ECF filter'\" tooltipPosition=\"top\"\r\n (mousedown)=\"onClearDateSearch(filterBox, dateRange, col.field)\" tabindex=\"-1\"><i\r\n class=\"pi pi-filter-slash\"></i></span>\r\n <after-view-checked style=\"display: none;\" (loaded)=\"initFilterBoxFocus(filterBox)\">\r\n </after-view-checked>\r\n </div>\r\n</ng-template>\r\n<ng-template #filterBoolean let-col=\"col\">\r\n <div class=\"filter-boolean-box\">\r\n <p-selectButton\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>", styles: [".filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.advance-search-container{display:flex;justify-content:flex-end}::ng-deep tn-tree-table advance-search{display:block;flex:1;max-width:400px}::ng-deep tn-tree-table .ps__rail-x,::ng-deep tn-tree-table .ps__rail-y{z-index:5}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep tn-tree-table .p-treetable .p-treetable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep tn-tree-table tr.generated-by-base td.chkbox{background:#e9ecef}::ng-deep tn-tree-table .cell-header-filter{position:relative}::ng-deep tn-tree-table .cell-header-filter .tn-dropdown{height:32px}::ng-deep tn-tree-table .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep tn-tree-table .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep tn-tree-table .cell-header-filter .filter-box>div{flex:1;border:1px solid #ced4da;border-right:none;border-radius:3px 0 0 3px;outline:none;overflow:hidden}::ng-deep tn-tree-table .cell-header-filter .filter-box>span{cursor:pointer;min-width:unset;flex-basis:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;background:#f5f6f8;color:#6c757d;border:1px solid #ced4da;outline:none}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep tn-tree-table .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep tn-tree-table .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep tn-tree-table .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep tn-tree-table .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep tn-tree-table .cell-header-filter:focus-within,::ng-deep tn-tree-table .cell-header-filter.focus-within{z-index:10!important}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep tn-tree-table .cell-header-filter:focus-within .filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box{position:absolute;top:calc(50% - 16px);min-width:250px;z-index:2;box-shadow:5px 0 15px 1px #00000045}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>div{flex:1;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep tn-tree-table .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep tn-tree-table .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep tn-tree-table .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep tn-tree-table .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep tn-tree-table .cell-header-filter:last-child .filter-box{right:3px}::ng-deep tn-tree-table .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep tn-tree-table .table-border-line.--left,::ng-deep tn-tree-table .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep tn-tree-table .table-border-line.--top,::ng-deep tn-tree-table .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep tn-tree-table .table-border-line.--left{left:0}::ng-deep tn-tree-table .table-border-line.--right{right:0}::ng-deep tn-tree-table .table-border-line.--top{top:0}::ng-deep tn-tree-table .table-border-line.--bottom{bottom:0}::ng-deep tn-tree-table .filter-boolean-box{text-align:center}::ng-deep tn-tree-table .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep tn-tree-table .custom-search-area crud-form{width:100%}::ng-deep tn-tree-table>p-contextmenu{display:none}\n"] }]
|
|
82
82
|
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NydWQvdHJlZS10YWJsZS90cmVlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC90cmVlLXRhYmxlL3RyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVE5RSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsaUJBQWlCO0lBQ3JELFlBQ0ksUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxjQUFjLENBQUMsR0FBRztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTthQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUN6RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCx5QkFBeUI7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFO1lBQzNELE9BQU87U0FDVjtRQUNELHFDQUFxQztRQUNyQyxpSEFBaUg7UUFDakgscUJBQXFCO1FBQ3JCLHFEQUFxRDtRQUNyRCx3QkFBd0I7UUFDeEIsOERBQThEO1FBQzlELDRFQUE0RTtRQUM1RSwwQkFBMEI7UUFDMUIsZ0JBQWdCO1FBQ2hCLGdFQUFnRTtRQUNoRSxZQUFZO1FBQ1osNkJBQTZCO1FBQzdCLCtDQUErQztRQUMvQyxxR0FBcUc7UUFDckcsbUVBQW1FO1FBQ25FLHNGQUFzRjtRQUN0RixtRkFBbUY7UUFDbkYsK0RBQStEO1FBQy9ELCtEQUErRDtRQUMvRCx3REFBd0Q7UUFDeEQsMERBQTBEO1FBQzFELHlEQUF5RDtRQUN6RCxrQkFBa0I7UUFFbEIsUUFBUTtRQUNSLGFBQWE7UUFDYiw0Q0FBNEM7UUFDNUMsUUFBUTtRQUNSLFVBQVU7SUFDZCxDQUFDOzsrR0F2RFEsa0JBQWtCO21HQUFsQixrQkFBa0IsNEVDVC9CLHM4N0JBK2NjOzJGRHRjRCxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMaXN0Q29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9saXN0LWNvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgSUxpc3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2ktbGlzdC1jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3RuLXRyZWUtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdHJlZS10YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBMaXN0Q29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIElMaXN0Q29tcG9uZW50LCBPbkluaXQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5pc1RyZWVUYWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlRGFuaE1hUEMoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnVwZGF0ZU1hUGhhbkNhcEJhc2UoKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICfEkMOhbmggbOG6oWkgbcOjIHBow6JuIGPhuqVwIHRow6BuaCBjw7RuZycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxvYWRpbmcgfHwgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuY29udGFpbmVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctb3ZlcmxheScpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCdwLXRhYmxlJyk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3Qgbm9kZVNjcm9sbEJhckNvbnRlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBpZiAoIW5vZGVTY3JvbGxCYXJDb250ZW50LmNsYXNzTGlzdC5jb250YWlucygncHMtY29udGVudCcpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbm9kZVNjcm9sbEJhckNvbnRlbnQucGFyZW50Tm9kZS5wcmVwZW5kKGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBmaXJzdFRoID0gZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ3AtdGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgPiB0aCcpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGhTaXplID0gZmlyc3RUaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctaWNvbicpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGxvYWRpbmdJY29uKS5mb250U2l6ZSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgdG9wID0gKGZpcnN0VGhTaXplLmhlaWdodCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgbGVmdCA9IChmaXJzdFRoU2l6ZS53aWR0aCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luVG9wID0gYCR7dG9wfXB4YDtcclxuICAgICAgICAvLyAgICAgICAgICAgICBsb2FkaW5nSWNvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgICAgICB9LCAyMCk7XHJcblxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLWNhcmQgY2FyZCBjYXJkLXctdGl0bGUgdG4tZy1wYWdlLWxheW91dC0xXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktaGVscGVyLWNsZWFyZml4IHRuLWctcGFnZS1sYXlvdXQtMV9faGVhZGVyLWFyZWFcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3NlYXJjaEN1c3RvbScpXCIgY2xhc3M9XCJwLWdyaWQgdWktZmx1aWQgY3VzdG9tLXAtY29sIGN1c3RvbS1zZWFyY2gtYXJlYVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5jb2xsYXBzZWRdPVwiIWV4cGFuZGVkU2VhcmNoXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbC0xMiBtYWluLWNvbnRhaW5lci1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWdyaWQgbWFpbi1jb250YWluZXItc2VhcmNoLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdzZWFyY2hDdXN0b20nKTsgY29udGV4dDogeyRpbXBsaWNpdDogdGhpc31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzZS1leHBhbmRcIiAoY2xpY2spPVwiZXhwYW5kZWRTZWFyY2ggPSAhZXhwYW5kZWRTZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGlcIiBbY2xhc3MucGktY2FyZXQtdXBdPVwiZXhwYW5kZWRTZWFyY2hcIiBbY2xhc3MucGktY2FyZXQtZG93bl09XCIhZXhwYW5kZWRTZWFyY2hcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWdyaWQgdWktZmx1aWQgY3VzdG9tLXAtY29sIHBhZ2UtdGl0bGUtYXJlYVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi10aXRsZSBwLWNvbC04XCI+XHJcbiAgICAgICAgICAgICAgICA8aDEgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2N1c3RvbVRpdGxlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3NldHRpbmcudGl0bGUgIT0gbnVsbCA/IHNldHRpbmcudGl0bGUgOiAnRGFuaCBzw6FjaCAnICsgc2V0dGluZy5vYmplY3ROYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvaDE+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjdXN0b21UaXRsZScpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2N1c3RvbVRpdGxlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRMaXN0OiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBidXR0b25BZGQ6IGJ1dHRvbkFkZCwgYnV0dG9uRGVsZXRlOiBidXR0b25EZWxldGVcclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICA8cGFnaW5nLW5leHQtYmFjay1vbmx5IFttb2RlbF09XCJtb2RlbFwiIFtzZXR0aW5nXT1cInNldHRpbmdcIiAob25DaGFuZ2VkKT1cImdldERhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlTGltaXRQYWdlKT1cInNhdmVQYWdlU2l6ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8L3BhZ2luZy1uZXh0LWJhY2stb25seT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJwLWdyaWQgY3J1ZExpc3RUb29sYmFyIHRuLWctcGFnZS1sYXlvdXQtMV9fdG9vbGJhci1hcmVhXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInAtY29sLTcgYnV0dG9uLWdyb3VwIGZ1bmN0aW9uLXRvcGJhclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdidXR0b25CZWZvcmVUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjcnVkTGlzdDogdGhpc31cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRkZW5BZGRcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJidXR0b25BZGRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoaWRkZW5EZWxldGVcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJidXR0b25EZWxldGVcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBsYWJlbD1cIsSQw6FuaCBs4bqhaSBtw6MgcGjDom4gY+G6pXBcIiBpY29uPVwicGkgcGktc2hhcmUtYWx0XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2xpY2spPVwiaGFuZGxlRGFuaE1hUEMoJGV2ZW50KVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdidXR0b25BZnRlclRvb2xiYXInKVwiXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NydWRMaXN0OiB0aGlzfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWNvbC01IHAtaW5wdXRncm91cCBhZHZhbmNlLXNlYXJjaC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdEFkdmFuY2VTZWFyY2gnXTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50U2V0dGluZzogc2V0dGluZywgc2VhcmNoSW5mbzogc2VhcmNoSW5mbywgbG9hZGluZzogbW9kZWwubG9hZGluZywgb25TZWFyY2g6IGhhbmRsZVNlYXJjaEFkdnMsXHJcbiAgICAgICAgICAgICAgICBvbkluaXQ6IGhhbmRsZUluaXRBZHZhbmNlU2VhcmNoXHJcbiAgICAgICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPCEtLSA8YWR2YW5jZS1zZWFyY2ggI2FkdmFuY2VTZWFyY2ggW3BhcmVudFNldHRpbmddPVwic2V0dGluZ1wiIFtzZWFyY2hJbmZvXT1cInNlYXJjaEluZm9cIiBbbG9hZGluZ109XCJtb2RlbC5sb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIChvblNlYXJjaCk9XCJoYW5kbGVTZWFyY2hBZHZzKCRldmVudClcIiAob25Jbml0KT1cImhhbmRsZUluaXRBZHZhbmNlU2VhcmNoKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9hZHZhbmNlLXNlYXJjaD4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0bi1nLXBhZ2UtbGF5b3V0LTFfX3RhYmxlLWFyZWFcIj5cclxuICAgICAgICA8dG4tY3VzdG9tLXNjcm9sbGJhciBbc2hvd1Njcm9sbEhvcml6b250YWxdPVwidHJ1ZVwiIGNsYXNzPVwiLS1oYXMtYm9yZGVyXCI+XHJcbiAgICAgICAgICAgIDxwLXRyZWVUYWJsZSAjdHJlZXRhYmxlIFt2YWx1ZV09XCJfZGF0YVNvdXJjZVwiIFtjb2x1bW5zXT1cInNldHRpbmcuY29sc1wiIHN0eWxlQ2xhc3M9XCJ0cmVlT3JnYW5pemF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY29sZ3JvdXBcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICAgICAgICAgICAgICA8Y29sZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5DaGVja2JveFwiIHN0eWxlPVwid2lkdGg6IDUwcHhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29sICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW5cIiBzdHlsZT1cIndpZHRoOiA1MHB4XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgKm5nSWY9XCJjb2wgJiYgY29sLnZpc2libGUgJiYgY29sLmZpZWxkIT0nZnVuY3Rpb24nXCIgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29sICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoRnVuY3Rpb25Db2x1bW4gfHwgX3dpZHRoRnVuY3Rpb25Db2x1bW5cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvY29sZ3JvdXA+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuQ2hlY2tib3hcIiBjbGFzcz1cImNoa2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS1yZWZyZXNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBidG5SZWxvYWRcIiBwVG9vbHRpcD1cIkzDoG0gbeG7m2kgZOG7ryBsaeG7h3VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIFtkaXNhYmxlZF09XCJtb2RlbC5sb2FkaW5nXCIgKGNsaWNrKT1cImdldERhdGEoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIGNsYXNzPVwic3R0IG5vcGFkIGNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCIgKGRibGNsaWNrKT1cInJlbG9hZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnVFQnIHx0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiY29sICYmIGNvbC52aXNpYmxlICYmIGNvbC5maWVsZCE9J2Z1bmN0aW9uJ1wiIFt0dFNvcnRhYmxlQ29sdW1uXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzTmFtZV09XCJjb2wuY2xhc3NcIiBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwidW5zZXQtd2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29sLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC10cmVlVGFibGVTb3J0SWNvbiBbZmllbGRdPVwiY29sLmZpZWxkXCI+PC9wLXRyZWVUYWJsZVNvcnRJY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaOG7qWMgbsSDbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dIZWFkZXJGaWx0ZXI7IGNvbnRleHQ6IHtjb2x1bW5zOiBjb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd05vZGUgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LWluZGV4PVwicm93SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBbdHRSb3ddPVwicm93Tm9kZVwiIFtjbGFzcy5nZW5lcmF0ZWQtYnktYmFzZV09XCJyb3dEYXRhLl9HZW5lcmF0ZWRCeUJhc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5yb3dJbmRleF09XCJyb3dEYXRhW2ZpZWxkSW5kZXhJbkRhdGFTb3VyY2VdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNoa2JveCBsaW5rLW9yLWFjdGlvbiBjZWxsLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jaGVja2JveCBbKG5nTW9kZWwpXT1cInJvd0RhdGEuX2NoZWNrZWRcIiBiaW5hcnk9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiaGFuZGxlQ2hlY2tSb3dEYXRhKHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNoa2JveCBsaW5rLW9yLWFjdGlvbiBjZWxsLWNoZWNrYm94XCI+e3tyb3dEYXRhW2ZpZWxkT3JkZXJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFRkOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCByb3dOb2RlOiByb3dOb2RlLCBjb2w6IGNvbCwgaW5kZXg6IGluZGV4LCBpOiBpfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtblwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1RlbXBsYXRlKCdmdW5jdGlvbicpXCIgY2xhc3M9XCJwLXRvb2xiYXItZ3JvdXAtY2VudGVyIGJ1dHRvbi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2Z1bmN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2Z1bmN0aW9uJylcIiBjbGFzcz1cInAtdG9vbGJhci1ncm91cC1jZW50ZXIgYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQmVmb3JlJylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuRWRpdFwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidGT1JNLkVESVQnIHwgdHJhbnNsYXRlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVFZGl0KHJvd0RhdGEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mbyBsaW5rLW9yLWFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIiAoY2xpY2spPVwiZWRpdChyb3dEYXRhKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93RGF0YS5oaWRkZW5EZWxldGVcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRGVsZXRlKHJvd0RhdGEpXCIgW3BUb29sdGlwXT1cIidGT1JNLkRFTEVURScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgbGluay1vci1hY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiAoY2xpY2spPVwiZGVsZXRlKHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwidGhpcy5tZW51QnV0dG9uc1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaW5rLW9yLWFjdGlvbiBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8gcC1idXR0b24tcm91bmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb29sdGlwPVwiQ2jhu6ljIG7Eg25nIGtow6FjXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dDb250ZXh0TWVudSgkZXZlbnQsIHJvd0RhdGEpXCI+PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkICpuZ0lmPVwicm93RGF0YS5faW5kZXggPT0gX3Jhd0RhdGFTb3VyY2UubGVuZ3RoIC0gMVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVuZGVyS2V5XT1cImRhdGFTb3VyY2VcIiAobG9hZGVkKT1cImhhbmRsZVRhYmxlUmVuZGVyZWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLXRyZWVUYWJsZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1ib3R0b20tc3RpY2t5XCI+PC9kaXY+XHJcbiAgICAgICAgPC90bi1jdXN0b20tc2Nyb2xsYmFyPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48bmctdGVtcGxhdGUgI2J1dHRvbkFkZD5cclxuICAgIDxzcGFuIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIiBbcGVybWlzc2lvbl09XCJhdXRob3JpemVQYXRoc1tjb21tb25Db25zdC5BRERdXCJcclxuICAgICAgICBbZW5hYmxlQXV0aG9yaXplXT1cImJ1dHRvbkFwcGx5QXV0aG9yaXplW2NvbW1vbkNvbnN0LkFERF1cIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgbGFiZWw9XCJUaMOqbSBt4bubaVwiIGljb249XCJwaSBwaS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtb2RlbC5iYXNlUmVhZHlcIiAoY2xpY2spPVwiYWRkKClcIj48L2J1dHRvbj5cclxuICAgIDwvc3Bhbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNidXR0b25EZWxldGU+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGRlbkRlbGV0ZSAmJiBtb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgIWRpc2FibGVNdWx0aXBsZURlbGV0ZSgpXCJcclxuICAgICAgICBbYXBwQXV0aG9yaXplXT1cInNlcnZpY2VDb2RlXCIgW3Blcm1pc3Npb25dPVwiYXV0aG9yaXplUGF0aHNbY29tbW9uQ29uc3QuREVMRVRFX01VTFRJUExFXVwiXHJcbiAgICAgICAgW2VuYWJsZUF1dGhvcml6ZV09XCJidXR0b25BcHBseUF1dGhvcml6ZVtjb21tb25Db25zdC5ERUxFVEVfTVVMVElQTEVdXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZVxyXG4gICAgICAgIFtsYWJlbF09XCInWMOzYSAnICsgKG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoKSB8IHRyYW5zbGF0ZVwiIGljb249XCJwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJkZWxldGVNdXRpcGxlKClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250ZW50VGQgbGV0LXJvd0RhdGEgbGV0LXJvd05vZGU9XCJyb3dOb2RlXCIgbGV0LWNvbD1cImNvbFwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWk9XCJpXCJcclxuICAgIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICA8dGQgKm5nSWY9XCJjb2wgJiYgY29sLnZpc2libGUgJiYgY29sLmZpZWxkICE9ICdmdW5jdGlvbicgJiYgKCFyb3dEYXRhLmhpZGRlbiB8fCAhcm93RGF0YS5oaWRkZW5bY29sLmZpZWxkXSlcIlxyXG4gICAgICAgIFthdHRyLmNvbFNwYW5dPVwicm93RGF0YS5jb2xTcGFuICYmIHJvd0RhdGEuY29sU3Bhbltjb2wuZmllbGRdXCJcclxuICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bY29sLmZpZWxkXVwiIFtuZ1N0eWxlXT1cImNvbC5leHRlbmREYXRhLnN0eWxlXCJcclxuICAgICAgICBbY2xhc3NdPVwiY29sLmNlbGxDbGFzc1wiIFtjbGFzcy5maXJzdC10ZF09XCJpID09IDBcIj5cclxuICAgICAgICA8dG4tdHJlZVRhYmxlVG9nZ2xlciAqbmdJZj1cImNvbC5jb2xIYXNUb2dnbGVJY29uXCIgW3Jvd05vZGVdPVwicm93Tm9kZVwiPjwvdG4tdHJlZVRhYmxlVG9nZ2xlcj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiIFtwVG9vbHRpcF09XCJjb2wuZnVsbExhYmVsXCIgW2VzY2FwZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj57e2NvbC5sYWJlbH19PC9zcGFuPiAtLT5cclxuICAgICAgICAgICAge3tyb3dEYXRhWydwaXBlX18nICsgY29sLmZpZWxkXX19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJwLWNvbHVtbi10aXRsZVwiIFtwVG9vbHRpcF09XCJjb2wuZnVsbExhYmVsXCIgW2VzY2FwZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj57e2NvbC5sYWJlbH19PC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZXR0aW5nLnNob3dFZGl0TGluayAmJiBjb2wuc2hvd0VkaXRMaW5rXCIgY2xhc3M9XCJsaW5rLW9yLWFjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJ2aWV3KHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlQ2VsbDsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbnRlbnRDZWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogaW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2V0dGluZy5zaG93RWRpdExpbmsgfHwgIWNvbC5zaG93RWRpdExpbmtcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZUNlbGw7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbnRlbnRDZWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleCwgY29sOiBjb2wsIGV4cGFuZGVkOiBleHBhbmRlZFxyXG4gICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250ZW50Q2VsbCBsZXQtY29sPVwiY29sXCIgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtZmllbGQ9XCJmaWVsZFwiXHJcbiAgICBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2wudGVtcGxhdGU7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiBnZXRDb21wb25lbnRCeVR5cGUoY29sLmRhdGFUeXBlKSxcclxuICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IHJvd0luZGV4LCBjb2w6IGNvbCwgZXhwYW5kZWQ6IGV4cGFuZGVkXHJcbiAgICAgICAgfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbC50ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbC5kYXRhVHlwZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2NvbG9yJ1wiIHN0eWxlPVwiZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzpyb3dEYXRhW2ZpZWxkXX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6MzBweDtoZWlnaHQ6MzBweDttYXJnaW46MCBhdXRvO1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBbcFRvb2x0aXBdPVwicm93RGF0YVtmaWVsZF1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvd0RhdGFbZmllbGRdXCI+PC9pPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIiBbcFRvb2x0aXBdPVwicm93RGF0YVtmaWVsZF0gfCBkYXRlOidkZC9NTS95eXl5J1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxyXG4gICAgICAgICAgICAgICAge3tfY3J1ZFNlcnZpY2UucmVuZGVyRGF0ZShyb3dEYXRhW2ZpZWxkXSwgY29sLmZvcm1hdCl9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZXRpbWUnXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbSdcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICB7e19jcnVkU2VydmljZS5yZW5kZXJEYXRlVGltZShyb3dEYXRhW2ZpZWxkXSwgY29sLmZvcm1hdCl9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCIndXNlcidcIiBjbGFzcz1cInVzZXJcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF0gfCB1c2VyRm9ybWF0IHwgYXN5bmN9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIid1c2VycydcIiBbaW5uZXJIVE1MXT1cInJvd0RhdGFbZmllbGRdIHwgdXNlcnNGb3JtYXQgfCBhc3luY1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidpbnQnXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1jaGVja2JveCBjbGFzcz1cImJvb2xlYW4tZGF0YS10eXBlXCIgWyhuZ01vZGVsKV09XCJyb3dEYXRhW2ZpZWxkXVwiIGJpbmFyeT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZUNoZWNrQm94XCI+XHJcbiAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidodG1sJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInJvd0RhdGFbZmllbGRdPT1udWxsPycnOnJvd0RhdGFbZmllbGRdXCIgW2lubmVySFRNTF09XCJyb3dEYXRhW2ZpZWxkXSB8IHNhZmVIdG1sXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtZXRhZGF0YVN0YXR1cydcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVsncmVqZWN0UmVhc29uJ11cIiBjbGFzcz1cImxhYmVsLWRhbmdlclwiIFtwVG9vbHRpcF09XCJyb3dEYXRhWydyZWplY3RSZWFzb24nXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFN0eWxlQ2xhc3M9XCJ1bnNldC13aWR0aFwiIFtlc2NhcGVdPVwiZmFsc2VcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5U4burIGNo4buRaTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtmaWVsZF0gPT0gJzAnICYmICFyb3dEYXRhWydyZWplY3RSZWFzb24nXVwiIGNsYXNzPVwibGFiZWwtc2Vjb25kYXJ5XCI+Q2jGsGFcclxuICAgICAgICAgICAgICAgICAgICBkdXnhu4d0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhW2ZpZWxkXSA9PSAnMScgJiYgIXJvd0RhdGFbJ3JlamVjdFJlYXNvbiddXCIgY2xhc3M9XCJsYWJlbC13YXJuaW5nXCI+Q2jhu50gZHV54buHdDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtmaWVsZF0gPT0gJzInXCIgY2xhc3M9XCJsYWJlbC1wcmltYXJ5XCI+xJDDoyBkdXnhu4d0PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdHJpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudENlbGxTdHJpbmc7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIGZpZWxkOiBjb2wuZmllbGR9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIm51bGxcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50Q2VsbFN0cmluZzsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlQ2VsbDsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZ2V0Q29tcG9uZW50QnlUeXBlKGNvbC5kYXRhVHlwZSksXHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IHJvd0luZGV4LCBjb2w6IGNvbCwgZXhwYW5kZWQ6IGV4cGFuZGVkXHJcbiAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250ZW50Q2VsbFN0cmluZyBsZXQtcm93RGF0YSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxyXG4gICAgPHNwYW4+XHJcbiAgICAgICAgPCEtLSBfX3N2OiBTaG9ydCBWYWx1ZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93RGF0YVtmaWVsZCArICdfX3N2J11cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb3dEYXRhW2ZpZWxkICsgJ19fc2hvd0Z1bGwnXVwiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkICsgJ19fc3YnXX19XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zaG93ZnVsbFwiIChjbGljayk9XCJ0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZClcIiBwVG9vbHRpcD1cIkLhuqVtIMSR4buDIHhlbSB0aMOqbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+Wy4uLl08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ11cIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtc2hvd2Z1bGxcIiAoY2xpY2spPVwidG9nZ2xlU2hvd0Z1bGwocm93RGF0YSwgZmllbGQpXCI+VGh1IGfhu41uPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJvd0RhdGFbZmllbGQgKyAnX19zdiddXCI+XHJcbiAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlQ2VsbCBsZXQtdGVtcGxhdGUgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtY29sPVwiY29sXCJcclxuICAgIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsIFxyXG4gICAgICAgIGNydWRMaXN0OiB0aGlzLFxyXG4gICAgICAgIHJvd0luZGV4LFxyXG4gICAgICAgIGNvbCxcclxuICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgIGljb25Ub2dnbGVSb3dEYXRhOiB0aGlzLmljb25Ub2dnbGVSb3dEYXRhXHJcbiAgICB9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250YWluZXJTdGlja3k+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpeC1zdGlja3kgdG9wXCI+PC9zcGFuPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmaXgtc3RpY2t5IHJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgPCEtLSA8c3BhbiBjbGFzcz1cImZpeC1zdGlja3kgYm90dG9tXCI+PC9zcGFuPiAtLT5cclxuICAgIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSBsZWZ0XCI+PC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3Jvd0hlYWRlckZpbHRlciBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgIDx0ciBjbGFzcz1cImZpbHRlci1yb3dcIiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZpbHRlclJvd1wiPlxyXG4gICAgICAgIDx0aCBjbGFzcz1cImNoa2JveCBub3BhZCBjZW50ZXJcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCJcclxuICAgICAgICAgICAgW2NsYXNzLnRyaWNoZWNrYm94LWN1c3RvbS1mYWxzZV09XCJjaGVja2VkQWxsID09PSBmYWxzZVwiPlxyXG4gICAgICAgICAgICA8cC10cmlTdGF0ZUNoZWNrYm94IFsobmdNb2RlbCldPVwiY2hlY2tlZEFsbFwiIGJpbmFyeT1cInRydWVcIiAob25DaGFuZ2UpPVwiaGFuZGxlQ2hlY2tBbGwoKVwiPlxyXG4gICAgICAgICAgICA8L3AtdHJpU3RhdGVDaGVja2JveD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiY2hrYm94IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiY29sLnZpc2libGUgJiYgY29sLmZpZWxkICE9ICdmdW5jdGlvbidcIiBjbGFzcz1cImNlbGwtaGVhZGVyLWZpbHRlciBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuYWxsb3dGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnRlbXBsYXRlRmlsdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLnRlbXBsYXRlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2wsIGZpbHRlckRhdGE6IGZpbHRlckRhdGEsIG9uU2VhcmNoOiBvblNlYXJjaCwgb25TaG93RmlsdGVyRHJvcGRvd25QYW5lbDogb25TaG93RmlsdGVyRHJvcGRvd25QYW5lbCwgb25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbDogb25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wudGVtcGxhdGVGaWx0ZXJcIiBbbmdTd2l0Y2hdPVwiY29sLmNvbnRyb2xUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyRHJvcGRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2wucmF3Q29sdW1ufVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyRGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyRGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbC5kYXRhVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnQnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlckJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlclRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtblwiIGNsYXNzPVwiY2VudGVyIHNldHRpbmctY2VsbCBjb2x1bW4tZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlblNldHRpbmdcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS1jb2dcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBwVG9vbHRpcD1cIkPhuqV1IGjDrG5oIGhp4buDbiB0aOG7i1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1NldHRpbmdzKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlblNldHRpbmdQZXJtaXNzaW9uXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktdXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBwVG9vbHRpcD1cIlBow6JuIHF1eeG7gW4gZOG7ryBsaeG7h3VcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja1Blcm1pc3Npb25Ub1VzZUJ1dHRvbihCVVRUT05fUEhBTl9RVVlFTilcIiAoY2xpY2spPVwic2hvd1NldHRpbmdzUGVybWlzc2lvbigpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nV29ya2Zsb3dcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS1zaXRlbWFwXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCIgcFRvb2x0aXA9XCJD4bqldSBow6xuaCBxdXkgdHLDrG5oXCIgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2tQZXJtaXNzaW9uVG9Vc2VCdXR0b24oQlVUVE9OX0NBVV9ISU5IX1FVWV9UUklOSClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTZXR0aW5nc1dvcmtmbG93TmV3KClcIj48L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgPC90cj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJEcm9wZG93biBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2ICNmaWx0ZXJCb3ggc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxyXG4gICAgICAgIDxkcm9wZG93biAqbmdJZj1cImNvbCAmJiBmaWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXVwiIFtjb250cm9sXT1cImZpbHRlclNjaGVtYS5kcm9wZG93bltjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF0uZGF0YVNvdXJjZVwiIFsodmFsdWUpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgIChvbkhpZGVTbWFydEV2ZW50KT1cIm9uU2VhcmNoKClcIiAob25TaG93KT1cIm9uU2hvd0ZpbHRlckRyb3Bkb3duUGFuZWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbkhpZGUpPVwib25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbCgkZXZlbnQpXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPjwvZHJvcGRvd24+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJUZXh0IGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cInRleHQtZmlsdGVyIGZpbHRlci1ib3hcIiB0YWJpbmRleD1cIi0xXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiaW5wdXQtc2VhcmNoXCIgW3BsYWNlaG9sZGVyXT1cImNvbC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiIChjaGFuZ2UpPVwib25TZWFyY2goKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZXNjKT1cIm9uQ2xlYXJTZWFyY2goZmlsdGVyQm94LCBjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieydhY3Rpb24tY2xlYXInOiB0cnVlLCAnZGlydHknOiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gIT09ICcnfVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInQuG7jyBmaWx0ZXInXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKG1vdXNlZG93bik9XCJvbkNsZWFyU2VhcmNoKGZpbHRlckJveCwgY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj48aSBjbGFzcz1cInBpIHBpLWZpbHRlci1zbGFzaFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGxvYWRlZCk9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyTnVtYmVyIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cIm51bWJlci1waWNrZXItcmFuZ2UgZmlsdGVyLWJveFwiIHRhYmluZGV4PVwiLTFcIiAobW91c2Vkb3duKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPGRpdiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDx0bi1udW1iZXItcGlja2VyLXJhbmdlICNudW1iZXJSYW5nZSBbbWFza1R5cGVdPVwiY29sLmRhdGFUeXBlXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgW21pbl09XCJjb2wubWluXCIgW21heF09XCJjb2wubWF4XCIgKGNoYW5nZSk9XCJvblNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgIDwvdG4tbnVtYmVyLXBpY2tlci1yYW5nZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGlvbi1jbGVhcic6IHRydWUsICdkaXJ0eSc6IGZpbHRlckRhdGFbY29sLmZpZWxkXSAmJiAoKGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPT0gJycpIHx8IChmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT09ICcnKSl9XCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cIidC4buPIGZpbHRlcidcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiAobW91c2Vkb3duKT1cIm9uQ2xlYXJOdW1iZXJTZWFyY2goZmlsdGVyQm94LCBudW1iZXJSYW5nZSlcIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAobG9hZGVkKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJEYXRlIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cImRhdGUtcGlja2VyLXJhbmdlIGZpbHRlci1ib3hcIiB0YWJpbmRleD1cIi0xXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8dG4tZGF0ZXRpbWUtcGlja2VyLXJhbmdlICNkYXRlUmFuZ2UgW2NvbnRyb2xdPVwiZmlsdGVyU2NoZW1hLmRhdGVSYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2VkKT1cIm9uQ2hhbmdlRGF0ZVRpbWUoJGV2ZW50LCBjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgIDwvdG4tZGF0ZXRpbWUtcGlja2VyLXJhbmdlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWNsZWFyJzogdHJ1ZSwgJ2RpcnR5JzogZmlsdGVyRGF0YVtjb2wuZmllbGRdICYmICgoZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9PSAnJykgfHwgKGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPT0gJycpKX1cIlxyXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0Lhu48gZmlsdGVyJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25DbGVhckRhdGVTZWFyY2goZmlsdGVyQm94LCBkYXRlUmFuZ2UsIGNvbC5maWVsZClcIiB0YWJpbmRleD1cIi0xXCI+PGlcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAobG9hZGVkKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJCb29sZWFuIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItYm9vbGVhbi1ib3hcIj5cclxuICAgICAgICA8cC1zZWxlY3RCdXR0b25cclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiW3t2YWx1ZTogdHJ1ZSwgbGFiZWw6ICdDw7MnLCBpY29uOiAncGkgcGktY2hlY2snfSwge3ZhbHVlOiBmYWxzZSwgbGFiZWw6ICdLaMO0bmcnLCBpY29uOiAncGkgcGktdGltZXMnfV1cIlxyXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVyRGF0YVtjb2wuZmllbGRdXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlQm9vbGVhbigkZXZlbnQsIGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJwYWRkaW5nOiAzcHggMDtcIiBbY2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1zZWxlY3RCdXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NydWQvdHJlZS10YWJsZS90cmVlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC90cmVlLXRhYmxlL3RyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVE5RSxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsaUJBQWlCO0lBQ3JELFlBQ0ksUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxjQUFjLENBQUMsR0FBRztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTthQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUN6RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7SUFFRCx5QkFBeUI7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFO1lBQzNELE9BQU87U0FDVjtRQUNELHFDQUFxQztRQUNyQyxpSEFBaUg7UUFDakgscUJBQXFCO1FBQ3JCLHFEQUFxRDtRQUNyRCx3QkFBd0I7UUFDeEIsOERBQThEO1FBQzlELDRFQUE0RTtRQUM1RSwwQkFBMEI7UUFDMUIsZ0JBQWdCO1FBQ2hCLGdFQUFnRTtRQUNoRSxZQUFZO1FBQ1osNkJBQTZCO1FBQzdCLCtDQUErQztRQUMvQyxxR0FBcUc7UUFDckcsbUVBQW1FO1FBQ25FLHNGQUFzRjtRQUN0RixtRkFBbUY7UUFDbkYsK0RBQStEO1FBQy9ELCtEQUErRDtRQUMvRCx3REFBd0Q7UUFDeEQsMERBQTBEO1FBQzFELHlEQUF5RDtRQUN6RCxrQkFBa0I7UUFFbEIsUUFBUTtRQUNSLGFBQWE7UUFDYiw0Q0FBNEM7UUFDNUMsUUFBUTtRQUNSLFVBQVU7SUFDZCxDQUFDOzsrR0F2RFEsa0JBQWtCO21HQUFsQixrQkFBa0IsNEVDVC9CLGc3N0JBK2NjOzJGRHRjRCxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0b3IsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMaXN0Q29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9saXN0LWNvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgSUxpc3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2ktbGlzdC1jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3RuLXRyZWUtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RyZWUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdHJlZS10YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmVlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBMaXN0Q29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIElMaXN0Q29tcG9uZW50LCBPbkluaXQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5pc1RyZWVUYWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlRGFuaE1hUEMoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnVwZGF0ZU1hUGhhbkNhcEJhc2UoKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICfEkMOhbmggbOG6oWkgbcOjIHBow6JuIGPhuqVwIHRow6BuaCBjw7RuZycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxvYWRpbmcgfHwgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuY29udGFpbmVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctb3ZlcmxheScpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCdwLXRhYmxlJyk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3Qgbm9kZVNjcm9sbEJhckNvbnRlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBpZiAoIW5vZGVTY3JvbGxCYXJDb250ZW50LmNsYXNzTGlzdC5jb250YWlucygncHMtY29udGVudCcpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbm9kZVNjcm9sbEJhckNvbnRlbnQucGFyZW50Tm9kZS5wcmVwZW5kKGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBmaXJzdFRoID0gZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ3AtdGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgPiB0aCcpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGhTaXplID0gZmlyc3RUaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctaWNvbicpO1xyXG4gICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGxvYWRpbmdJY29uKS5mb250U2l6ZSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgdG9wID0gKGZpcnN0VGhTaXplLmhlaWdodCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgbGVmdCA9IChmaXJzdFRoU2l6ZS53aWR0aCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luVG9wID0gYCR7dG9wfXB4YDtcclxuICAgICAgICAvLyAgICAgICAgICAgICBsb2FkaW5nSWNvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgdGhpcy5tb2RlbC5hZGp1c3RlZFBvc2l0aW9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgLy8gICAgICAgICB9LCAyMCk7XHJcblxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLWNhcmQgY2FyZCBjYXJkLXctdGl0bGUgdG4tZy1wYWdlLWxheW91dC0xXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidWktaGVscGVyLWNsZWFyZml4IHRuLWctcGFnZS1sYXlvdXQtMV9faGVhZGVyLWFyZWFcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3NlYXJjaEN1c3RvbScpXCIgY2xhc3M9XCJncmlkIHVpLWZsdWlkIGN1c3RvbS1jb2wgY3VzdG9tLXNlYXJjaC1hcmVhXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNvbGxhcHNlZF09XCIhZXhwYW5kZWRTZWFyY2hcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYWluLWNvbnRhaW5lci1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIG1haW4tY29udGFpbmVyLXNlYXJjaC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgnc2VhcmNoQ3VzdG9tJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHRoaXN9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UtZXhwYW5kXCIgKGNsaWNrKT1cImV4cGFuZGVkU2VhcmNoID0gIWV4cGFuZGVkU2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpXCIgW2NsYXNzLnBpLWNhcmV0LXVwXT1cImV4cGFuZGVkU2VhcmNoXCIgW2NsYXNzLnBpLWNhcmV0LWRvd25dPVwiIWV4cGFuZGVkU2VhcmNoXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCB1aS1mbHVpZCBjdXN0b20tY29sIHBhZ2UtdGl0bGUtYXJlYVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi10aXRsZSBjb2wtOFwiPlxyXG4gICAgICAgICAgICAgICAgPGgxICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdjdXN0b21UaXRsZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tzZXR0aW5nLnRpdGxlICE9IG51bGwgPyBzZXR0aW5nLnRpdGxlIDogJ0Rhbmggc8OhY2ggJyArIHNldHRpbmcub2JqZWN0TmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2gxPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNUZW1wbGF0ZSgnY3VzdG9tVGl0bGUnKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdjdXN0b21UaXRsZScpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkTGlzdDogdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQWRkOiBidXR0b25BZGQsIGJ1dHRvbkRlbGV0ZTogYnV0dG9uRGVsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTRcIj5cclxuICAgICAgICAgICAgICAgIDxwYWdpbmctbmV4dC1iYWNrLW9ubHkgW21vZGVsXT1cIm1vZGVsXCIgW3NldHRpbmddPVwic2V0dGluZ1wiIChvbkNoYW5nZWQpPVwiZ2V0RGF0YSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25DaGFuZ2VMaW1pdFBhZ2UpPVwic2F2ZVBhZ2VTaXplKClcIj5cclxuICAgICAgICAgICAgICAgIDwvcGFnaW5nLW5leHQtYmFjay1vbmx5PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImdyaWQgY3J1ZExpc3RUb29sYmFyIHRuLWctcGFnZS1sYXlvdXQtMV9fdG9vbGJhci1hcmVhXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC03IGJ1dHRvbi1ncm91cCBmdW5jdGlvbi10b3BiYXJcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQmVmb3JlVG9vbGJhcicpXCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGlkZGVuQWRkXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnV0dG9uQWRkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGlkZGVuRGVsZXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnV0dG9uRGVsZXRlXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgbGFiZWw9XCLEkMOhbmggbOG6oWkgbcOjIHBow6JuIGPhuqVwXCIgaWNvbj1cInBpIHBpLXNoYXJlLWFsdFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNsaWNrKT1cImhhbmRsZURhbmhNYVBDKCRldmVudClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQWZ0ZXJUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjcnVkTGlzdDogdGhpc31cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTUgcC1pbnB1dGdyb3VwIGFkdmFuY2Utc2VhcmNoLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0QWR2YW5jZVNlYXJjaCddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRTZXR0aW5nOiBzZXR0aW5nLCBzZWFyY2hJbmZvOiBzZWFyY2hJbmZvLCBsb2FkaW5nOiBtb2RlbC5sb2FkaW5nLCBvblNlYXJjaDogaGFuZGxlU2VhcmNoQWR2cyxcclxuICAgICAgICAgICAgICAgIG9uSW5pdDogaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2hcclxuICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tIDxhZHZhbmNlLXNlYXJjaCAjYWR2YW5jZVNlYXJjaCBbcGFyZW50U2V0dGluZ109XCJzZXR0aW5nXCIgW3NlYXJjaEluZm9dPVwic2VhcmNoSW5mb1wiIFtsb2FkaW5nXT1cIm1vZGVsLmxvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgKG9uU2VhcmNoKT1cImhhbmRsZVNlYXJjaEFkdnMoJGV2ZW50KVwiIChvbkluaXQpPVwiaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2goJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8L2FkdmFuY2Utc2VhcmNoPiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInRuLWctcGFnZS1sYXlvdXQtMV9fdGFibGUtYXJlYVwiPlxyXG4gICAgICAgIDx0bi1jdXN0b20tc2Nyb2xsYmFyIFtzaG93U2Nyb2xsSG9yaXpvbnRhbF09XCJ0cnVlXCIgY2xhc3M9XCItLWhhcy1ib3JkZXJcIj5cclxuICAgICAgICAgICAgPHAtdHJlZVRhYmxlICN0cmVldGFibGUgW3ZhbHVlXT1cIl9kYXRhU291cmNlXCIgW2NvbHVtbnNdPVwic2V0dGluZy5jb2xzXCIgc3R5bGVDbGFzcz1cInRyZWVPcmdhbml6YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjb2xncm91cD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkNoZWNrYm94XCIgc3R5bGU9XCJ3aWR0aDogNTBweFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIHN0eWxlPVwid2lkdGg6IDUwcHhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbCAqbmdJZj1cImNvbCAmJiBjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQhPSdmdW5jdGlvbidcIiBbc3R5bGUud2lkdGhdPVwiY29sLndpZHRoXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2wgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhGdW5jdGlvbkNvbHVtbiB8fCBfd2lkdGhGdW5jdGlvbkNvbHVtblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jb2xncm91cD5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5DaGVja2JveFwiIGNsYXNzPVwiY2hrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXJlZnJlc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IGJ0blJlbG9hZFwiIHBUb29sdGlwPVwiTMOgbSBt4bubaSBk4buvIGxp4buHdVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgW2Rpc2FibGVkXT1cIm1vZGVsLmxvYWRpbmdcIiAoY2xpY2spPVwiZ2V0RGF0YSgpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbk9yZGVyQ29sdW1uXCIgY2xhc3M9XCJzdHQgbm9wYWQgY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIiAoZGJsY2xpY2spPVwicmVsb2FkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdUVCcgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wgJiYgY29sLnZpc2libGUgJiYgY29sLmZpZWxkIT0nZnVuY3Rpb24nXCIgW3R0U29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NOYW1lXT1cImNvbC5jbGFzc1wiIFtwVG9vbHRpcF09XCJjb2wuZnVsbExhYmVsXCIgdG9vbHRpcFN0eWxlQ2xhc3M9XCJ1bnNldC13aWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb2wubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRyZWVUYWJsZVNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3AtdHJlZVRhYmxlU29ydEljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW5cIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENo4bupYyBuxINuZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0hlYWRlckZpbHRlcjsgY29udGV4dDoge2NvbHVtbnM6IGNvbHVtbnN9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93Tm9kZSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIFt0dFJvd109XCJyb3dOb2RlXCIgW2NsYXNzLmdlbmVyYXRlZC1ieS1iYXNlXT1cInJvd0RhdGEuX0dlbmVyYXRlZEJ5QmFzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvd0luZGV4XT1cInJvd0RhdGFbZmllbGRJbmRleEluRGF0YVNvdXJjZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2hrYm94IGxpbmstb3ItYWN0aW9uIGNlbGwtY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IFsobmdNb2RlbCldPVwicm93RGF0YS5fY2hlY2tlZFwiIGJpbmFyeT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoYW5kbGVDaGVja1Jvd0RhdGEocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiY2hrYm94IGxpbmstb3ItYWN0aW9uIGNlbGwtY2hlY2tib3hcIj57e3Jvd0RhdGFbZmllbGRPcmRlcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50VGQ7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIHJvd05vZGU6IHJvd05vZGUsIGNvbDogY29sLCBpbmRleDogaW5kZXgsIGk6IGl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2Z1bmN0aW9uJylcIiBjbGFzcz1cInAtdG9vbGJhci1ncm91cC1jZW50ZXIgYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnZnVuY3Rpb24nKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IGluZGV4fVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFoYXNUZW1wbGF0ZSgnZnVuY3Rpb24nKVwiIGNsYXNzPVwicC10b29sYmFyLWdyb3VwLWNlbnRlciBidXR0b24tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IGluZGV4fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdidXR0b25CZWZvcmUnKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93RGF0YS5oaWRkZW5FZGl0XCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0ZPUk0uRURJVCcgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZUVkaXQocm93RGF0YSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1pbmZvIGxpbmstb3ItYWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiIChjbGljayk9XCJlZGl0KHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFyb3dEYXRhLmhpZGRlbkRlbGV0ZVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVEZWxldGUocm93RGF0YSlcIiBbcFRvb2x0aXBdPVwiJ0ZPUk0uREVMRVRFJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBsaW5rLW9yLWFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIChjbGljayk9XCJkZWxldGUocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKm5nSWY9XCJ0aGlzLm1lbnVCdXR0b25zXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gaWNvbj1cInBpIHBpLWVsbGlwc2lzLXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpbmstb3ItYWN0aW9uIHAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mbyBwLWJ1dHRvbi1yb3VuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvb2x0aXA9XCJDaOG7qWMgbsSDbmcga2jDoWNcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0NvbnRleHRNZW51KCRldmVudCwgcm93RGF0YSlcIj48L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhZnRlci12aWV3LWNoZWNrZWQgKm5nSWY9XCJyb3dEYXRhLl9pbmRleCA9PSBfcmF3RGF0YVNvdXJjZS5sZW5ndGggLSAxXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZW5kZXJLZXldPVwiZGF0YVNvdXJjZVwiIChsb2FkZWQpPVwiaGFuZGxlVGFibGVSZW5kZXJlZCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdHJlZVRhYmxlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWJvdHRvbS1zdGlja3lcIj48L2Rpdj5cclxuICAgICAgICA8L3RuLWN1c3RvbS1zY3JvbGxiYXI+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxuZy10ZW1wbGF0ZSAjYnV0dG9uQWRkPlxyXG4gICAgPHNwYW4gW2FwcEF1dGhvcml6ZV09XCJzZXJ2aWNlQ29kZVwiIFtwZXJtaXNzaW9uXT1cImF1dGhvcml6ZVBhdGhzW2NvbW1vbkNvbnN0LkFERF1cIlxyXG4gICAgICAgIFtlbmFibGVBdXRob3JpemVdPVwiYnV0dG9uQXBwbHlBdXRob3JpemVbY29tbW9uQ29uc3QuQUREXVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBsYWJlbD1cIlRow6ptIG3hu5tpXCIgaWNvbj1cInBpIHBpLXBsdXNcIiBjbGFzcz1cInAtYnV0dG9uLXRleHRcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1vZGVsLmJhc2VSZWFkeVwiIChjbGljayk9XCJhZGQoKVwiPjwvYnV0dG9uPlxyXG4gICAgPC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2J1dHRvbkRlbGV0ZT5cclxuICAgIDxidXR0b24gKm5nSWY9XCIhaGlkZGVuRGVsZXRlICYmIG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCAmJiAhZGlzYWJsZU11bHRpcGxlRGVsZXRlKClcIlxyXG4gICAgICAgIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIiBbcGVybWlzc2lvbl09XCJhdXRob3JpemVQYXRoc1tjb21tb25Db25zdC5ERUxFVEVfTVVMVElQTEVdXCJcclxuICAgICAgICBbZW5hYmxlQXV0aG9yaXplXT1cImJ1dHRvbkFwcGx5QXV0aG9yaXplW2NvbW1vbkNvbnN0LkRFTEVURV9NVUxUSVBMRV1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgW2xhYmVsXT1cIidYw7NhICcgKyAobW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGgpIHwgdHJhbnNsYXRlXCIgaWNvbj1cInBpIHBpLXRyYXNoXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZU11dGlwbGUoKVwiPjwvYnV0dG9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnRUZCBsZXQtcm93RGF0YSBsZXQtcm93Tm9kZT1cInJvd05vZGVcIiBsZXQtY29sPVwiY29sXCIgbGV0LWluZGV4PVwiaW5kZXhcIiBsZXQtaT1cImlcIlxyXG4gICAgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDx0ZCAqbmdJZj1cImNvbCAmJiBjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQgIT0gJ2Z1bmN0aW9uJyAmJiAoIXJvd0RhdGEuaGlkZGVuIHx8ICFyb3dEYXRhLmhpZGRlbltjb2wuZmllbGRdKVwiXHJcbiAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2NvbC5maWVsZF1cIlxyXG4gICAgICAgIFthdHRyLnJvd1NwYW5dPVwicm93RGF0YS5yb3dTcGFuICYmIHJvd0RhdGEucm93U3Bhbltjb2wuZmllbGRdXCIgW25nU3R5bGVdPVwiY29sLmV4dGVuZERhdGEuc3R5bGVcIlxyXG4gICAgICAgIFtjbGFzc109XCJjb2wuY2VsbENsYXNzXCIgW2NsYXNzLmZpcnN0LXRkXT1cImkgPT0gMFwiPlxyXG4gICAgICAgIDx0bi10cmVlVGFibGVUb2dnbGVyICpuZ0lmPVwiY29sLmNvbEhhc1RvZ2dsZUljb25cIiBbcm93Tm9kZV09XCJyb3dOb2RlXCI+PC90bi10cmVlVGFibGVUb2dnbGVyPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiY29sLnBpcGVcIj5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCIgW3BUb29sdGlwXT1cImNvbC5mdWxsTGFiZWxcIiBbZXNjYXBlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPnt7Y29sLmxhYmVsfX08L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICB7e3Jvd0RhdGFbJ3BpcGVfXycgKyBjb2wuZmllbGRdfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhY29sLnBpcGVcIj5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cInAtY29sdW1uLXRpdGxlXCIgW3BUb29sdGlwXT1cImNvbC5mdWxsTGFiZWxcIiBbZXNjYXBlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPnt7Y29sLmxhYmVsfX08L3NwYW4+IC0tPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNldHRpbmcuc2hvd0VkaXRMaW5rICYmIGNvbC5zaG93RWRpdExpbmtcIiBjbGFzcz1cImxpbmstb3ItYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cInZpZXcocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVDZWxsOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY29udGVudENlbGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleCwgY29sOiBjb2wsIGV4cGFuZGVkOiBleHBhbmRlZFxyXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzZXR0aW5nLnNob3dFZGl0TGluayB8fCAhY29sLnNob3dFZGl0TGlua1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlQ2VsbDsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogY29udGVudENlbGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IGluZGV4LCBjb2w6IGNvbCwgZXhwYW5kZWQ6IGV4cGFuZGVkXHJcbiAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L3RkPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnRDZWxsIGxldC1jb2w9XCJjb2xcIiBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1maWVsZD1cImZpZWxkXCJcclxuICAgIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnRlbXBsYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbC50ZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGdldENvbXBvbmVudEJ5VHlwZShjb2wuZGF0YVR5cGUpLFxyXG4gICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogcm93SW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICB9XCI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sLnRlbXBsYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sLmRhdGFUeXBlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY29sb3InXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO3RleHQtYWxpZ246Y2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbcFRvb2x0aXBdPVwicm93RGF0YVtmaWVsZF1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOnJvd0RhdGFbZmllbGRdfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDozMHB4O2hlaWdodDozMHB4O21hcmdpbjowIGF1dG87XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidpY29uJ1wiIHN0eWxlPVwiZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxpIFtwVG9vbHRpcF09XCJyb3dEYXRhW2ZpZWxkXVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YVtmaWVsZF1cIj48L2k+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiIFtwVG9vbHRpcF09XCJyb3dEYXRhW2ZpZWxkXSB8IGRhdGU6J2RkL01NL3l5eXknXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICB7e19jcnVkU2VydmljZS5yZW5kZXJEYXRlKHJvd0RhdGFbZmllbGRdLCBjb2wuZm9ybWF0KX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIiBbcFRvb2x0aXBdPVwicm93RGF0YVtmaWVsZF0gfCBkYXRlOidkZC9NTS95eXl5IEhIOm1tJ1wiXHJcbiAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgIHt7X2NydWRTZXJ2aWNlLnJlbmRlckRhdGVUaW1lKHJvd0RhdGFbZmllbGRdLCBjb2wuZm9ybWF0KX19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid1c2VyJ1wiIGNsYXNzPVwidXNlclwiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXSB8IHVzZXJGb3JtYXQgfCBhc3luY319XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ3VzZXJzJ1wiIFtpbm5lckhUTUxdPVwicm93RGF0YVtmaWVsZF0gfCB1c2Vyc0Zvcm1hdCB8IGFzeW5jXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2ludCdcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IGNsYXNzPVwiYm9vbGVhbi1kYXRhLXR5cGVcIiBbKG5nTW9kZWwpXT1cInJvd0RhdGFbZmllbGRdXCIgYmluYXJ5PVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlQ2hlY2tCb3hcIj5cclxuICAgICAgICAgICAgICAgIDwvcC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2h0bWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicm93RGF0YVtmaWVsZF09PW51bGw/Jyc6cm93RGF0YVtmaWVsZF1cIiBbaW5uZXJIVE1MXT1cInJvd0RhdGFbZmllbGRdIHwgc2FmZUh0bWxcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ21ldGFkYXRhU3RhdHVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhWydyZWplY3RSZWFzb24nXVwiIGNsYXNzPVwibGFiZWwtZGFuZ2VyXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbJ3JlamVjdFJlYXNvbiddXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwU3R5bGVDbGFzcz1cInVuc2V0LXdpZHRoXCIgW2VzY2FwZV09XCJmYWxzZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlThu6sgY2jhu5FpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhW2ZpZWxkXSA9PSAnMCcgJiYgIXJvd0RhdGFbJ3JlamVjdFJlYXNvbiddXCIgY2xhc3M9XCJsYWJlbC1zZWNvbmRhcnlcIj5DaMawYVxyXG4gICAgICAgICAgICAgICAgICAgIGR1eeG7h3Q8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbZmllbGRdID09ICcxJyAmJiAhcm93RGF0YVsncmVqZWN0UmVhc29uJ11cIiBjbGFzcz1cImxhYmVsLXdhcm5pbmdcIj5DaOG7nSBkdXnhu4d0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3dEYXRhW2ZpZWxkXSA9PSAnMidcIiBjbGFzcz1cImxhYmVsLXByaW1hcnlcIj7EkMOjIGR1eeG7h3Q8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50Q2VsbFN0cmluZzsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwibnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRDZWxsU3RyaW5nOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCBmaWVsZDogY29sLmZpZWxkfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVDZWxsOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBnZXRDb21wb25lbnRCeVR5cGUoY29sLmRhdGFUeXBlKSxcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogcm93SW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnRDZWxsU3RyaW5nIGxldC1yb3dEYXRhIGxldC1maWVsZD1cImZpZWxkXCI+XHJcbiAgICA8c3Bhbj5cclxuICAgICAgICA8IS0tIF9fc3Y6IFNob3J0IFZhbHVlIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkICsgJ19fc3YnXVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGQgKyAnX19zdiddfX1cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXNob3dmdWxsXCIgKGNsaWNrKT1cInRvZ2dsZVNob3dGdWxsKHJvd0RhdGEsIGZpZWxkKVwiIHBUb29sdGlwPVwiQuG6pW0gxJHhu4MgeGVtIHRow6ptXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5bLi4uXTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkICsgJ19fc2hvd0Z1bGwnXVwiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zaG93ZnVsbFwiIChjbGljayk9XCJ0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZClcIj5UaHUgZ+G7jW48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm93RGF0YVtmaWVsZCArICdfX3N2J11cIj5cclxuICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXX19XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3VzdG9tVGVtcGxhdGVDZWxsIGxldC10ZW1wbGF0ZSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jb2w9XCJjb2xcIlxyXG4gICAgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICRpbXBsaWNpdDogcm93RGF0YSwgXHJcbiAgICAgICAgY3J1ZExpc3Q6IHRoaXMsXHJcbiAgICAgICAgcm93SW5kZXgsXHJcbiAgICAgICAgY29sLFxyXG4gICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgZXhwYW5kZWQsXHJcbiAgICAgICAgaWNvblRvZ2dsZVJvd0RhdGE6IHRoaXMuaWNvblRvZ2dsZVJvd0RhdGFcclxuICAgIH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRhaW5lclN0aWNreT5cclxuICAgIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSB0b3BcIj48L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpeC1zdGlja3kgcmlnaHRcIj48L3NwYW4+XHJcbiAgICA8IS0tIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSBib3R0b21cIj48L3NwYW4+IC0tPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmaXgtc3RpY2t5IGxlZnRcIj48L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjcm93SGVhZGVyRmlsdGVyIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgPHRyIGNsYXNzPVwiZmlsdGVyLXJvd1wiICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuRmlsdGVyUm93XCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiY2hrYm94IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICBbY2xhc3MudHJpY2hlY2tib3gtY3VzdG9tLWZhbHNlXT1cImNoZWNrZWRBbGwgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDxwLXRyaVN0YXRlQ2hlY2tib3ggWyhuZ01vZGVsKV09XCJjaGVja2VkQWxsXCIgYmluYXJ5PVwidHJ1ZVwiIChvbkNoYW5nZSk9XCJoYW5kbGVDaGVja0FsbCgpXCI+XHJcbiAgICAgICAgICAgIDwvcC10cmlTdGF0ZUNoZWNrYm94PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggY2xhc3M9XCJjaGtib3ggbm9wYWQgY2VudGVyXCIgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQgIT0gJ2Z1bmN0aW9uJ1wiIGNsYXNzPVwiY2VsbC1oZWFkZXItZmlsdGVyIGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5hbGxvd0ZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudGVtcGxhdGVGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wudGVtcGxhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbCwgZmlsdGVyRGF0YTogZmlsdGVyRGF0YSwgb25TZWFyY2g6IG9uU2VhcmNoLCBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsOiBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsLCBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsOiBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbC50ZW1wbGF0ZUZpbHRlclwiIFtuZ1N3aXRjaF09XCJjb2wuY29udHJvbFR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbC5yYXdDb2x1bW59XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sLmRhdGFUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ludCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlckRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlckRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyQm9vbGVhblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmlsdGVyVGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCIgY2xhc3M9XCJjZW50ZXIgc2V0dGluZy1jZWxsIGNvbHVtbi1mdW5jdGlvblwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIj5cclxuICAgICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuU2V0dGluZ1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLWNvZ1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiIHBUb29sdGlwPVwiQ+G6pXUgaMOsbmggaGnhu4NuIHRo4buLXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93U2V0dGluZ3MoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuU2V0dGluZ1Blcm1pc3Npb25cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGljb249XCJwaSBwaS11c2Vyc1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiIHBUb29sdGlwPVwiUGjDom4gcXV54buBbiBk4buvIGxp4buHdVwiIHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNoZWNrUGVybWlzc2lvblRvVXNlQnV0dG9uKEJVVFRPTl9QSEFOX1FVWUVOKVwiIChjbGljayk9XCJzaG93U2V0dGluZ3NQZXJtaXNzaW9uKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlblNldHRpbmdXb3JrZmxvd1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNpdGVtYXBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBwVG9vbHRpcD1cIkPhuqV1IGjDrG5oIHF1eSB0csOsbmhcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja1Blcm1pc3Npb25Ub1VzZUJ1dHRvbihCVVRUT05fQ0FVX0hJTkhfUVVZX1RSSU5IKVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1NldHRpbmdzV29ya2Zsb3dOZXcoKVwiPjwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICA8L3RyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlckRyb3Bkb3duIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItcmFkaXVzOiA0cHg7XCI+XHJcbiAgICAgICAgPGRyb3Bkb3duICpuZ0lmPVwiY29sICYmIGZpbHRlclNjaGVtYS5kcm9wZG93bltjb2wuZmllbGRdXCIgW2NvbnRyb2xdPVwiZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICBbZGF0YVNvdXJjZV09XCJmaWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXS5kYXRhU291cmNlXCIgWyh2YWx1ZSldPVwiZmlsdGVyRGF0YVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgKG9uSGlkZVNtYXJ0RXZlbnQpPVwib25TZWFyY2goKVwiIChvblNob3cpPVwib25TaG93RmlsdGVyRHJvcGRvd25QYW5lbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uSGlkZSk9XCJvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsKCRldmVudClcIiAobW91c2Vkb3duKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+PC9kcm9wZG93bj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlclRleHQgbGV0LWNvbD1cImNvbFwiPlxyXG4gICAgPGRpdiAjZmlsdGVyQm94IGNsYXNzPVwidGV4dC1maWx0ZXIgZmlsdGVyLWJveFwiIHRhYmluZGV4PVwiLTFcIiAobW91c2Vkb3duKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPGRpdiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJpbnB1dC1zZWFyY2hcIiBbcGxhY2Vob2xkZXJdPVwiY29sLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyRGF0YVtjb2wuZmllbGRdXCIgKGNoYW5nZSk9XCJvblNlYXJjaCgpXCJcclxuICAgICAgICAgICAgICAgIChrZXl1cC5lc2MpPVwib25DbGVhclNlYXJjaChmaWx0ZXJCb3gsIGNvbC5maWVsZClcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7J2FjdGlvbi1jbGVhcic6IHRydWUsICdkaXJ0eSc6IGZpbHRlckRhdGFbY29sLmZpZWxkXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXSAhPT0gJyd9XCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cIidC4buPIGZpbHRlcidcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiAobW91c2Vkb3duKT1cIm9uQ2xlYXJTZWFyY2goZmlsdGVyQm94LCBjb2wuZmllbGQpXCJcclxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPjxpIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAobG9hZGVkKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJOdW1iZXIgbGV0LWNvbD1cImNvbFwiPlxyXG4gICAgPGRpdiAjZmlsdGVyQm94IGNsYXNzPVwibnVtYmVyLXBpY2tlci1yYW5nZSBmaWx0ZXItYm94XCIgdGFiaW5kZXg9XCItMVwiIChtb3VzZWRvd24pPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgPHRuLW51bWJlci1waWNrZXItcmFuZ2UgI251bWJlclJhbmdlIFttYXNrVHlwZV09XCJjb2wuZGF0YVR5cGVcIiBbKG5nTW9kZWwpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICBbbWluXT1cImNvbC5taW5cIiBbbWF4XT1cImNvbC5tYXhcIiAoY2hhbmdlKT1cIm9uU2VhcmNoKClcIj5cclxuICAgICAgICAgICAgPC90bi1udW1iZXItcGlja2VyLXJhbmdlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWNsZWFyJzogdHJ1ZSwgJ2RpcnR5JzogZmlsdGVyRGF0YVtjb2wuZmllbGRdICYmICgoZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9PSAnJykgfHwgKGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPT0gJycpKX1cIlxyXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0Lhu48gZmlsdGVyJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIChtb3VzZWRvd24pPVwib25DbGVhck51bWJlclNlYXJjaChmaWx0ZXJCb3gsIG51bWJlclJhbmdlKVwiXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1maWx0ZXItc2xhc2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDxhZnRlci12aWV3LWNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChsb2FkZWQpPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlckRhdGUgbGV0LWNvbD1cImNvbFwiPlxyXG4gICAgPGRpdiAjZmlsdGVyQm94IGNsYXNzPVwiZGF0ZS1waWNrZXItcmFuZ2UgZmlsdGVyLWJveFwiIHRhYmluZGV4PVwiLTFcIiAobW91c2Vkb3duKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPGRpdiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDx0bi1kYXRldGltZS1waWNrZXItcmFuZ2UgI2RhdGVSYW5nZSBbY29udHJvbF09XCJmaWx0ZXJTY2hlbWEuZGF0ZVJhbmdlXCJcclxuICAgICAgICAgICAgICAgIChvbkNoYW5nZWQpPVwib25DaGFuZ2VEYXRlVGltZSgkZXZlbnQsIGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPC90bi1kYXRldGltZS1waWNrZXItcmFuZ2U+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3Rpb24tY2xlYXInOiB0cnVlLCAnZGlydHknOiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gJiYgKChmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMF0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMF0gIT09ICcnKSB8fCAoZmlsdGVyRGF0YVtjb2wuZmllbGRdWzFdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdWzFdICE9PSAnJykpfVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInQuG7jyBmaWx0ZXInXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkNsZWFyRGF0ZVNlYXJjaChmaWx0ZXJCb3gsIGRhdGVSYW5nZSwgY29sLmZpZWxkKVwiIHRhYmluZGV4PVwiLTFcIj48aVxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwaSBwaS1maWx0ZXItc2xhc2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDxhZnRlci12aWV3LWNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChsb2FkZWQpPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlckJvb2xlYW4gbGV0LWNvbD1cImNvbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1ib29sZWFuLWJveFwiPlxyXG4gICAgICAgIDxwLXNlbGVjdEJ1dHRvblxyXG4gICAgICAgICAgICBbb3B0aW9uc109XCJbe3ZhbHVlOiB0cnVlLCBsYWJlbDogJ0PDsycsIGljb246ICdwaSBwaS1jaGVjayd9LCB7dmFsdWU6IGZhbHNlLCBsYWJlbDogJ0tow7RuZycsIGljb246ICdwaSBwaS10aW1lcyd9XVwiXHJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIiAob25DaGFuZ2UpPVwib25DaGFuZ2VCb29sZWFuKCRldmVudCwgY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICA8aSBzdHlsZT1cInBhZGRpbmc6IDNweCAwO1wiIFtjbGFzc109XCJpdGVtLmljb25cIj48L2k+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|