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
|
@@ -76,9 +76,9 @@ export class CrudListComponent extends ListComponentBase {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
CrudListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CrudListComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
-
CrudListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CrudListComponent, selector: "crud-list", providers: [DecimalPipe, DatePipe], usesInheritance: true, ngImport: i0, template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-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 *ngIf=\"!setting.hiddenHeader\" class=\"grid ui-fluid custom-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\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, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <ng-container *ngIf=\"hasTemplate('customPageSetting')\"\r\n [ngTemplateOutlet]=\"getTemplate('customPageSetting')\" [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hasTemplate('customPageSetting')\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\r\n selectedItems: model.selectedItems, crudList: this,\r\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\r\n (click)=\"danhSoThuTuGroupLastest()\"></button>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'md:col-12 lg:col-12' : 'md:col-5 lg:col-4'\">\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\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<ng-container *ngIf=\"_showSettings && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListSetting']; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveSettings, onCancel: handleCancelSetting\r\n }\"></ng-container>\r\n <!-- <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\" (onCancel)=\"_showSettings = false\">\r\n </settings> -->\r\n</ng-container>\r\n<ng-container *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListSettingRow']; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveColorSettings, onCancel: handleCancelSettingRow\r\n }\"></ng-container>\r\n <!-- <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\" (onCancel)=\"_showSettingsRowColor = false\">\r\n </settings-row> -->\r\n</ng-container>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowSetting']; context: {\r\n dialogModel: workflowSettingModel, parentSetting: setting, onSaved: onSaveWorkflowSettings\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"workflowSettingModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListProcessWorkflow']; context: {\r\n $implicit: currentItem, dialogModel: processWorkflowModel, onSaved: handleProcessedWorkflowBase\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"processWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListChoYKien']; context: {\r\n dialogModel: choYKienModel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"choYKienModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowSetting']; context: {\r\n $implicit: currentItem, dialogModel: workflowHistoryModel\r\n }\"></ng-container>\r\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFormCongViec']; context: {\r\n dialogModel: detailTaskModel, isFormView: true\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"detailTaskModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListPermissionSharing']; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionSharingModel, baseService: setting.baseService\r\n }\"></ng-container>\r\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowPermission']; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionListModel, businessSetting: setting\r\n }\"></ng-container>\r\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListStartWorkflow']; context: {\r\n dialogModel: startWorkflowModel, onSaved: handleStartWorkflowFromDialog\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"startWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFormCongViec']; context: {\r\n dialogModel: congViecModel, getData: getData, isFormView: false\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"congViecModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListShareLinkByPermission']; context: {\r\n dialogModel: shareLinkModel, setting: setting\r\n }\"></ng-container>\r\n <!-- <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"shareLinkModel.showEditForm = false\">\r\n </share-link-by-permission> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListCongViec']; context: {\r\n baseService: setting.baseService, itemIdAttach: rowDataCurrent.id\r\n }\"></ng-container>\r\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('rowExpansion')\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('rowExpansion'); context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!hasTemplate('rowGroup')\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <div class=\"content-row-group\">\r\n <ng-container *ngIf=\"!hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('contentRowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('rowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('rowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"hasTemplate('rowExpansion')\" style=\"width: 2.5rem\" />\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=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\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 #buttonExport>\r\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" 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\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></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.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [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 && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [tnSortableColumn]=\"col.field\" [hostRef]=\"this\" [tnSortableColumnDisabled]=\"!col.sort\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" 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)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad center row-expansion-toggle\"\r\n [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=\"'intWithoutMask'\">\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=\"'currency'\">\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=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\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 #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\r\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\r\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"hasTemplate('rowExpansion') && !rowData.hidden[fieldColExpand]\"\r\n class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\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=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\r\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\r\n (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EDIT]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.DELETE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngIf=\"rowData.template\">\r\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\r\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\r\n }\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && !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 <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=\"customTemplateCell; context: {\r\n $implicit: col.template,\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 {{rowData[field] | tnDate:col.dataType: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 {{rowData[field] | tnDate:col.dataType: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] | number}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field] | number}}\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=\"'fileUpload'\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFileUploadColumn']; context: {\r\n $implicit: rowData, parentContext: context, field: col.field, fileSetting: col.fileSetting\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customTemplate['crudListFileManager']; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\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 #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\r\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\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 #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\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 *ngIf=\"!col.minimizeFilter\"\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 <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>", styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{inset:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2;position:relative}.custom-search-area .collapse-expand{position:absolute;cursor:pointer;width:100%;height:1em;left:0;bottom:0;text-align:center;background:#e5e5e5}.custom-search-area .collapse-expand:hover{background:#ebebeb}.custom-search-area.collapsed{height:1em;overflow:hidden}.custom-search-area.collapsed .collapse-expand{bottom:-.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,calc(-50% - 1px))}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary){background:#f5f6f8;color:#6c757d;border-color:#ced4da}.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep crud-list .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 crud-list .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 crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter:focus-within,::ng-deep crud-list .cell-header-filter.focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>div,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--top,::ng-deep crud-list .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width: 640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}\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: "component", type: i5.ContextMenu, selector: "p-contextMenu", inputs: ["model", "global", "target", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "triggerEvent"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i6.ReorderableRowHandle, selector: "[pReorderableRowHandle]", inputs: ["pReorderableRowHandle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.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: i9.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]" }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.DatetimePickerRangeComponent, selector: "tn-datetime-picker-range", inputs: ["control", "disabled"], outputs: ["onInit", "onClose", "onChanged"] }, { kind: "component", type: i14.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: i15.EntityPermissionComponent, selector: "entity-permission", inputs: ["parentSetting", "searchInfo", "formSchema"], outputs: ["onCancel"] }, { kind: "component", type: i16.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: i17.PagingNextBackOnlyComponent, selector: "paging-next-back-only", inputs: ["model", "setting", "ngClass"], outputs: ["onNext", "onPrev", "onLatest", "onRefresh", "onOldest", "onChangeLimitPage", "onChanged"] }, { kind: "component", type: i18.TnDialogComponent, selector: "tn-dialog", inputs: ["maskClass", "styleClass", "scrollBarStyleClass", "useDefaultScrollBar", "visible", "disabledButton", "modal", "header", "popupSize", "closeOnEscape", "showFooter", "positionTop", "minY", "hiddenSave", "maximizable"], outputs: ["onSave", "onCancel", "onShow", "onHide"] }, { kind: "component", type: i19.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: i20.AuthorizeDirective, selector: "[appAuthorize]", inputs: ["appAuthorize", "permissionType", "isNavigationPermission", "controller", "permission", "enableAuthorize", "keepHTML"] }, { kind: "directive", type: i21.TnReorderableRowDirective, selector: "[tnReorderableRow]", inputs: ["tnReorderableRow", "tnReorderableRowDisabled"] }, { kind: "directive", type: i21.TnSortableColumnDirective, selector: "[tnSortableColumn]", inputs: ["tnSortableColumn", "tnSortableColumnDisabled", "hostRef"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.SafeHtmlPipe, name: "safeHtml" }, { kind: "pipe", type: i24.UserFormatPipe, name: "userFormat" }, { kind: "pipe", type: i25.UsersFormatPipe, name: "usersFormat" }, { kind: "pipe", type: i26.TnDatePipe, name: "tnDate" }] });
|
|
79
|
+
CrudListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: CrudListComponent, selector: "crud-list", providers: [DecimalPipe, DatePipe], usesInheritance: true, ngImport: i0, template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-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 *ngIf=\"!setting.hiddenHeader\" class=\"grid ui-fluid custom-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\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, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <ng-container *ngIf=\"hasTemplate('customPageSetting')\"\r\n [ngTemplateOutlet]=\"getTemplate('customPageSetting')\" [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hasTemplate('customPageSetting')\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\r\n selectedItems: model.selectedItems, crudList: this,\r\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\r\n (click)=\"danhSoThuTuGroupLastest()\"></button>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'md:col-12 lg:col-12' : 'md:col-5 lg:col-4'\">\r\n <ng-container *ngTemplateOutlet=\"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\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<ng-container *ngIf=\"_showSettings && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"crudListSetting; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveSettings, onCancel: handleCancelSetting\r\n }\"></ng-container>\r\n <!-- <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\" (onCancel)=\"_showSettings = false\">\r\n </settings> -->\r\n</ng-container>\r\n<ng-container *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"crudListSettingRow; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveColorSettings, onCancel: handleCancelSettingRow\r\n }\"></ng-container>\r\n <!-- <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\" (onCancel)=\"_showSettingsRowColor = false\">\r\n </settings-row> -->\r\n</ng-container>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowSetting; context: {\r\n dialogModel: workflowSettingModel, parentSetting: setting, onSaved: onSaveWorkflowSettings\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"workflowSettingModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <ng-container *ngTemplateOutlet=\"crudListProcessWorkflow; context: {\r\n $implicit: currentItem, dialogModel: processWorkflowModel, onSaved: handleProcessedWorkflowBase\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"processWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListChoYKien; context: {\r\n dialogModel: choYKienModel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"choYKienModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowSetting; context: {\r\n $implicit: currentItem, dialogModel: workflowHistoryModel\r\n }\"></ng-container>\r\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListFormCongViec; context: {\r\n dialogModel: detailTaskModel, isFormView: true\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"detailTaskModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListPermissionSharing; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionSharingModel, baseService: setting.baseService\r\n }\"></ng-container>\r\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowPermission; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionListModel, businessSetting: setting\r\n }\"></ng-container>\r\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListStartWorkflow; context: {\r\n dialogModel: startWorkflowModel, onSaved: handleStartWorkflowFromDialog\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"startWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListFormCongViec; context: {\r\n dialogModel: congViecModel, getData: getData, isFormView: false\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"congViecModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListShareLinkByPermission; context: {\r\n dialogModel: shareLinkModel, setting: setting\r\n }\"></ng-container>\r\n <!-- <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"shareLinkModel.showEditForm = false\">\r\n </share-link-by-permission> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListCongViec; context: {\r\n baseService: setting.baseService, itemIdAttach: rowDataCurrent.id\r\n }\"></ng-container>\r\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('rowExpansion')\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('rowExpansion'); context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-expanded=\"expanded\"\r\n let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!hasTemplate('rowGroup')\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <div class=\"content-row-group\">\r\n <ng-container *ngIf=\"!hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('contentRowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('rowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('rowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"hasTemplate('rowExpansion')\" style=\"width: 2.5rem\" />\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=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\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 #buttonExport>\r\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" 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\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></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.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [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 && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [tnSortableColumn]=\"col.field\" [hostRef]=\"this\" [tnSortableColumnDisabled]=\"!col.sort\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" 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)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad center row-expansion-toggle\"\r\n [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=\"'intWithoutMask'\">\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=\"'currency'\">\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=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\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 #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [hostRef]=\"this\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"rowData.objStyleClass\" [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"hasTemplate('rowExpansion') && !rowData.hidden[fieldColExpand]\"\r\n class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\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=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\r\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\r\n (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EDIT]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.DELETE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngIf=\"rowData.template\">\r\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\r\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\r\n }\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && !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 <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\" tooltipPosition=\"top\"></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 let-rowIndex=\"rowIndex\" let-field=\"field\" let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: col.template,\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 {{rowData[field] | tnDate:col.dataType: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 {{rowData[field] | tnDate:col.dataType: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] | number}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field] | number}}\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=\"'fileUpload'\">\r\n <ng-container *ngTemplateOutlet=\"crudListFileUploadColumn; context: {\r\n $implicit: rowData, parentContext: context, field: col.field, fileSetting: col.fileSetting\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"crudListFileManager; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\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 <!-- __sv: Short Value -->\r\n <span>\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 #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\r\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\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 #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\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 *ngIf=\"!col.minimizeFilter\"\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 <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>", styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{inset:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2;position:relative}.custom-search-area .collapse-expand{position:absolute;cursor:pointer;width:100%;height:1em;left:0;bottom:0;text-align:center;background:#e5e5e5}.custom-search-area .collapse-expand:hover{background:#ebebeb}.custom-search-area.collapsed{height:1em;overflow:hidden}.custom-search-area.collapsed .collapse-expand{bottom:-.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,calc(-50% - 1px))}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary){background:#f5f6f8;color:#6c757d;border-color:#ced4da}.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep crud-list .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 crud-list .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 crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter:focus-within,::ng-deep crud-list .cell-header-filter.focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>div,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--top,::ng-deep crud-list .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width: 640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}\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: "component", type: i5.ContextMenu, selector: "p-contextMenu", inputs: ["model", "global", "target", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "triggerEvent"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i6.ReorderableRowHandle, selector: "[pReorderableRowHandle]", inputs: ["pReorderableRowHandle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.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: i9.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]" }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.AfterViewCheckedComponent, selector: "after-view-checked", inputs: ["renderKey"], outputs: ["loaded", "loading", "unloading", "reRender"] }, { kind: "component", type: i13.DatetimePickerRangeComponent, selector: "tn-datetime-picker-range", inputs: ["control", "disabled"], outputs: ["onInit", "onClose", "onChanged"] }, { kind: "component", type: i14.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: i15.EntityPermissionComponent, selector: "entity-permission", inputs: ["parentSetting", "searchInfo", "formSchema"], outputs: ["onCancel"] }, { kind: "component", type: i16.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: i17.PagingNextBackOnlyComponent, selector: "paging-next-back-only", inputs: ["model", "setting", "ngClass"], outputs: ["onNext", "onPrev", "onLatest", "onRefresh", "onOldest", "onChangeLimitPage", "onChanged"] }, { kind: "component", type: i18.TnDialogComponent, selector: "tn-dialog", inputs: ["maskClass", "styleClass", "scrollBarStyleClass", "useDefaultScrollBar", "visible", "disabledButton", "modal", "header", "popupSize", "closeOnEscape", "showFooter", "positionTop", "minY", "hiddenSave", "maximizable"], outputs: ["onSave", "onCancel", "onShow", "onHide"] }, { kind: "component", type: i19.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: i20.AuthorizeDirective, selector: "[appAuthorize]", inputs: ["appAuthorize", "permissionType", "isNavigationPermission", "controller", "permission", "enableAuthorize", "keepHTML"] }, { kind: "directive", type: i21.TnReorderableRowDirective, selector: "[tnReorderableRow]", inputs: ["tnReorderableRow", "tnReorderableRowDisabled", "hostRef"] }, { kind: "directive", type: i21.TnSortableColumnDirective, selector: "[tnSortableColumn]", inputs: ["tnSortableColumn", "tnSortableColumnDisabled", "hostRef"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.SafeHtmlPipe, name: "safeHtml" }, { kind: "pipe", type: i24.UserFormatPipe, name: "userFormat" }, { kind: "pipe", type: i25.UsersFormatPipe, name: "usersFormat" }, { kind: "pipe", type: i26.TnDatePipe, name: "tnDate" }] });
|
|
80
80
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: CrudListComponent, decorators: [{
|
|
81
81
|
type: Component,
|
|
82
|
-
args: [{ selector: 'crud-list', providers: [DecimalPipe, DatePipe], template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-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 *ngIf=\"!setting.hiddenHeader\" class=\"grid ui-fluid custom-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\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, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <ng-container *ngIf=\"hasTemplate('customPageSetting')\"\r\n [ngTemplateOutlet]=\"getTemplate('customPageSetting')\" [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hasTemplate('customPageSetting')\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\r\n selectedItems: model.selectedItems, crudList: this,\r\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\r\n (click)=\"danhSoThuTuGroupLastest()\"></button>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'md:col-12 lg:col-12' : 'md:col-5 lg:col-4'\">\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\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<ng-container *ngIf=\"_showSettings && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListSetting']; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveSettings, onCancel: handleCancelSetting\r\n }\"></ng-container>\r\n <!-- <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\" (onCancel)=\"_showSettings = false\">\r\n </settings> -->\r\n</ng-container>\r\n<ng-container *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListSettingRow']; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveColorSettings, onCancel: handleCancelSettingRow\r\n }\"></ng-container>\r\n <!-- <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\" (onCancel)=\"_showSettingsRowColor = false\">\r\n </settings-row> -->\r\n</ng-container>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowSetting']; context: {\r\n dialogModel: workflowSettingModel, parentSetting: setting, onSaved: onSaveWorkflowSettings\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"workflowSettingModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListProcessWorkflow']; context: {\r\n $implicit: currentItem, dialogModel: processWorkflowModel, onSaved: handleProcessedWorkflowBase\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"processWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListChoYKien']; context: {\r\n dialogModel: choYKienModel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"choYKienModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowSetting']; context: {\r\n $implicit: currentItem, dialogModel: workflowHistoryModel\r\n }\"></ng-container>\r\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFormCongViec']; context: {\r\n dialogModel: detailTaskModel, isFormView: true\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"detailTaskModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListPermissionSharing']; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionSharingModel, baseService: setting.baseService\r\n }\"></ng-container>\r\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListWorkflowPermission']; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionListModel, businessSetting: setting\r\n }\"></ng-container>\r\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListStartWorkflow']; context: {\r\n dialogModel: startWorkflowModel, onSaved: handleStartWorkflowFromDialog\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"startWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFormCongViec']; context: {\r\n dialogModel: congViecModel, getData: getData, isFormView: false\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"congViecModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListShareLinkByPermission']; context: {\r\n dialogModel: shareLinkModel, setting: setting\r\n }\"></ng-container>\r\n <!-- <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"shareLinkModel.showEditForm = false\">\r\n </share-link-by-permission> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListCongViec']; context: {\r\n baseService: setting.baseService, itemIdAttach: rowDataCurrent.id\r\n }\"></ng-container>\r\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('rowExpansion')\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('rowExpansion'); context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\" let-expanded=\"expanded\" let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!hasTemplate('rowGroup')\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <div class=\"content-row-group\">\r\n <ng-container *ngIf=\"!hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('contentRowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('rowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('rowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"hasTemplate('rowExpansion')\" style=\"width: 2.5rem\" />\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=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\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 #buttonExport>\r\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" 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\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></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.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [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 && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [tnSortableColumn]=\"col.field\" [hostRef]=\"this\" [tnSortableColumnDisabled]=\"!col.sort\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" 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)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad center row-expansion-toggle\"\r\n [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=\"'intWithoutMask'\">\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=\"'currency'\">\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=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\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 #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\" [ngClass]=\"rowData.objStyleClass\"\r\n [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\" tooltipPosition=\"top\"\r\n [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\" (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"hasTemplate('rowExpansion') && !rowData.hidden[fieldColExpand]\"\r\n class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\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=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\r\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\r\n (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EDIT]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.DELETE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngIf=\"rowData.template\">\r\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\r\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\r\n }\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && !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 <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=\"customTemplateCell; context: {\r\n $implicit: col.template,\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 {{rowData[field] | tnDate:col.dataType: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 {{rowData[field] | tnDate:col.dataType: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] | number}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field] | number}}\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=\"'fileUpload'\">\r\n <ng-container *ngTemplateOutlet=\"customTemplate['crudListFileUploadColumn']; context: {\r\n $implicit: rowData, parentContext: context, field: col.field, fileSetting: col.fileSetting\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"customTemplate['crudListFileManager']; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\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 #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\r\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\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 #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\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 *ngIf=\"!col.minimizeFilter\"\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 <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>", styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{inset:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2;position:relative}.custom-search-area .collapse-expand{position:absolute;cursor:pointer;width:100%;height:1em;left:0;bottom:0;text-align:center;background:#e5e5e5}.custom-search-area .collapse-expand:hover{background:#ebebeb}.custom-search-area.collapsed{height:1em;overflow:hidden}.custom-search-area.collapsed .collapse-expand{bottom:-.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,calc(-50% - 1px))}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary){background:#f5f6f8;color:#6c757d;border-color:#ced4da}.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep crud-list .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 crud-list .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 crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter:focus-within,::ng-deep crud-list .cell-header-filter.focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>div,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--top,::ng-deep crud-list .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width: 640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}\n"] }]
|
|
82
|
+
args: [{ selector: 'crud-list', providers: [DecimalPipe, DatePipe], template: "<div #container class=\"custom-card card card-w-title flex-container-fit-child\" [attr.height-type]=\"setting.heightType\"\r\n [ngStyle]=\"_style\">\r\n <div class=\"ui-helper-clearfix crud-list-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 *ngIf=\"!setting.hiddenHeader\" class=\"grid ui-fluid custom-col page-title-area\">\r\n <div *ngIf=\"!setting.hiddenPageTitle\" class=\"main-title\">\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, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <ng-container *ngIf=\"hasTemplate('customPageSetting')\"\r\n [ngTemplateOutlet]=\"getTemplate('customPageSetting')\" [ngTemplateOutletContext]=\"{crudList: this}\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hasTemplate('customPageSetting')\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onChanged)=\"getData()\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"fit-content crud-list-body-area\">\r\n <div class=\"crud-list-body-area-inner\" style=\"overflow: unset;\">\r\n <div class=\"flex-container-fit-child\" style=\"overflow: unset;\">\r\n <div *ngIf=\"!setting.hiddenToolbar\" class=\"grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('toolbar')\" [ngTemplateOutletContext]=\"{\r\n selectedItems: model.selectedItems, crudList: this,\r\n buttonAdd: buttonAdd, buttonExport: buttonExport, buttonDelete: buttonDelete\r\n }\">\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'md:col-12 lg:col-12' : 'md:col-7 lg:col-8'\"\r\n class=\"col-12 button-group function-topbar\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonBeforeToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n <button type=\"button\" pButton label=\"\u0110\u00E1nh STT\" class=\"p-button-text\" style=\"display: none\"\r\n (click)=\"danhSoThuTuGroupLastest()\"></button>\r\n <ng-container *ngIf=\"!hiddenAdd\" [ngTemplateOutlet]=\"buttonAdd\"></ng-container>\r\n <ng-container *ngIf=\"setting.showExportSelectedItems\" [ngTemplateOutlet]=\"buttonExport\">\r\n </ng-container>\r\n <ng-container *ngIf=\"!hiddenDelete\" [ngTemplateOutlet]=\"buttonDelete\">\r\n </ng-container>\r\n <button *ngIf=\"!setting.disableShare && model.selectedItems.length > 0\"\r\n label=\"Chia s\u1EBB li\u00EAn k\u1EBFt\" type=\"button\" pButton pRipple\r\n [pTooltip]=\"'Chia s\u1EBB li\u00EAn k\u1EBFt' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-text p-button-info link-or-action\" icon=\"pi pi-link\"\r\n (click)=\"createShareLinkMultiple()\"></button>\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('buttonAfterToolbar')\"\r\n [ngTemplateOutletContext]=\"{crudList: this}\"></ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!setting.hiddenAdvanceSearch\" class=\"col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'md:col-12 lg:col-12' : 'md:col-5 lg:col-4'\">\r\n <ng-container *ngTemplateOutlet=\"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\"\r\n [loading]=\"model.loading\" (onSearch)=\"handleSearchAdvs($event)\"\r\n (onInit)=\"handleInitAdvanceSearch($event)\">\r\n </advance-search> -->\r\n </div>\r\n </div>\r\n <div *ngIf=\"hasTemplate('topGrid')\" class=\"extend-content-top-grid\">\r\n <ng-container [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('topGrid')\"></ng-container>\r\n </div>\r\n <div class=\"container-table fit-content\" [class.--table-responsive]=\"responsive\">\r\n <div class=\"container-table-inner\">\r\n <ng-container *ngIf=\"!_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldFalse\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"_groupField\">\r\n <tn-custom-scrollbar *ngIf=\"showScrollBar\" #scrollbar\r\n [showScrollHorizontal]=\"showScrollHorizontal\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('afterCrudList')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('afterCrudList')\"></ng-container>\r\n </ng-container>\r\n </tn-custom-scrollbar>\r\n <div *ngIf=\"!showScrollBar\">\r\n <ng-container *ngTemplateOutlet=\"tableGetGroupFieldTrue\">\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"table-border-line --top\"></div>\r\n <div class=\"table-border-line --right\"></div>\r\n <div class=\"table-border-line --bottom\"></div>\r\n <div class=\"table-border-line --left\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<after-view-checked (loaded)=\"handleReady()\"></after-view-checked>\r\n<ng-container *ngIf=\"_showSettings && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"crudListSetting; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveSettings, onCancel: handleCancelSetting\r\n }\"></ng-container>\r\n <!-- <settings [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\" (onCancel)=\"_showSettings = false\">\r\n </settings> -->\r\n</ng-container>\r\n<ng-container *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\">\r\n <ng-container *ngTemplateOutlet=\"crudListSettingRow; context: {\r\n entityMetadataService: entityMetadataService, parentContext: context, parentSetting: setting,\r\n parentModel: model, onSaved: onSaveColorSettings, onCancel: handleCancelSettingRow\r\n }\"></ng-container>\r\n <!-- <settings-row [entityMetadataService]=\"entityMetadataService\" [parentContext]=\"context\" [parentSetting]=\"setting\"\r\n [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\" (onCancel)=\"_showSettingsRowColor = false\">\r\n </settings-row> -->\r\n</ng-container>\r\n<tn-dialog *ngIf=\"workflowSettingModel.showEditForm\" [header]=\"'C\u1EA5u h\u00ECnh quy tr\u00ECnh nghi\u1EC7p v\u1EE5' | translate\"\r\n [popupSize]=\"workflowSettingModel.popupSize\" (onHide)=\"workflowSettingModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowSetting; context: {\r\n dialogModel: workflowSettingModel, parentSetting: setting, onSaved: onSaveWorkflowSettings\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"workflowSettingModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onCancel)=\"workflowSettingModel.showEditForm = false\"></workflow-setting-new> -->\r\n</tn-dialog>\r\n<entity-permission *ngIf=\"_showSettingsPermission && !setting.hiddenSettingPermission\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" [searchInfo]=\"searchInfo\"\r\n (onCancel)=\"_showSettingsPermission = false\">\r\n</entity-permission>\r\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [styleClass]=\"'allow-selected'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"processWorkflowModel.showEditForm\" #dialog [header]=\"processWorkflowModel.header | translate\"\r\n [popupSize]=\"processWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"processWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%; padding: 1rem\">\r\n <ng-container *ngTemplateOutlet=\"crudListProcessWorkflow; context: {\r\n $implicit: currentItem, dialogModel: processWorkflowModel, onSaved: handleProcessedWorkflowBase\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"processWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <process-workflow-form #formBase [businessSetting]=\"processWorkflowModel.data.setting\" [item]=\"currentItem\"\r\n [workflow]=\"processWorkflowModel.data.workflow\" [action]=\"processWorkflowModel.data.action\"\r\n (onSaved)=\"handleProcessedWorkflowBase()\" (onCancel)=\"processWorkflowModel.showEditForm = false\">\r\n </process-workflow-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"choYKienModel.showEditForm\" #dialog [header]=\"choYKienModel.header | translate\"\r\n [popupSize]=\"choYKienModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"choYKienModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListChoYKien; context: {\r\n dialogModel: choYKienModel\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"choYKienModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <cho-y-kien-form #formBase [bussinessSetting]=\"choYKienModel.data.setting\"\r\n [rowItem]=\"choYKienModel.data.rowData\" (onSaved)=\"choYKienModel.showEditForm = false\"\r\n (onCancel)=\"choYKienModel.showEditForm = false\">\r\n </cho-y-kien-form> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"workflowHistoryModel.showEditForm\" #dialog [header]=\"workflowHistoryModel.header | translate\"\r\n [popupSize]=\"workflowHistoryModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"workflowHistoryModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowSetting; context: {\r\n $implicit: currentItem, dialogModel: workflowHistoryModel\r\n }\"></ng-container>\r\n <!-- <workflow-history-new #formBase [businessSetting]=\"workflowHistoryModel.data.setting\"\r\n [tableName]=\"workflowHistoryModel.data.tableName\" [item]=\"currentItem\"\r\n [workflowSetting]=\"workflowHistoryModel.data.workflowSetting\"\r\n (onCancel)=\"workflowHistoryModel.showEditForm = false\">\r\n </workflow-history-new> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"detailTaskModel.showEditForm\" #dialog [header]=\"detailTaskModel.header | translate\"\r\n [popupSize]=\"detailTaskModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"detailTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListFormCongViec; context: {\r\n dialogModel: detailTaskModel, isFormView: true\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"detailTaskModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [model]=\"detailTaskModel.data.taskFormModel\" [forceOnlyView]=\"true\"\r\n (onCancel)=\"detailTaskModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n\r\n<tn-dialog *ngIf=\"permissionSharingModel.showEditForm\" #dialog [header]=\"permissionSharingModel.header | translate\"\r\n [popupSize]=\"permissionSharingModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"permissionSharingModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListPermissionSharing; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionSharingModel, baseService: setting.baseService\r\n }\"></ng-container>\r\n <!-- <permission-sharing #formBase [item]=\"rowDataCurrent\" [baseService]=\"setting.baseService\"\r\n (onCancel)=\"permissionSharingModel.showEditForm = false\">\r\n </permission-sharing> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"permissionListModel.showEditForm\" #dialog [header]=\"permissionListModel.header | translate\"\r\n [popupSize]=\"permissionListModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"permissionListModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListWorkflowPermission; context: {\r\n $implicit: rowDataCurrent, dialogModel: permissionListModel, businessSetting: setting\r\n }\"></ng-container>\r\n <!-- <workflow-permission #formBase [item]=\"rowDataCurrent\" [businessSetting]=\"setting\"\r\n (onCancel)=\"permissionListModel.showEditForm = false\">\r\n </workflow-permission> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"startWorkflowModel.showEditForm\" #dialog [header]=\"startWorkflowModel.header | translate\"\r\n [popupSize]=\"startWorkflowModel.popupSize\" [scrollBarStyleClass]=\"'fit-content'\"\r\n (onHide)=\"startWorkflowModel.showEditForm = false\">\r\n <div style=\"height: 100%\">\r\n <ng-container *ngTemplateOutlet=\"crudListStartWorkflow; context: {\r\n dialogModel: startWorkflowModel, onSaved: handleStartWorkflowFromDialog\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"startWorkflowModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <start-workflow #formBase [workflows]=\"startWorkflowModel.data.workflows\"\r\n [defaultWorkflow]=\"startWorkflowModel.data.defaultWorkflow\"\r\n (onCancel)=\"startWorkflowModel.showEditForm = false\" (onSaved)=\"handleStartWorkflowFromDialog($event)\">\r\n </start-workflow> -->\r\n </div>\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"congViecModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"congViecModel.header | translate\" [popupSize]=\"congViecModel.popupSize\"\r\n (onHide)=\"congViecModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListFormCongViec; context: {\r\n dialogModel: congViecModel, getData: getData, isFormView: false\r\n }\"></ng-container>\r\n <ng-template #footer>\r\n <ng-container *ngTemplateOutlet=\"congViecModel.buttonTemplate\"></ng-container>\r\n </ng-template>\r\n <!-- <base-congviec-form #formBase [parentSetting]=\"congViecModel.data.congViecSetting\"\r\n [model]=\"congViecModel.data.model\" (onSaved)=\"congViecModel.showEditForm = false;getData()\"\r\n (onCancel)=\"congViecModel.showEditForm = false\">\r\n </base-congviec-form> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"shareLinkModel.showEditForm\" #dialog [styleClass]=\"'congviec-form tn-form-dialog'\"\r\n [header]=\"shareLinkModel.header | translate\" [popupSize]=\"shareLinkModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"shareLinkModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListShareLinkByPermission; context: {\r\n dialogModel: shareLinkModel, setting: setting\r\n }\"></ng-container>\r\n <!-- <share-link-by-permission #formBase [setting]=\"setting\" [lstItem]=\"shareLinkModel.data.lstItem\"\r\n (onCancel)=\"shareLinkModel.showEditForm = false\">\r\n </share-link-by-permission> -->\r\n</tn-dialog>\r\n<tn-dialog *ngIf=\"attachedTaskModel.showEditForm\" [header]=\"attachedTaskModel.header | translate\"\r\n [popupSize]=\"attachedTaskModel.popupSize\" [useDefaultScrollBar]=\"true\"\r\n (onHide)=\"attachedTaskModel.showEditForm = false\">\r\n <ng-container *ngTemplateOutlet=\"crudListCongViec; context: {\r\n baseService: setting.baseService, itemIdAttach: rowDataCurrent.id\r\n }\"></ng-container>\r\n <!-- <base-congviec [serviceCode]=\"setting.baseService.serviceCode\" [entity]=\"setting.baseService.entityName\"\r\n [itemIdAttach]=\"rowDataCurrent.id\"></base-congviec> -->\r\n</tn-dialog>\r\n<ng-template #tableGetGroupFieldFalse>\r\n <p-table #table [dataKey]=\"'id'\" [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\"\r\n [columns]=\"setting.cols\" [paginator]=\"false\" [value]=\"_dataSource\" (onSort)=\"onSort($event, table)\"\r\n [class]=\"_tableClass\" [responsive]=\"responsive\" [lazy]=\"lazy\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" (onRowReorder)=\"handleRowOrdered($event)\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\" let-index=\"rowIndex\" let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: handleSelectRow, eventChecked: handleCheckRowData}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('rowExpansion')\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('rowExpansion'); context: {$implicit: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n</ng-template>\r\n<ng-template #tableGetGroupFieldTrue>\r\n <p-table #tableGroup [scrollable]=\"pTableScrollable\" [scrollHeight]=\"pTableScrollHeight\" [columns]=\"setting.cols\"\r\n [paginator]=\"false\" [value]=\"_dataSource\" [metaKeySelection]=\"false\" (onSort)=\"onSort($event, tableGroup)\"\r\n [class]=\"_tableClass\" [customSort]=\"true\" [responsive]=\"responsive\" [lazy]=\"true\" [loading]=\"model.loading\"\r\n [(selection)]=\"model.selectedItems\" [expandedRowKeys]=\"model.expandedRowKeys\" [dataKey]=\"_groupField\">\r\n <ng-template *ngIf=\"hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('colgroup'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('colgroup')\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"baseColgroup; context: {$implicit: columns}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"getTemplate('header'), context: {$implicit: columns, crudList: this, rowHeaderFilter: rowHeaderFilter, contentTh: contentTh, containerSticky: containerSticky, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"!hasTemplate('header')\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"trHeader; context: {$implicit: columns, funcCheckAll: handleCheckAll_Group}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-expanded=\"expanded\"\r\n let-columns=\"columns\">\r\n <tr *ngIf=\"rowGroupMetadata[rowData[_groupField]] && rowGroupMetadata[rowData[_groupField]].index == rowIndex\"\r\n class=\"p-widget-header group-row\" style=\"border: 0px; border-bottom: 1px solid #eee\">\r\n <td *ngIf=\"!setting.hiddenCheckbox\" class=\"center chkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <p-checkbox [(ngModel)]=\"rowGroupChecked[rowData[_groupField]]\" binary=\"true\"\r\n (onChange)=\"handleCheckRowGroup(rowData)\">\r\n </p-checkbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!hasTemplate('rowGroup')\">\r\n <td [colSpan]=\"getColSpanGroup()\" [class]=\"_classRowGroup\">\r\n <div class=\"container-row-group\">\r\n <a href=\"javascript:;\" [pRowToggler]=\"rowData\" class=\"container-row-group-toggle\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n <i style=\"margin-right:5px\"\r\n [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n <div class=\"content-row-group\">\r\n <ng-container *ngIf=\"!hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"_contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('contentRowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('contentRowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('rowGroup')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('rowGroup')\"\r\n [ngTemplateOutletContext]=\"getContextRowGroupRoot(rowData, expanded)\">\r\n </ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"rowexpansion\" let-columns=\"columns\" let-rowData let-index=\"rowIndex\">\r\n <ng-container\r\n *ngTemplateOutlet=\"trBody; context: {$implicit: rowData, columns: columns, index: index, expanded: false, eventSelectRow: handleSelectRowGroup, eventChecked: handleCheckRowData_Group}\">\r\n </ng-container>\r\n <after-view-checked *ngIf=\"index == _dataSource.length - 1\" style=\"display: none;\" [renderKey]=\"_dataSource\"\r\n (loaded)=\"handleTableRendered()\">\r\n </after-view-checked>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('summary')\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"getTemplate('summary')\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"hasTemplate('footer')\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"getTemplate('footer'); context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n </p-table>\r\n <after-view-checked></after-view-checked>\r\n</ng-template>\r\n<ng-template #baseColgroup let-columns>\r\n <colgroup>\r\n <col *ngIf=\"!setting.hiddenCheckbox\" [style.width]=\"widthCheckbox\" />\r\n <col *ngIf=\"!setting.hiddenOrderColumn\" [style.width]=\"widthOrderColumn\" />\r\n <col *ngIf=\"hasTemplate('rowExpansion')\" style=\"width: 2.5rem\" />\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=\"enableReorderRow\" style=\"width: 30px\" />\r\n <col *ngIf=\"!setting.hiddenFunctionColumn\" [style.width]=\"widthFunctionColumn || _widthFunctionColumn\" />\r\n </colgroup>\r\n</ng-template>\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 #buttonExport>\r\n <button *ngIf=\"model.selectedItems.length > 0\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EXPORT_EXCEL]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EXPORT_EXCEL]\" type=\"button\" pButton pRipple\r\n label=\"Xu\u1EA5t c\u00E1c m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{model.selectedItems.length}})\" icon=\"fas fa-file-excel\"\r\n class=\"p-button-text p-button-success\" (click)=\"xuatCacMucDaChon()\"></button>\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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\">\r\n <button *ngIf=\"!hasTemplate('headerCheckbox')\" 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\" tooltipPosition=\"top\"\r\n [disabled]=\"model.loading\" (click)=\"reload()\"></button>\r\n <ng-container *ngIf=\"hasTemplate('headerCheckbox')\">\r\n <ng-container [ngTemplateOutletContext]=\"{crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('headerCheckbox')\"></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.hiddenOrderColumn\" class=\"stt nopad center\" [class.sticky]=\"setting.stickyColumn\"\r\n (dblclick)=\"reload()\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad row-expansion-toggle center\" style=\"width: 2.5rem\"\r\n [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 && col.visible && col.field!='function'\" [ngStyle]=\"col.extendData.headerStyle\"\r\n [pTooltip]=\"col.fullLabel\" tooltipStyleClass=\"unset-width\" [class]=\"col.extendData.headerClass\"\r\n [tnSortableColumn]=\"col.field\" [hostRef]=\"this\" [tnSortableColumnDisabled]=\"!col.sort\"\r\n [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\">\r\n <ng-container *ngTemplateOutlet=\"contentTh; context: {$implicit: col}\"></ng-container>\r\n <ng-container *ngIf=\"col.sort || col.sortClient\">\r\n <ng-container *ngTemplateOutlet=\"sortIcon; context: {field: col.field}\"></ng-container>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngTemplateOutlet=\"colFunctionHeader\"></ng-container>\r\n </tr>\r\n <ng-container *ngTemplateOutlet=\"rowHeaderFilter; context: {columns: columns, funcCheckAll: funcCheckAll}\">\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #rowHeaderFilter let-columns=\"columns\" let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"filter-row\" *ngIf=\"!setting.hiddenFilterRow\">\r\n <th *ngIf=\"!setting.hiddenCheckbox\" 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)=\"funcCheckAll()\">\r\n </p-triStateCheckbox>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"!setting.hiddenOrderColumn\" class=\"stt center v-top\" [class.sticky]=\"setting.stickyColumn\">\r\n <div *ngIf=\"!setting.hiddenSetting\" class=\"pick-color-row\" pTooltip=\"C\u1EA5u h\u00ECnh hi\u1EC3n th\u1ECB m\u00E0u\"\r\n tooltipPosition=\"top\" (click)=\"showSettingRowColor()\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"hasTemplate('rowExpansion')\" class=\"nopad center row-expansion-toggle\"\r\n [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=\"'intWithoutMask'\">\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=\"'currency'\">\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=\"enableReorderRow\" style=\"width: 30px\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\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 #colFunctionHeader>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn\">\r\n <th class=\"column-function\" [class.sticky]=\"setting.stickyColumn\">\r\n <div class=\"cell-header-function\">\r\n <span>{{'GRID.FUNCTION'| translate}}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTh let-col>\r\n <ng-container *ngIf=\"templateHeaderContent[col.field]\">\r\n <ng-container *ngTemplateOutlet=\"templateHeaderContent[col.field]\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!templateHeaderContent[col.field]\">\r\n {{col.label}}\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n</ng-template>\r\n<ng-template #trBody let-rowData let-columns=\"columns\" let-index=\"index\" let-expanded=\"expanded\"\r\n let-eventSelectRow=\"eventSelectRow\" let-eventChecked=\"eventChecked\">\r\n <tr *ngIf=\"!rowData.template\" [tnReorderableRow]=\"index\" [hostRef]=\"this\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"rowData.objStyleClass\" [class.ui-state-highlight]=\"rowData._checked\" [pTooltip]=\"rowData.tooltip\"\r\n tooltipPosition=\"top\" [tooltipStyleClass]=\"rowData.tooltipClass\" [escape]=\"escape\"\r\n (click)=\"eventSelectRow($event, rowData)\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox && !rowData.hidden[fieldCheckbox]\">\r\n <td class=\"chkbox link-or-action cell-checkbox\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldCheckbox]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldCheckbox]\">\r\n <ng-container *ngIf=\"!rowData.hiddenCheckBox\">\r\n <ng-container *ngIf=\"!hasTemplate('checkbox')\">\r\n <p-checkbox [(ngModel)]=\"rowData._checked\" binary=\"true\" (onChange)=\"eventChecked(rowData)\">\r\n </p-checkbox>\r\n </ng-container>\r\n <ng-container *ngIf=\"hasTemplate('checkbox')\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('checkbox')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && !rowData.hidden[fieldOrder]\" class=\"stt\" style=\"text-align: center;\"\r\n [class.sticky]=\"setting.stickyColumn\" [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldOrder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldOrder]\">\r\n <span class=\"row-card\" [ngStyle]=\"rowData.bookmarkStyle\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"hasTemplate('rowExpansion') && !rowData.hidden[fieldColExpand]\"\r\n class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColExpand]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColExpand]\">\r\n <ng-container *ngTemplateOutlet=\"iconToggleRowData; context: {rowData: rowData, expanded: expanded}\">\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container\r\n *ngTemplateOutlet=\"dynamicColBodys; context: {$implicit: columns, rowData: rowData, index: index, expanded: expanded}\">\r\n </ng-container>\r\n <td *ngIf=\"enableReorderRow && !rowData.hidden[fieldColReorder]\" class=\"no-padding center\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldColReorder]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldColReorder]\">\r\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\" pReorderableRowHandle></i>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <ng-container *ngIf=\"!setting.hiddenFunctionColumn && !rowData.hidden[fieldFunction]\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[fieldFunction]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[fieldFunction]\">\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=\"setting.showVersionButton\" type=\"button\" pButton pRipple icon=\"pi pi-calendar\"\r\n class=\"p-button-rounded p-button-text p-button-success link-or-action\"\r\n pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\" tooltipPosition=\"top\"\r\n (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.EDIT]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.EDIT]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableEdit(rowData)\" [pTooltip]=\"'FORM.EDIT' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" [appAuthorize]=\"serviceCode\"\r\n [permission]=\"authorizePaths[commonConst.DELETE]\"\r\n [enableAuthorize]=\"buttonApplyAuthorize[commonConst.DELETE]\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" [pTooltip]=\"'FORM.DELETE' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\" icon=\"pi pi-trash\"\r\n (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"showMenuButtons && menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonAfter')\"></ng-container>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngIf=\"rowData.template\">\r\n <ng-container *ngTemplateOutlet=\"rowData.template; context: {\r\n $implicit: rowData, columns: columns, index: index, expanded: expanded, eventSelectRow: eventSelectRow, eventChecked: eventChecked\r\n }\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #dynamicColBodys let-columns let-rowData=\"rowData\" let-index=\"index\" let-expanded=\"expanded\">\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, col: col, index: index, i: i, expanded: expanded}\">\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentTd let-rowData let-col=\"col\" let-index=\"index\" let-expanded=\"expanded\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && !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 <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\" tooltipPosition=\"top\"></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 let-rowIndex=\"rowIndex\" let-field=\"field\" let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container *ngTemplateOutlet=\"customTemplateCell; context: {\r\n $implicit: col.template,\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 {{rowData[field] | tnDate:col.dataType: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 {{rowData[field] | tnDate:col.dataType: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] | number}}\r\n </span>\r\n <span *ngSwitchCase=\"'intWithoutMask'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'currency'\">\r\n {{rowData[field] | currency:\"VND\"}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field] | number}}\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=\"'fileUpload'\">\r\n <ng-container *ngTemplateOutlet=\"crudListFileUploadColumn; context: {\r\n $implicit: rowData, parentContext: context, field: col.field, fileSetting: col.fileSetting\r\n }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'fileManager'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"crudListFileManager; context: {$implicit: rowData, field: col.field, fileSetting: col.fileSetting}\">\r\n </ng-container>\r\n </ng-container>\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 <!-- __sv: Short Value -->\r\n <span>\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 #iconToggleRowGroup let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <a href=\"javascript:;\" (click)=\"handleToggleRow(rowData, $event)\">\r\n <i style=\"margin-right:5px\" [ngClass]=\"expanded ? 'fas fa-fw fa-caret-down' : 'fas fa-fw fa-caret-right'\"></i>\r\n </a>\r\n</ng-template>\r\n<ng-template #iconToggleRowData let-rowData=\"rowData\" let-expanded=\"expanded\">\r\n <button type=\"button\" pButton pRipple class=\"link-or-action p-button-text p-button-rounded p-button-plain\"\r\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\r\n (click)=\"handleToggleRow(rowData, $event)\"></button>\r\n</ng-template>\r\n<ng-template #_contentRowGroup let-rowData=\"rowData\" let-groupCol=\"groupCol\" let-groupField=\"_groupField\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, col: groupCol, field: _groupField}\">\r\n </ng-container>\r\n <span *ngIf=\"setting.columnSetting.showGroupSize\">\r\n ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #trangThaiV5 let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <button *ngIf=\"!rowData.__workflowCode && !rowData.hiddenWorkflowAction && !rowData.hiddenStartWorkflow\" pButton\r\n class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\" style=\"border: 1px solid #7ca9cd;\"\r\n pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\r\n [disabled]=\"rowData.__startingWorkflow && !rowData.__notReadyForStart\"\r\n (click)=\"showFormStartWorkflow(rowData)\"></button>\r\n <ng-container *ngIf=\"rowData.__workflowCode\">\r\n <span class=\"content\">{{rowData.__textTrangThai}}</span>\r\n <button *ngIf=\"!rowData.hiddenWorkflowAction\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"H\u00E0nh \u0111\u1ED9ng\" tooltipPosition=\"top\"\r\n [disabled]=\"showingActionWorkflow\" (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>\r\n<ng-template #viewHistory let-rowData=\"rowData\">\r\n <button pButton icon=\"pi pi-calendar\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflow(setting, rowData)\"></button>\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 #sortIcon let-field=\"field\">\r\n <i class=\"p-sortable-column-icon pi\" style=\"font-size: 0.8em;\"\r\n [ngClass]=\"{'pi-sort-amount-up-alt': field == _sortField && _sortDir === 1, 'pi-sort-amount-down': field == _sortField && _sortDir === -1, 'pi-sort-alt': field != _sortField || _sortDir === 0}\"></i>\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 *ngIf=\"!col.minimizeFilter\"\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 <ng-container *ngIf=\"col.minimizeFilter\">\r\n <button *ngIf=\"!filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter-slash\"\r\n class=\"btn-filter-boolean\" (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n <button *ngIf=\"filterData[col.field]\" type=\"button\" pButton icon=\"pi pi-filter\"\r\n class=\"btn-filter-boolean p-button-primary\"\r\n (click)=\"showCheckBoxFilterMenu($event, col.field)\"></button>\r\n </ng-container>\r\n </div>\r\n</ng-template>", styles: [".container-table{display:flex;overflow:hidden;flex-direction:column}.container-table .container-table-inner{display:flex;position:relative;height:auto;max-height:100%;min-height:60px}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{inset:0;margin:auto;position:absolute;display:flex;flex-wrap:wrap;width:1.4em;height:1.4em;border:1px solid #d1d1d1;border-radius:2px;cursor:pointer}.pick-color-row>div{flex:0 0 50%;background:#84d140;border:1px solid #fff}.pick-color-row>div:nth-child(2){background:#fc6868}.pick-color-row>div:nth-child(3){background:#fbc02d}.pick-color-row>div:nth-child(4){background:#7dc5ff}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.group-icon{font-weight:400;color:#256aa2}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{position:absolute;left:0;top:0;width:5px;height:100%}.column-function{min-width:100px;padding:0}.custom-search-area{margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em;background-color:#f2f2f2;position:relative}.custom-search-area .collapse-expand{position:absolute;cursor:pointer;width:100%;height:1em;left:0;bottom:0;text-align:center;background:#e5e5e5}.custom-search-area .collapse-expand:hover{background:#ebebeb}.custom-search-area.collapsed{height:1em;overflow:hidden}.custom-search-area.collapsed .collapse-expand{bottom:-.5em}.main-container-search-inner{margin-bottom:-.5em}.main-title>h1{font-size:1.2em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{display:flex;align-items:center;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;width:2rem;position:absolute;top:50%;left:50%;transform:translate(-50%,calc(-50% - 1px))}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;white-space:nowrap;font-weight:700}.col-share-permission>div:not(:last-child){margin-bottom:5px}.advance-search-container{display:flex;justify-content:flex-end}.btn-filter-boolean{width:26px;height:26px}.btn-filter-boolean:not(.p-button-primary){background:#f5f6f8;color:#6c757d;border-color:#ced4da}.btn-filter-boolean:not(.p-button-primary):hover{background:#f5f6f8;color:#6c757d;border-color:#ced4da}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .ps__rail-x,::ng-deep crud-list .ps__rail-y{z-index:5}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter{z-index:999}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th.cell-fixed-filter .fixed-filter{z-index:10;position:fixed;min-width:200px}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{position:absolute;width:0;height:0}::ng-deep crud-list .cell-header-filter{position:relative}::ng-deep crud-list .cell-header-filter .tn-dropdown{height:32px}::ng-deep crud-list .cell-header-filter tn-mask .p-inputtext{width:100%}::ng-deep crud-list .cell-header-filter .filter-box{display:flex;min-width:0px;background-color:#fff;border-radius:3px}::ng-deep crud-list .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 crud-list .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 crud-list .cell-header-filter .filter-box>span.action-clear{border-radius:0 3px 3px 0}::ng-deep crud-list .cell-header-filter .filter-box>span.action-clear.dirty{color:#008eff}::ng-deep crud-list .cell-header-filter .filter-box input{padding-left:5px;padding-right:5px;border:none;box-shadow:none!important}::ng-deep crud-list .cell-header-filter .filter-box:not(.no-transition){transition:min-width .1s}::ng-deep crud-list .cell-header-filter .filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter .p-multiselect-label.p-placeholder{padding-left:.5rem;padding-right:.5rem}::ng-deep crud-list .cell-header-filter:focus-within,::ng-deep crud-list .cell-header-filter.focus-within{z-index:10!important}::ng-deep crud-list .cell-header-filter:focus-within .filter-boolean-box .p-button,::ng-deep crud-list .cell-header-filter.focus-within .filter-boolean-box .p-button{z-index:10}::ng-deep crud-list .cell-header-filter:focus-within .filter-box>div,::ng-deep crud-list .cell-header-filter.focus-within .filter-box>div{box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3;z-index:0}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>div,::ng-deep crud-list .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 crud-list .cell-header-filter:focus-within .short-filter-box>span.action-clear,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box>span.action-clear{display:flex}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter{min-width:140px}::ng-deep crud-list .cell-header-filter:focus-within .short-filter-box.boolean-filter>div,::ng-deep crud-list .cell-header-filter.focus-within .short-filter-box.boolean-filter>div{flex:0 0 109px;width:109px}::ng-deep crud-list .cell-header-filter:focus-within:nth-last-child(2) .short-filter-box,::ng-deep crud-list .cell-header-filter.focus-within:nth-last-child(2) .short-filter-box{left:50%;transform:translate(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{position:absolute;z-index:5;background-color:#eee}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{top:0;bottom:0;width:1px}::ng-deep crud-list .table-border-line.--top,::ng-deep crud-list .table-border-line.--bottom{left:0;right:0;height:1px}::ng-deep crud-list .table-border-line.--left{left:0}::ng-deep crud-list .table-border-line.--right{right:0}::ng-deep crud-list .table-border-line.--top{top:0}::ng-deep crud-list .table-border-line.--bottom{bottom:0}::ng-deep crud-list .filter-boolean-box{text-align:center}::ng-deep crud-list .filter-boolean-box .p-selectbutton{white-space:nowrap}::ng-deep crud-list .custom-search-area crud-form{width:100%}::ng-deep crud-list>p-contextmenu{display:none}@media (max-width: 640px){::ng-deep crud-list .--table-responsive .p-datatable-wrapper{padding:1px}}\n"] }]
|
|
83
83
|
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9jcnVkLWxpc3QvY3J1ZC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9jcnVkLWxpc3QvY3J1ZC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhOUUsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGlCQUFpQjtJQUNwRCxZQUNXLFNBQW1CO1FBRTFCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUZWLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFHMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELHlCQUF5QjtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUU7WUFDM0QsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDMUcsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO29CQUMvQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDeEQsT0FBTztxQkFDVjtvQkFDRCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwRDtnQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTt3QkFBRSxPQUFPO29CQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO29CQUN0RixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDcEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO29CQUN2RSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BFLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hELE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hELFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7b0JBQ3pDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUM7b0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDVjtpQkFDSTtnQkFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQzthQUNwQztRQUNMLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7OzhHQS9DUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixvQ0FGZixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsaURDYnRDLDB2bUVBNitCYzsyRkQ5OUJELGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFFSSxXQUFXLGFBR1YsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIERlY2ltYWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExpc3RDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2xpc3QtY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBJTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvaS1saXN0LWNvbXBvbmVudCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuZGVjbGFyZSBsZXQgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdjcnVkLWxpc3QnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcnVkLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0RlY2ltYWxQaXBlLCBEYXRlUGlwZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRMaXN0Q29tcG9uZW50IGV4dGVuZHMgTGlzdENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBJTGlzdENvbXBvbmVudCwgT25Jbml0IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLmlzVHJlZVRhYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5sb2FkaW5nIHx8IHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmNvbnRhaW5lclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLW92ZXJsYXknKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgncC10YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTY3JvbGxCYXJDb250ZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlU2Nyb2xsQmFyQ29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BzLWNvbnRlbnQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY3JvbGxCYXJDb250ZW50LnBhcmVudE5vZGUucHJlcGVuZChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaCA9IGVsZW1lbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCdwLXRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkID4gdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoU2l6ZSA9IGZpcnN0VGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZ0ljb24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLWljb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShsb2FkaW5nSWNvbikuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IChmaXJzdFRoU2l6ZS5oZWlnaHQgLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSAoZmlyc3RUaFNpemUud2lkdGggLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJY29uLnN0eWxlLm1hcmdpblRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luTGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSwgMjApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLWNhcmQgY2FyZCBjYXJkLXctdGl0bGUgZmxleC1jb250YWluZXItZml0LWNoaWxkXCIgW2F0dHIuaGVpZ2h0LXR5cGVdPVwic2V0dGluZy5oZWlnaHRUeXBlXCJcclxuICAgIFtuZ1N0eWxlXT1cIl9zdHlsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWhlbHBlci1jbGVhcmZpeCBjcnVkLWxpc3QtaGVhZGVyLWFyZWFcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3NlYXJjaEN1c3RvbScpXCIgY2xhc3M9XCJncmlkIHVpLWZsdWlkIGN1c3RvbS1jb2wgY3VzdG9tLXNlYXJjaC1hcmVhXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNvbGxhcHNlZF09XCIhZXhwYW5kZWRTZWFyY2hcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYWluLWNvbnRhaW5lci1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIG1haW4tY29udGFpbmVyLXNlYXJjaC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgnc2VhcmNoQ3VzdG9tJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHRoaXN9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UtZXhwYW5kXCIgKGNsaWNrKT1cImV4cGFuZGVkU2VhcmNoID0gIWV4cGFuZGVkU2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpXCIgW2NsYXNzLnBpLWNhcmV0LXVwXT1cImV4cGFuZGVkU2VhcmNoXCIgW2NsYXNzLnBpLWNhcmV0LWRvd25dPVwiIWV4cGFuZGVkU2VhcmNoXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuSGVhZGVyXCIgY2xhc3M9XCJncmlkIHVpLWZsdWlkIGN1c3RvbS1jb2wgcGFnZS10aXRsZS1hcmVhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5QYWdlVGl0bGVcIiBjbGFzcz1cIm1haW4tdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cIiFoYXNUZW1wbGF0ZSgnY3VzdG9tVGl0bGUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7c2V0dGluZy50aXRsZSAhPSBudWxsID8gc2V0dGluZy50aXRsZSA6ICdEYW5oIHPDoWNoICcgKyBzZXR0aW5nLm9iamVjdE5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC9oMT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2N1c3RvbVRpdGxlJylcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY3VzdG9tVGl0bGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZExpc3Q6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkFkZDogYnV0dG9uQWRkLCBidXR0b25FeHBvcnQ6IGJ1dHRvbkV4cG9ydCwgYnV0dG9uRGVsZXRlOiBidXR0b25EZWxldGVcclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuUGFnZVNldHRpbmdcIiBjbGFzcz1cInBhZ2luYXRvci10YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjdXN0b21QYWdlU2V0dGluZycpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY3VzdG9tUGFnZVNldHRpbmcnKVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2N1c3RvbVBhZ2VTZXR0aW5nJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGFnaW5nLW5leHQtYmFjay1vbmx5IFttb2RlbF09XCJtb2RlbFwiIFtzZXR0aW5nXT1cInNldHRpbmdcIiAob25DaGFuZ2VkKT1cImdldERhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZUxpbWl0UGFnZSk9XCJzYXZlUGFnZVNpemUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcGFnaW5nLW5leHQtYmFjay1vbmx5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3RvcEdyaWQnKVwiIGNsYXNzPVwiZXh0ZW5kLWNvbnRlbnQtdG9wLWdyaWRcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VsZWN0ZWRJdGVtczogbW9kZWwuc2VsZWN0ZWRJdGVtcywgY3J1ZExpc3Q6IHRoaXN9XCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ3RvcEdyaWQnKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZml0LWNvbnRlbnQgY3J1ZC1saXN0LWJvZHktYXJlYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcnVkLWxpc3QtYm9keS1hcmVhLWlubmVyXCIgc3R5bGU9XCJvdmVyZmxvdzogdW5zZXQ7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbnRhaW5lci1maXQtY2hpbGRcIiBzdHlsZT1cIm92ZXJmbG93OiB1bnNldDtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5Ub29sYmFyXCIgY2xhc3M9XCJncmlkIGNydWRMaXN0VG9vbGJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5CdXR0b25zICYmIGhhc1RlbXBsYXRlKCd0b29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC03IGxnOmNvbC04J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBidXR0b24tZ3JvdXAgZnVuY3Rpb24tdG9wYmFyIGN1c3RvbS10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCd0b29sYmFyJylcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiBtb2RlbC5zZWxlY3RlZEl0ZW1zLCBjcnVkTGlzdDogdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQWRkOiBidXR0b25BZGQsIGJ1dHRvbkV4cG9ydDogYnV0dG9uRXhwb3J0LCBidXR0b25EZWxldGU6IGJ1dHRvbkRlbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkJ1dHRvbnMgJiYgIWhhc1RlbXBsYXRlKCd0b29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC03IGxnOmNvbC04J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBidXR0b24tZ3JvdXAgZnVuY3Rpb24tdG9wYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdidXR0b25CZWZvcmVUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGxhYmVsPVwixJDDoW5oIFNUVFwiIGNsYXNzPVwicC1idXR0b24tdGV4dFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhbmhTb1RodVR1R3JvdXBMYXN0ZXN0KClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGlkZGVuQWRkXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnV0dG9uQWRkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2V0dGluZy5zaG93RXhwb3J0U2VsZWN0ZWRJdGVtc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ1dHRvbkV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhpZGRlbkRlbGV0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ1dHRvbkRlbGV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNldHRpbmcuZGlzYWJsZVNoYXJlICYmIG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDaGlhIHPhursgbGnDqm4ga+G6v3RcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidDaGlhIHPhursgbGnDqm4ga+G6v3QnIHwgdHJhbnNsYXRlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mbyBsaW5rLW9yLWFjdGlvblwiIGljb249XCJwaSBwaS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlU2hhcmVMaW5rTXVsdGlwbGUoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQWZ0ZXJUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoXCIgY2xhc3M9XCJjb2wtMTIgYWR2YW5jZS1zZWFyY2gtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5CdXR0b25zID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC01IGxnOmNvbC00J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0QWR2YW5jZVNlYXJjaCddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRTZXR0aW5nOiBzZXR0aW5nLCBzZWFyY2hJbmZvOiBzZWFyY2hJbmZvLCBsb2FkaW5nOiBtb2RlbC5sb2FkaW5nLCBvblNlYXJjaDogaGFuZGxlU2VhcmNoQWR2cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdDogaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxhZHZhbmNlLXNlYXJjaCAjYWR2YW5jZVNlYXJjaCBbcGFyZW50U2V0dGluZ109XCJzZXR0aW5nXCIgW3NlYXJjaEluZm9dPVwic2VhcmNoSW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJtb2RlbC5sb2FkaW5nXCIgKG9uU2VhcmNoKT1cImhhbmRsZVNlYXJjaEFkdnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Jbml0KT1cImhhbmRsZUluaXRBZHZhbmNlU2VhcmNoKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hZHZhbmNlLXNlYXJjaD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNUZW1wbGF0ZSgndG9wR3JpZCcpXCIgY2xhc3M9XCJleHRlbmQtY29udGVudC10b3AtZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWxlY3RlZEl0ZW1zOiBtb2RlbC5zZWxlY3RlZEl0ZW1zLCBjcnVkTGlzdDogdGhpc31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgndG9wR3JpZCcpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItdGFibGUgZml0LWNvbnRlbnRcIiBbY2xhc3MuLS10YWJsZS1yZXNwb25zaXZlXT1cInJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLXRhYmxlLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2dyb3VwRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bi1jdXN0b20tc2Nyb2xsYmFyICpuZ0lmPVwic2hvd1Njcm9sbEJhclwiICNzY3JvbGxiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Njcm9sbEhvcml6b250YWxdPVwic2hvd1Njcm9sbEhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVHZXRHcm91cEZpZWxkRmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2FmdGVyQ3J1ZExpc3QnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdhZnRlckNydWRMaXN0JylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdG4tY3VzdG9tLXNjcm9sbGJhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd1Njcm9sbEJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUdldEdyb3VwRmllbGRGYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2dyb3VwRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bi1jdXN0b20tc2Nyb2xsYmFyICpuZ0lmPVwic2hvd1Njcm9sbEJhclwiICNzY3JvbGxiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Njcm9sbEhvcml6b250YWxdPVwic2hvd1Njcm9sbEhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVHZXRHcm91cEZpZWxkVHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNUZW1wbGF0ZSgnYWZ0ZXJDcnVkTGlzdCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2FmdGVyQ3J1ZExpc3QnKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90bi1jdXN0b20tc2Nyb2xsYmFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93U2Nyb2xsQmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlR2V0R3JvdXBGaWVsZFRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib3JkZXItbGluZSAtLXRvcFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9yZGVyLWxpbmUgLS1yaWdodFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9yZGVyLWxpbmUgLS1ib3R0b21cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvcmRlci1saW5lIC0tbGVmdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48YWZ0ZXItdmlldy1jaGVja2VkIChsb2FkZWQpPVwiaGFuZGxlUmVhZHkoKVwiPjwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiX3Nob3dTZXR0aW5ncyAmJiAhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0U2V0dGluZyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBlbnRpdHlNZXRhZGF0YVNlcnZpY2UsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIHBhcmVudFNldHRpbmc6IHNldHRpbmcsXHJcbiAgICAgICAgcGFyZW50TW9kZWw6IG1vZGVsLCBvblNhdmVkOiBvblNhdmVTZXR0aW5ncywgb25DYW5jZWw6IGhhbmRsZUNhbmNlbFNldHRpbmdcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPHNldHRpbmdzIFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIlxyXG4gICAgICAgIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIChvblNhdmUpPVwib25TYXZlU2V0dGluZ3MoJGV2ZW50KVwiIChvbkNhbmNlbCk9XCJfc2hvd1NldHRpbmdzID0gZmFsc2VcIj5cclxuICAgIDwvc2V0dGluZ3M+IC0tPlxyXG48L25nLWNvbnRhaW5lcj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9zaG93U2V0dGluZ3NSb3dDb2xvciAmJiAhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0U2V0dGluZ1JvdyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBlbnRpdHlNZXRhZGF0YVNlcnZpY2UsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIHBhcmVudFNldHRpbmc6IHNldHRpbmcsXHJcbiAgICAgICAgcGFyZW50TW9kZWw6IG1vZGVsLCBvblNhdmVkOiBvblNhdmVDb2xvclNldHRpbmdzLCBvbkNhbmNlbDogaGFuZGxlQ2FuY2VsU2V0dGluZ1Jvd1xyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSA8c2V0dGluZ3Mtcm93IFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIlxyXG4gICAgICAgIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIChvblNhdmUpPVwib25TYXZlQ29sb3JTZXR0aW5ncygkZXZlbnQpXCIgKG9uQ2FuY2VsKT1cIl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlXCI+XHJcbiAgICA8L3NldHRpbmdzLXJvdz4gLS0+XHJcbjwvbmctY29udGFpbmVyPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwid29ya2Zsb3dTZXR0aW5nTW9kZWwuc2hvd0VkaXRGb3JtXCIgW2hlYWRlcl09XCInQ+G6pXUgaMOsbmggcXV5IHRyw6xuaCBuZ2hp4buHcCB24bulJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICBbcG9wdXBTaXplXT1cIndvcmtmbG93U2V0dGluZ01vZGVsLnBvcHVwU2l6ZVwiIChvbkhpZGUpPVwid29ya2Zsb3dTZXR0aW5nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZVsnY3J1ZExpc3RXb3JrZmxvd1NldHRpbmcnXTsgY29udGV4dDoge1xyXG4gICAgICAgIGRpYWxvZ01vZGVsOiB3b3JrZmxvd1NldHRpbmdNb2RlbCwgcGFyZW50U2V0dGluZzogc2V0dGluZywgb25TYXZlZDogb25TYXZlV29ya2Zsb3dTZXR0aW5nc1xyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIndvcmtmbG93U2V0dGluZ01vZGVsLmJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPCEtLSA8d29ya2Zsb3ctc2V0dGluZy1uZXcgI2Zvcm1CYXNlIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIiAob25TYXZlZCk9XCJvblNhdmVXb3JrZmxvd1NldHRpbmdzKCRldmVudClcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJ3b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPjwvd29ya2Zsb3ctc2V0dGluZy1uZXc+IC0tPlxyXG48L3RuLWRpYWxvZz5cclxuPGVudGl0eS1wZXJtaXNzaW9uICpuZ0lmPVwiX3Nob3dTZXR0aW5nc1Blcm1pc3Npb24gJiYgIXNldHRpbmcuaGlkZGVuU2V0dGluZ1Blcm1pc3Npb25cIiBbcGFyZW50U2V0dGluZ109XCJzZXR0aW5nXCJcclxuICAgIFtwYXJlbnRDb250ZXh0XT1cImNvbnRleHRcIiBbcGFyZW50TW9kZWxdPVwibW9kZWxcIiBbc2VhcmNoSW5mb109XCJzZWFyY2hJbmZvXCJcclxuICAgIChvbkNhbmNlbCk9XCJfc2hvd1NldHRpbmdzUGVybWlzc2lvbiA9IGZhbHNlXCI+XHJcbjwvZW50aXR5LXBlcm1pc3Npb24+XHJcbjxwLWNvbnRleHRNZW51ICNjb250ZXh0TWVudSBbYXBwZW5kVG9dPVwiJ2JvZHknXCIgW3N0eWxlQ2xhc3NdPVwiJ2FsbG93LXNlbGVjdGVkJ1wiIFttb2RlbF09XCJidXR0b25Db250ZXh0c1wiPlxyXG48L3AtY29udGV4dE1lbnU+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwicHJvY2Vzc1dvcmtmbG93TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicHJvY2Vzc1dvcmtmbG93TW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cInByb2Nlc3NXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBwYWRkaW5nOiAxcmVtXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdFByb2Nlc3NXb3JrZmxvdyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogY3VycmVudEl0ZW0sIGRpYWxvZ01vZGVsOiBwcm9jZXNzV29ya2Zsb3dNb2RlbCwgb25TYXZlZDogaGFuZGxlUHJvY2Vzc2VkV29ya2Zsb3dCYXNlXHJcbiAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvY2Vzc1dvcmtmbG93TW9kZWwuYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwhLS0gPHByb2Nlc3Mtd29ya2Zsb3ctZm9ybSAjZm9ybUJhc2UgW2J1c2luZXNzU2V0dGluZ109XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLnNldHRpbmdcIiBbaXRlbV09XCJjdXJyZW50SXRlbVwiXHJcbiAgICAgICAgICAgIFt3b3JrZmxvd109XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLndvcmtmbG93XCIgW2FjdGlvbl09XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLmFjdGlvblwiXHJcbiAgICAgICAgICAgIChvblNhdmVkKT1cImhhbmRsZVByb2Nlc3NlZFdvcmtmbG93QmFzZSgpXCIgKG9uQ2FuY2VsKT1cInByb2Nlc3NXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC9wcm9jZXNzLXdvcmtmbG93LWZvcm0+IC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiY2hvWUtpZW5Nb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwiY2hvWUtpZW5Nb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJjaG9ZS2llbk1vZGVsLnBvcHVwU2l6ZVwiIFtzY3JvbGxCYXJTdHlsZUNsYXNzXT1cIidmaXQtY29udGVudCdcIlxyXG4gICAgKG9uSGlkZSk9XCJjaG9ZS2llbk1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdENob1lLaWVuJ107IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgZGlhbG9nTW9kZWw6IGNob1lLaWVuTW9kZWxcclxuICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaG9ZS2llbk1vZGVsLmJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8IS0tIDxjaG8teS1raWVuLWZvcm0gI2Zvcm1CYXNlIFtidXNzaW5lc3NTZXR0aW5nXT1cImNob1lLaWVuTW9kZWwuZGF0YS5zZXR0aW5nXCJcclxuICAgICAgICAgICAgW3Jvd0l0ZW1dPVwiY2hvWUtpZW5Nb2RlbC5kYXRhLnJvd0RhdGFcIiAob25TYXZlZCk9XCJjaG9ZS2llbk1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cImNob1lLaWVuTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgICAgICA8L2Noby15LWtpZW4tZm9ybT4gLS0+XHJcbiAgICA8L2Rpdj5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJ3b3JrZmxvd0hpc3RvcnlNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwid29ya2Zsb3dIaXN0b3J5TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwid29ya2Zsb3dIaXN0b3J5TW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdFdvcmtmbG93U2V0dGluZyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogY3VycmVudEl0ZW0sIGRpYWxvZ01vZGVsOiB3b3JrZmxvd0hpc3RvcnlNb2RlbFxyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDx3b3JrZmxvdy1oaXN0b3J5LW5ldyAjZm9ybUJhc2UgW2J1c2luZXNzU2V0dGluZ109XCJ3b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLnNldHRpbmdcIlxyXG4gICAgICAgICAgICBbdGFibGVOYW1lXT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLmRhdGEudGFibGVOYW1lXCIgW2l0ZW1dPVwiY3VycmVudEl0ZW1cIlxyXG4gICAgICAgICAgICBbd29ya2Zsb3dTZXR0aW5nXT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLmRhdGEud29ya2Zsb3dTZXR0aW5nXCJcclxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC93b3JrZmxvdy1oaXN0b3J5LW5ldz4gLS0+XHJcbiAgICA8L2Rpdj5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJkZXRhaWxUYXNrTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cImRldGFpbFRhc2tNb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJkZXRhaWxUYXNrTW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cImRldGFpbFRhc2tNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdEZvcm1Db25nVmllYyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgZGlhbG9nTW9kZWw6IGRldGFpbFRhc2tNb2RlbCwgaXNGb3JtVmlldzogdHJ1ZVxyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRldGFpbFRhc2tNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS0gPGJhc2UtY29uZ3ZpZWMtZm9ybSAjZm9ybUJhc2UgW21vZGVsXT1cImRldGFpbFRhc2tNb2RlbC5kYXRhLnRhc2tGb3JtTW9kZWxcIiBbZm9yY2VPbmx5Vmlld109XCJ0cnVlXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGV0YWlsVGFza01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L2Jhc2UtY29uZ3ZpZWMtZm9ybT4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInBlcm1pc3Npb25TaGFyaW5nTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInBlcm1pc3Npb25TaGFyaW5nTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCJcclxuICAgIChvbkhpZGUpPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZVsnY3J1ZExpc3RQZXJtaXNzaW9uU2hhcmluZyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogcm93RGF0YUN1cnJlbnQsIGRpYWxvZ01vZGVsOiBwZXJtaXNzaW9uU2hhcmluZ01vZGVsLCBiYXNlU2VydmljZTogc2V0dGluZy5iYXNlU2VydmljZVxyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDxwZXJtaXNzaW9uLXNoYXJpbmcgI2Zvcm1CYXNlIFtpdGVtXT1cInJvd0RhdGFDdXJyZW50XCIgW2Jhc2VTZXJ2aWNlXT1cInNldHRpbmcuYmFzZVNlcnZpY2VcIlxyXG4gICAgICAgICAgICAob25DYW5jZWwpPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgICAgIDwvcGVybWlzc2lvbi1zaGFyaW5nPiAtLT5cclxuICAgIDwvZGl2PlxyXG48L3RuLWRpYWxvZz5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInBlcm1pc3Npb25MaXN0TW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInBlcm1pc3Npb25MaXN0TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicGVybWlzc2lvbkxpc3RNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCIgW3VzZURlZmF1bHRTY3JvbGxCYXJdPVwidHJ1ZVwiXHJcbiAgICAob25IaWRlKT1cInBlcm1pc3Npb25MaXN0TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0V29ya2Zsb3dQZXJtaXNzaW9uJ107IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiByb3dEYXRhQ3VycmVudCwgZGlhbG9nTW9kZWw6IHBlcm1pc3Npb25MaXN0TW9kZWwsIGJ1c2luZXNzU2V0dGluZzogc2V0dGluZ1xyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDx3b3JrZmxvdy1wZXJtaXNzaW9uICNmb3JtQmFzZSBbaXRlbV09XCJyb3dEYXRhQ3VycmVudFwiIFtidXNpbmVzc1NldHRpbmddPVwic2V0dGluZ1wiXHJcbiAgICAgICAgICAgIChvbkNhbmNlbCk9XCJwZXJtaXNzaW9uTGlzdE1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC93b3JrZmxvdy1wZXJtaXNzaW9uPiAtLT5cclxuICAgIDwvZGl2PlxyXG48L3RuLWRpYWxvZz5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInN0YXJ0V29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwic3RhcnRXb3JrZmxvd01vZGVsLmhlYWRlciB8IHRyYW5zbGF0ZVwiXHJcbiAgICBbcG9wdXBTaXplXT1cInN0YXJ0V29ya2Zsb3dNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCJcclxuICAgIChvbkhpZGUpPVwic3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlWydjcnVkTGlzdFN0YXJ0V29ya2Zsb3cnXTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICBkaWFsb2dNb2RlbDogc3RhcnRXb3JrZmxvd01vZGVsLCBvblNhdmVkOiBoYW5kbGVTdGFydFdvcmtmbG93RnJvbURpYWxvZ1xyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Zvb3Rlcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXJ0V29ya2Zsb3dNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPCEtLSA8c3RhcnQtd29ya2Zsb3cgI2Zvcm1CYXNlIFt3b3JrZmxvd3NdPVwic3RhcnRXb3JrZmxvd01vZGVsLmRhdGEud29ya2Zsb3dzXCJcclxuICAgICAgICAgICAgW2RlZmF1bHRXb3JrZmxvd109XCJzdGFydFdvcmtmbG93TW9kZWwuZGF0YS5kZWZhdWx0V29ya2Zsb3dcIlxyXG4gICAgICAgICAgICAob25DYW5jZWwpPVwic3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCIgKG9uU2F2ZWQpPVwiaGFuZGxlU3RhcnRXb3JrZmxvd0Zyb21EaWFsb2coJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvc3RhcnQtd29ya2Zsb3c+IC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiY29uZ1ZpZWNNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtzdHlsZUNsYXNzXT1cIidjb25ndmllYy1mb3JtIHRuLWZvcm0tZGlhbG9nJ1wiXHJcbiAgICBbaGVhZGVyXT1cImNvbmdWaWVjTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCIgW3BvcHVwU2l6ZV09XCJjb25nVmllY01vZGVsLnBvcHVwU2l6ZVwiXHJcbiAgICAob25IaWRlKT1cImNvbmdWaWVjTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZVsnY3J1ZExpc3RGb3JtQ29uZ1ZpZWMnXTsgY29udGV4dDoge1xyXG4gICAgICAgIGRpYWxvZ01vZGVsOiBjb25nVmllY01vZGVsLCBnZXREYXRhOiBnZXREYXRhLCBpc0Zvcm1WaWV3OiBmYWxzZVxyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbmdWaWVjTW9kZWwuYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8IS0tIDxiYXNlLWNvbmd2aWVjLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRTZXR0aW5nXT1cImNvbmdWaWVjTW9kZWwuZGF0YS5jb25nVmllY1NldHRpbmdcIlxyXG4gICAgICAgIFttb2RlbF09XCJjb25nVmllY01vZGVsLmRhdGEubW9kZWxcIiAob25TYXZlZCk9XCJjb25nVmllY01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlO2dldERhdGEoKVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImNvbmdWaWVjTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvYmFzZS1jb25ndmllYy1mb3JtPiAtLT5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJzaGFyZUxpbmtNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtzdHlsZUNsYXNzXT1cIidjb25ndmllYy1mb3JtIHRuLWZvcm0tZGlhbG9nJ1wiXHJcbiAgICBbaGVhZGVyXT1cInNoYXJlTGlua01vZGVsLmhlYWRlciB8IHRyYW5zbGF0ZVwiIFtwb3B1cFNpemVdPVwic2hhcmVMaW5rTW9kZWwucG9wdXBTaXplXCIgW3VzZURlZmF1bHRTY3JvbGxCYXJdPVwidHJ1ZVwiXHJcbiAgICAob25IaWRlKT1cInNoYXJlTGlua01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0U2hhcmVMaW5rQnlQZXJtaXNzaW9uJ107IGNvbnRleHQ6IHtcclxuICAgICAgICBkaWFsb2dNb2RlbDogc2hhcmVMaW5rTW9kZWwsIHNldHRpbmc6IHNldHRpbmdcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPHNoYXJlLWxpbmstYnktcGVybWlzc2lvbiAjZm9ybUJhc2UgW3NldHRpbmddPVwic2V0dGluZ1wiIFtsc3RJdGVtXT1cInNoYXJlTGlua01vZGVsLmRhdGEubHN0SXRlbVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cInNoYXJlTGlua01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3NoYXJlLWxpbmstYnktcGVybWlzc2lvbj4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiYXR0YWNoZWRUYXNrTW9kZWwuc2hvd0VkaXRGb3JtXCIgW2hlYWRlcl09XCJhdHRhY2hlZFRhc2tNb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJhdHRhY2hlZFRhc2tNb2RlbC5wb3B1cFNpemVcIiBbdXNlRGVmYXVsdFNjcm9sbEJhcl09XCJ0cnVlXCJcclxuICAgIChvbkhpZGUpPVwiYXR0YWNoZWRUYXNrTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZVsnY3J1ZExpc3RDb25nVmllYyddOyBjb250ZXh0OiB7XHJcbiAgICAgICAgYmFzZVNlcnZpY2U6IHNldHRpbmcuYmFzZVNlcnZpY2UsIGl0ZW1JZEF0dGFjaDogcm93RGF0YUN1cnJlbnQuaWRcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPGJhc2UtY29uZ3ZpZWMgW3NlcnZpY2VDb2RlXT1cInNldHRpbmcuYmFzZVNlcnZpY2Uuc2VydmljZUNvZGVcIiBbZW50aXR5XT1cInNldHRpbmcuYmFzZVNlcnZpY2UuZW50aXR5TmFtZVwiXHJcbiAgICAgICAgW2l0ZW1JZEF0dGFjaF09XCJyb3dEYXRhQ3VycmVudC5pZFwiPjwvYmFzZS1jb25ndmllYz4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48bmctdGVtcGxhdGUgI3RhYmxlR2V0R3JvdXBGaWVsZEZhbHNlPlxyXG4gICAgPHAtdGFibGUgI3RhYmxlIFtkYXRhS2V5XT1cIidpZCdcIiBbc2Nyb2xsYWJsZV09XCJwVGFibGVTY3JvbGxhYmxlXCIgW3Njcm9sbEhlaWdodF09XCJwVGFibGVTY3JvbGxIZWlnaHRcIlxyXG4gICAgICAgIFtjb2x1bW5zXT1cInNldHRpbmcuY29sc1wiIFtwYWdpbmF0b3JdPVwiZmFsc2VcIiBbdmFsdWVdPVwiX2RhdGFTb3VyY2VcIiAob25Tb3J0KT1cIm9uU29ydCgkZXZlbnQsIHRhYmxlKVwiXHJcbiAgICAgICAgW2NsYXNzXT1cIl90YWJsZUNsYXNzXCIgW3Jlc3BvbnNpdmVdPVwicmVzcG9uc2l2ZVwiIFtsYXp5XT1cImxhenlcIiBbbG9hZGluZ109XCJtb2RlbC5sb2FkaW5nXCJcclxuICAgICAgICBbKHNlbGVjdGlvbildPVwibW9kZWwuc2VsZWN0ZWRJdGVtc1wiIChvblJvd1Jlb3JkZXIpPVwiaGFuZGxlUm93T3JkZXJlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2NvbGdyb3VwJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFzZUNvbGdyb3VwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdoZWFkZXInKSwgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1ucywgY3J1ZExpc3Q6IHRoaXMsIHJvd0hlYWRlckZpbHRlcjogcm93SGVhZGVyRmlsdGVyLCBjb250ZW50VGg6IGNvbnRlbnRUaCwgY29udGFpbmVyU3RpY2t5OiBjb250YWluZXJTdGlja3ksIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGx9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJIZWFkZXI7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnMsIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGx9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJCb2R5OyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCBjb2x1bW5zOiBjb2x1bW5zLCBpbmRleDogaW5kZXgsIGV4cGFuZGVkOiBleHBhbmRlZCwgZXZlbnRTZWxlY3RSb3c6IGhhbmRsZVNlbGVjdFJvdywgZXZlbnRDaGVja2VkOiBoYW5kbGVDaGVja1Jvd0RhdGF9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkICpuZ0lmPVwiaW5kZXggPT0gX2RhdGFTb3VyY2UubGVuZ3RoIC0gMVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBbcmVuZGVyS2V5XT1cIl9kYXRhU291cmNlXCJcclxuICAgICAgICAgICAgICAgIChsb2FkZWQpPVwiaGFuZGxlVGFibGVSZW5kZXJlZCgpXCI+XHJcbiAgICAgICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LXJvd0RhdGEgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgncm93RXhwYW5zaW9uJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIGV4cGFuZGVkOiBleHBhbmRlZCwgZ2V0Q29sU3Bhbkdyb3VwOiBnZXRDb2xTcGFuR3JvdXB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3N1bW1hcnknKVwiIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdzdW1tYXJ5JylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdmb290ZXInKVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2Zvb3RlcicpOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3AtdGFibGU+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjdGFibGVHZXRHcm91cEZpZWxkVHJ1ZT5cclxuICAgIDxwLXRhYmxlICN0YWJsZUdyb3VwIFtzY3JvbGxhYmxlXT1cInBUYWJsZVNjcm9sbGFibGVcIiBbc2Nyb2xsSGVpZ2h0XT1cInBUYWJsZVNjcm9sbEhlaWdodFwiIFtjb2x1bW5zXT1cInNldHRpbmcuY29sc1wiXHJcbiAgICAgICAgW3BhZ2luYXRvcl09XCJmYWxzZVwiIFt2YWx1ZV09XCJfZGF0YVNvdXJjZVwiIFttZXRhS2V5U2VsZWN0aW9uXT1cImZhbHNlXCIgKG9uU29ydCk9XCJvblNvcnQoJGV2ZW50LCB0YWJsZUdyb3VwKVwiXHJcbiAgICAgICAgW2NsYXNzXT1cIl90YWJsZUNsYXNzXCIgW2N1c3RvbVNvcnRdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInJlc3BvbnNpdmVcIiBbbGF6eV09XCJ0cnVlXCIgW2xvYWRpbmddPVwibW9kZWwubG9hZGluZ1wiXHJcbiAgICAgICAgWyhzZWxlY3Rpb24pXT1cIm1vZGVsLnNlbGVjdGVkSXRlbXNcIiBbZXhwYW5kZWRSb3dLZXlzXT1cIm1vZGVsLmV4cGFuZGVkUm93S2V5c1wiIFtkYXRhS2V5XT1cIl9ncm91cEZpZWxkXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2NvbGdyb3VwJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFzZUNvbGdyb3VwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdoZWFkZXInKSwgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1ucywgY3J1ZExpc3Q6IHRoaXMsIHJvd0hlYWRlckZpbHRlcjogcm93SGVhZGVyRmlsdGVyLCBjb250ZW50VGg6IGNvbnRlbnRUaCwgY29udGFpbmVyU3RpY2t5OiBjb250YWluZXJTdGlja3ksIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGxfR3JvdXB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRySGVhZGVyOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zLCBmdW5jQ2hlY2tBbGw6IGhhbmRsZUNoZWNrQWxsX0dyb3VwfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJyb3dHcm91cE1ldGFkYXRhW3Jvd0RhdGFbX2dyb3VwRmllbGRdXSAmJiByb3dHcm91cE1ldGFkYXRhW3Jvd0RhdGFbX2dyb3VwRmllbGRdXS5pbmRleCA9PSByb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtd2lkZ2V0LWhlYWRlciBncm91cC1yb3dcIiBzdHlsZT1cImJvcmRlcjogMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuQ2hlY2tib3hcIiBjbGFzcz1cImNlbnRlciBjaGtib3hcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJyb3dHcm91cENoZWNrZWRbcm93RGF0YVtfZ3JvdXBGaWVsZF1dXCIgYmluYXJ5PVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoYW5kbGVDaGVja1Jvd0dyb3VwKHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdyb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImdldENvbFNwYW5Hcm91cCgpXCIgW2NsYXNzXT1cIl9jbGFzc1Jvd0dyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItcm93LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgW3BSb3dUb2dnbGVyXT1cInJvd0RhdGFcIiBjbGFzcz1cImNvbnRhaW5lci1yb3ctZ3JvdXAtdG9nZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZXhwYW5kZWQgPyAnZmFzIGZhLWZ3IGZhLWNhcmV0LWRvd24nIDogJ2ZhcyBmYS1mdyBmYS1jYXJldC1yaWdodCdcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtcm93LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbnRlbnRSb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9jb250ZW50Um93R3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjb250ZW50Um93R3JvdXAnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY29udGVudFJvd0dyb3VwJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdyb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgncm93R3JvdXAnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXBSb290KHJvd0RhdGEsIGV4cGFuZGVkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LXJvd0RhdGEgbGV0LWluZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ckJvZHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIGNvbHVtbnM6IGNvbHVtbnMsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGZhbHNlLCBldmVudFNlbGVjdFJvdzogaGFuZGxlU2VsZWN0Um93R3JvdXAsIGV2ZW50Q2hlY2tlZDogaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCAqbmdJZj1cImluZGV4ID09IF9kYXRhU291cmNlLmxlbmd0aCAtIDFcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgW3JlbmRlcktleV09XCJfZGF0YVNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAobG9hZGVkKT1cImhhbmRsZVRhYmxlUmVuZGVyZWQoKVwiPlxyXG4gICAgICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdzdW1tYXJ5JylcIiBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgnc3VtbWFyeScpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJoYXNUZW1wbGF0ZSgnZm9vdGVyJylcIiBwVGVtcGxhdGU9XCJmb290ZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdmb290ZXInKTsgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1uc31cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG4gICAgPGFmdGVyLXZpZXctY2hlY2tlZD48L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNiYXNlQ29sZ3JvdXAgbGV0LWNvbHVtbnM+XHJcbiAgICA8Y29sZ3JvdXA+XHJcbiAgICAgICAgPGNvbCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkNoZWNrYm94XCIgW3N0eWxlLndpZHRoXT1cIndpZHRoQ2hlY2tib3hcIiAvPlxyXG4gICAgICAgIDxjb2wgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIFtzdHlsZS53aWR0aF09XCJ3aWR0aE9yZGVyQ29sdW1uXCIgLz5cclxuICAgICAgICA8Y29sICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgc3R5bGU9XCJ3aWR0aDogMi41cmVtXCIgLz5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8Y29sICpuZ0lmPVwiY29sICYmIGNvbC52aXNpYmxlICYmIGNvbC5maWVsZCE9J2Z1bmN0aW9uJ1wiIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIiAvPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxjb2wgKm5nSWY9XCJlbmFibGVSZW9yZGVyUm93XCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiIC8+XHJcbiAgICAgICAgPGNvbCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCIgW3N0eWxlLndpZHRoXT1cIndpZHRoRnVuY3Rpb25Db2x1bW4gfHwgX3dpZHRoRnVuY3Rpb25Db2x1bW5cIiAvPlxyXG4gICAgPC9jb2xncm91cD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNidXR0b25BZGQ+XHJcbiAgICA8c3BhbiBbYXBwQXV0aG9yaXplXT1cInNlcnZpY2VDb2RlXCIgW3Blcm1pc3Npb25dPVwiYXV0aG9yaXplUGF0aHNbY29tbW9uQ29uc3QuQUREXVwiXHJcbiAgICAgICAgW2VuYWJsZUF1dGhvcml6ZV09XCJidXR0b25BcHBseUF1dGhvcml6ZVtjb21tb25Db25zdC5BRERdXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGxhYmVsPVwiVGjDqm0gbeG7m2lcIiBpY29uPVwicGkgcGktcGx1c1wiIGNsYXNzPVwicC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbW9kZWwuYmFzZVJlYWR5XCIgKGNsaWNrKT1cImFkZCgpXCI+PC9idXR0b24+XHJcbiAgICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjYnV0dG9uRXhwb3J0PlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cIm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIlxyXG4gICAgICAgIFtwZXJtaXNzaW9uXT1cImF1dGhvcml6ZVBhdGhzW2NvbW1vbkNvbnN0LkVYUE9SVF9FWENFTF1cIlxyXG4gICAgICAgIFtlbmFibGVBdXRob3JpemVdPVwiYnV0dG9uQXBwbHlBdXRob3JpemVbY29tbW9uQ29uc3QuRVhQT1JUX0VYQ0VMXVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGVcclxuICAgICAgICBsYWJlbD1cIlh14bqldCBjw6FjIG3hu6VjIMSRw6MgY2jhu41uICh7e21vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RofX0pXCIgaWNvbj1cImZhcyBmYS1maWxlLWV4Y2VsXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2Vzc1wiIChjbGljayk9XCJ4dWF0Q2FjTXVjRGFDaG9uKClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNidXR0b25EZWxldGU+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGRlbkRlbGV0ZSAmJiBtb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgIWRpc2FibGVNdWx0aXBsZURlbGV0ZSgpXCJcclxuICAgICAgICBbYXBwQXV0aG9yaXplXT1cInNlcnZpY2VDb2RlXCIgW3Blcm1pc3Npb25dPVwiYXV0aG9yaXplUGF0aHNbY29tbW9uQ29uc3QuREVMRVRFX01VTFRJUExFXVwiXHJcbiAgICAgICAgW2VuYWJsZUF1dGhvcml6ZV09XCJidXR0b25BcHBseUF1dGhvcml6ZVtjb21tb25Db25zdC5ERUxFVEVfTVVMVElQTEVdXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZVxyXG4gICAgICAgIFtsYWJlbF09XCInWMOzYSAnICsgKG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoKSB8IHRyYW5zbGF0ZVwiIGljb249XCJwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJkZWxldGVNdXRpcGxlKClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICN0ckhlYWRlciBsZXQtY29sdW1ucyBsZXQtZnVuY0NoZWNrQWxsPVwiZnVuY0NoZWNrQWxsXCI+XHJcbiAgICA8dHIgY2xhc3M9XCJ0aXRsZS1yb3dcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2hrYm94IGxpbmstb3ItYWN0aW9uIGNlbGwtY2hlY2tib3hcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgYnRuUmVsb2FkXCIgcFRvb2x0aXA9XCJMw6BtIG3hu5tpIGThu68gbGnhu4d1XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kZWwubG9hZGluZ1wiIChjbGljayk9XCJyZWxvYWQoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NydWRMaXN0OiB0aGlzfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIGNsYXNzPVwic3R0IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAoZGJsY2xpY2spPVwicmVsb2FkKClcIj5cclxuICAgICAgICAgICAge3sgJ1RUJyB8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgY2xhc3M9XCJub3BhZCByb3ctZXhwYW5zaW9uLXRvZ2dsZSBjZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAyLjVyZW1cIlxyXG4gICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImNvbCAmJiBjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQhPSdmdW5jdGlvbidcIiBbbmdTdHlsZV09XCJjb2wuZXh0ZW5kRGF0YS5oZWFkZXJTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwidW5zZXQtd2lkdGhcIiBbY2xhc3NdPVwiY29sLmV4dGVuZERhdGEuaGVhZGVyQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW3RuU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCIgW2hvc3RSZWZdPVwidGhpc1wiIFt0blNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiIWNvbC5zb3J0XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5maXJzdC10aF09XCJpPT0wXCIgW2VzY2FwZV09XCJmYWxzZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUaDsgY29udGV4dDogeyRpbXBsaWNpdDogY29sfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0IHx8IGNvbC5zb3J0Q2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRJY29uOyBjb250ZXh0OiB7ZmllbGQ6IGNvbC5maWVsZH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cImVuYWJsZVJlb3JkZXJSb3dcIiBzdHlsZT1cIndpZHRoOiAzMHB4XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2xGdW5jdGlvbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC90cj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dIZWFkZXJGaWx0ZXI7IGNvbnRleHQ6IHtjb2x1bW5zOiBjb2x1bW5zLCBmdW5jQ2hlY2tBbGw6IGZ1bmNDaGVja0FsbH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3Jvd0hlYWRlckZpbHRlciBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtZnVuY0NoZWNrQWxsPVwiZnVuY0NoZWNrQWxsXCI+XHJcbiAgICA8dHIgY2xhc3M9XCJmaWx0ZXItcm93XCIgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GaWx0ZXJSb3dcIj5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5DaGVja2JveFwiIGNsYXNzPVwiY2hrYm94IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICBbY2xhc3MudHJpY2hlY2tib3gtY3VzdG9tLWZhbHNlXT1cImNoZWNrZWRBbGwgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDxwLXRyaVN0YXRlQ2hlY2tib3ggWyhuZ01vZGVsKV09XCJjaGVja2VkQWxsXCIgYmluYXJ5PVwidHJ1ZVwiIChvbkNoYW5nZSk9XCJmdW5jQ2hlY2tBbGwoKVwiPlxyXG4gICAgICAgICAgICA8L3AtdHJpU3RhdGVDaGVja2JveD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW5cIiBjbGFzcz1cInN0dCBjZW50ZXIgdi10b3BcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCIgY2xhc3M9XCJwaWNrLWNvbG9yLXJvd1wiIHBUb29sdGlwPVwiQ+G6pXUgaMOsbmggaGnhu4NuIHRo4buLIG3DoHVcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNob3dTZXR0aW5nUm93Q29sb3IoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cImhhc1RlbXBsYXRlKCdyb3dFeHBhbnNpb24nKVwiIGNsYXNzPVwibm9wYWQgY2VudGVyIHJvdy1leHBhbnNpb24tdG9nZ2xlXCJcclxuICAgICAgICAgICAgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQgIT0gJ2Z1bmN0aW9uJ1wiIGNsYXNzPVwiY2VsbC1oZWFkZXItZmlsdGVyIGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5hbGxvd0ZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudGVtcGxhdGVGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wudGVtcGxhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbCwgZmlsdGVyRGF0YTogZmlsdGVyRGF0YSwgb25TZWFyY2g6IG9uU2VhcmNoLCBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsOiBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsLCBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsOiBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbC50ZW1wbGF0ZUZpbHRlclwiIFtuZ1N3aXRjaF09XCJjb2wuY29udHJvbFR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbC5yYXdDb2x1bW59XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sLmRhdGFUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ludCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ludFdpdGhvdXRNYXNrJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlckJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlclRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggKm5nSWY9XCJlbmFibGVSZW9yZGVyUm93XCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtblwiIGNsYXNzPVwiY2VudGVyIHNldHRpbmctY2VsbCBjb2x1bW4tZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktY29nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCIgcFRvb2x0aXA9XCJD4bqldSBow6xuaCBoaeG7g24gdGjhu4tcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTZXR0aW5ncygpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nUGVybWlzc2lvblwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXVzZXJzXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCIgcFRvb2x0aXA9XCJQaMOibiBxdXnhu4FuIGThu68gbGnhu4d1XCIgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNoZWNrUGVybWlzc2lvblRvVXNlQnV0dG9uKEJVVFRPTl9QSEFOX1FVWUVOKVwiIChjbGljayk9XCJzaG93U2V0dGluZ3NQZXJtaXNzaW9uKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlblNldHRpbmdXb3JrZmxvd1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNpdGVtYXBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBwVG9vbHRpcD1cIkPhuqV1IGjDrG5oIHF1eSB0csOsbmhcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2hlY2tQZXJtaXNzaW9uVG9Vc2VCdXR0b24oQlVUVE9OX0NBVV9ISU5IX1FVWV9UUklOSClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTZXR0aW5nc1dvcmtmbG93TmV3KClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICA8L3RyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbEZ1bmN0aW9uSGVhZGVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiY29sdW1uLWZ1bmN0aW9uXCIgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbC1oZWFkZXItZnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7J0dSSUQuRlVOQ1RJT04nfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGVudFRoIGxldC1jb2w+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVtcGxhdGVIZWFkZXJDb250ZW50W2NvbC5maWVsZF1cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50W2NvbC5maWVsZF1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0ZW1wbGF0ZUhlYWRlckNvbnRlbnRbY29sLmZpZWxkXVwiPlxyXG4gICAgICAgIHt7Y29sLmxhYmVsfX1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3RyQm9keSBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCJcclxuICAgIGxldC1ldmVudFNlbGVjdFJvdz1cImV2ZW50U2VsZWN0Um93XCIgbGV0LWV2ZW50Q2hlY2tlZD1cImV2ZW50Q2hlY2tlZFwiPlxyXG4gICAgPHRyICpuZ0lmPVwiIXJvd0RhdGEudGVtcGxhdGVcIiBbdG5SZW9yZGVyYWJsZVJvd109XCJpbmRleFwiIFthdHRyLnJvd0luZGV4XT1cImluZGV4XCIgW25nQ2xhc3NdPVwicm93RGF0YS5vYmpTdHlsZUNsYXNzXCJcclxuICAgICAgICBbY2xhc3MudWktc3RhdGUtaGlnaGxpZ2h0XT1cInJvd0RhdGEuX2NoZWNrZWRcIiBbcFRvb2x0aXBdPVwicm93RGF0YS50b29sdGlwXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICBbdG9vbHRpcFN0eWxlQ2xhc3NdPVwicm93RGF0YS50b29sdGlwQ2xhc3NcIiBbZXNjYXBlXT1cImVzY2FwZVwiIChjbGljayk9XCJldmVudFNlbGVjdFJvdygkZXZlbnQsIHJvd0RhdGEpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkNoZWNrYm94ICYmICFyb3dEYXRhLmhpZGRlbltmaWVsZENoZWNrYm94XVwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjaGtib3ggbGluay1vci1hY3Rpb24gY2VsbC1jaGVja2JveFwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkQ2hlY2tib3hdXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLnJvd1NwYW5dPVwicm93RGF0YS5yb3dTcGFuICYmIHJvd0RhdGEucm93U3BhbltmaWVsZENoZWNrYm94XVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb3dEYXRhLmhpZGRlbkNoZWNrQm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNUZW1wbGF0ZSgnY2hlY2tib3gnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jaGVja2JveCBbKG5nTW9kZWwpXT1cInJvd0RhdGEuX2NoZWNrZWRcIiBiaW5hcnk9XCJ0cnVlXCIgKG9uQ2hhbmdlKT1cImV2ZW50Q2hlY2tlZChyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjaGVja2JveCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2NoZWNrYm94JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntyb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogaW5kZXh9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGQgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtbiAmJiAhcm93RGF0YS5oaWRkZW5bZmllbGRPcmRlcl1cIiBjbGFzcz1cInN0dFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIiBbYXR0ci5jb2xTcGFuXT1cInJvd0RhdGEuY29sU3BhbiAmJiByb3dEYXRhLmNvbFNwYW5bZmllbGRPcmRlcl1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRPcmRlcl1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctY2FyZFwiIFtuZ1N0eWxlXT1cInJvd0RhdGEuYm9va21hcmtTdHlsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkT3JkZXJdfX1cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpICYmICFyb3dEYXRhLmhpZGRlbltmaWVsZENvbEV4cGFuZF1cIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm5vLXBhZGRpbmcgY2VudGVyIHJvdy1leHBhbnNpb24tdG9nZ2xlXCIgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiXHJcbiAgICAgICAgICAgIFthdHRyLmNvbFNwYW5dPVwicm93RGF0YS5jb2xTcGFuICYmIHJvd0RhdGEuY29sU3BhbltmaWVsZENvbEV4cGFuZF1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRDb2xFeHBhbmRdXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uVG9nZ2xlUm93RGF0YTsgY29udGV4dDoge3Jvd0RhdGE6IHJvd0RhdGEsIGV4cGFuZGVkOiBleHBhbmRlZH1cIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkeW5hbWljQ29sQm9keXM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnMsIHJvd0RhdGE6IHJvd0RhdGEsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGV4cGFuZGVkfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cImVuYWJsZVJlb3JkZXJSb3cgJiYgIXJvd0RhdGEuaGlkZGVuW2ZpZWxkQ29sUmVvcmRlcl1cIiBjbGFzcz1cIm5vLXBhZGRpbmcgY2VudGVyXCJcclxuICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkQ29sUmVvcmRlcl1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRDb2xSZW9yZGVyXVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hcnJvd3MtYWx0XCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjsgcGFkZGluZzogOHB4OyBjb2xvcjogIzU1NTtcIiBwUmVvcmRlcmFibGVSb3dIYW5kbGU+PC9pPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gJiYgIXJvd0RhdGEuaGlkZGVuW2ZpZWxkRnVuY3Rpb25dXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGNvbHVtbi1mdW5jdGlvblwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkRnVuY3Rpb25dXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLnJvd1NwYW5dPVwicm93RGF0YS5yb3dTcGFuICYmIHJvd0RhdGEucm93U3BhbltmaWVsZEZ1bmN0aW9uXVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1RlbXBsYXRlKCdmdW5jdGlvbicpXCIgY2xhc3M9XCJwLXRvb2xiYXItZ3JvdXAtY2VudGVyIGJ1dHRvbi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2Z1bmN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2Z1bmN0aW9uJylcIiBjbGFzcz1cInAtdG9vbGJhci1ncm91cC1jZW50ZXIgYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQmVmb3JlJylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2V0dGluZy5zaG93VmVyc2lvbkJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLWNhbGVuZGFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2VzcyBsaW5rLW9yLWFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBUb29sdGlwPVwiWGVtIGzhu4tjaCBz4butIHBoacOqbiBi4bqjblwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93TGlzdFZlcnNpb24ocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuRWRpdFwiIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJhdXRob3JpemVQYXRoc1tjb21tb25Db25zdC5FRElUXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVBdXRob3JpemVdPVwiYnV0dG9uQXBwbHlBdXRob3JpemVbY29tbW9uQ29uc3QuRURJVF1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRWRpdChyb3dEYXRhKVwiIFtwVG9vbHRpcF09XCInRk9STS5FRElUJyB8IHRyYW5zbGF0ZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8gbGluay1vci1hY3Rpb25cIiBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuRGVsZXRlXCIgW2FwcEF1dGhvcml6ZV09XCJzZXJ2aWNlQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwZXJtaXNzaW9uXT1cImF1dGhvcml6ZVBhdGhzW2NvbW1vbkNvbnN0LkRFTEVURV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlQXV0aG9yaXplXT1cImJ1dHRvbkFwcGx5QXV0aG9yaXplW2NvbW1vbkNvbnN0LkRFTEVURV1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRGVsZXRlKHJvd0RhdGEpXCIgW3BUb29sdGlwXT1cIidGT1JNLkRFTEVURScgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgbGluay1vci1hY3Rpb25cIiBpY29uPVwicGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dNZW51QnV0dG9ucyAmJiBtZW51QnV0dG9uc1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaW5rLW9yLWFjdGlvbiBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8gcC1idXR0b24tcm91bmRlZFwiIHBUb29sdGlwPVwiQ2jhu6ljIG7Eg25nIGtow6FjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNob3dDb250ZXh0TWVudSgkZXZlbnQsIHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQWZ0ZXInKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3RyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGEudGVtcGxhdGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93RGF0YS50ZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsIGNvbHVtbnM6IGNvbHVtbnMsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGV4cGFuZGVkLCBldmVudFNlbGVjdFJvdzogZXZlbnRTZWxlY3RSb3csIGV2ZW50Q2hlY2tlZDogZXZlbnRDaGVja2VkXHJcbiAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZHluYW1pY0NvbEJvZHlzIGxldC1jb2x1bW5zIGxldC1yb3dEYXRhPVwicm93RGF0YVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZDsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgY29sOiBjb2wsIGluZGV4OiBpbmRleCwgaTogaSwgZXhwYW5kZWQ6IGV4cGFuZGVkfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGVudFRkIGxldC1yb3dEYXRhIGxldC1jb2w9XCJjb2xcIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCIgbGV0LWk9XCJpXCI+XHJcbiAgICA8dGQgKm5nSWY9XCJjb2wgJiYgY29sLnZpc2libGUgJiYgY29sLmZpZWxkICE9ICdmdW5jdGlvbicgJiYgIXJvd0RhdGEuaGlkZGVuW2NvbC5maWVsZF1cIlxyXG4gICAgICAgIFthdHRyLmNvbFNwYW5dPVwicm93RGF0YS5jb2xTcGFuICYmIHJvd0RhdGEuY29sU3Bhbltjb2wuZmllbGRdXCJcclxuICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bY29sLmZpZWxkXVwiIFtuZ1N0eWxlXT1cImNvbC5leHRlbmREYXRhLnN0eWxlXCJcclxuICAgICAgICBbY2xhc3NdPVwiY29sLmNlbGxDbGFzc1wiIFtjbGFzcy5maXJzdC10ZF09XCJpID09IDBcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIiBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIFtlc2NhcGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+e3tjb2wubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAge3tyb3dEYXRhWydwaXBlX18nICsgY29sLmZpZWxkXX19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIiBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIFtlc2NhcGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+e3tjb2wubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZXR0aW5nLnNob3dFZGl0TGluayAmJiBjb2wuc2hvd0VkaXRMaW5rXCIgY2xhc3M9XCJsaW5rLW9yLWFjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJ2aWV3KHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRlbXBsYXRlQ2VsbDsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbnRlbnRDZWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogaW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2V0dGluZy5zaG93RWRpdExpbmsgfHwgIWNvbC5zaG93RWRpdExpbmtcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZUNlbGw7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNvbnRlbnRDZWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleCwgY29sOiBjb2wsIGV4cGFuZGVkOiBleHBhbmRlZFxyXG4gICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC90ZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjb250ZW50Q2VsbCBsZXQtY29sPVwiY29sXCIgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtZmllbGQ9XCJmaWVsZFwiXHJcbiAgICBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZUNlbGw7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiBjb2wudGVtcGxhdGUsXHJcbiAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiByb3dJbmRleCwgY29sOiBjb2wsIGV4cGFuZGVkOiBleHBhbmRlZFxyXG4gICAgICAgIH1cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wudGVtcGxhdGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wuZGF0YVR5cGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjb2xvcidcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtwVG9vbHRpcF09XCJyb3dEYXRhW2ZpZWxkXVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6cm93RGF0YVtmaWVsZF19XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7bWFyZ2luOjAgYXV0bztcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO3RleHQtYWxpZ246Y2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPGkgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2ZpZWxkXVwiPjwvaT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdIHwgZGF0ZTonZGQvTU0veXl5eSdcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF0gfCB0bkRhdGU6Y29sLmRhdGFUeXBlOmNvbC5mb3JtYXR9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZXRpbWUnXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbSdcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgdG5EYXRlOmNvbC5kYXRhVHlwZTpjb2wuZm9ybWF0fX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VzZXInXCIgY2xhc3M9XCJ1c2VyXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgdXNlckZvcm1hdCB8IGFzeW5jfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCIndXNlcnMnXCIgW2lubmVySFRNTF09XCJyb3dEYXRhW2ZpZWxkXSB8IHVzZXJzRm9ybWF0IHwgYXN5bmNcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInaW50J1wiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXSB8IG51bWJlcn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidpbnRXaXRob3V0TWFzaydcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgY3VycmVuY3k6XCJWTkRcIn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXSB8IG51bWJlcn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggY2xhc3M9XCJib29sZWFuLWRhdGEtdHlwZVwiIFsobmdNb2RlbCldPVwicm93RGF0YVtmaWVsZF1cIiBiaW5hcnk9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVDaGVja0JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInaHRtbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkXT09bnVsbD8nJzpyb3dEYXRhW2ZpZWxkXVwiIFtpbm5lckhUTUxdPVwicm93RGF0YVtmaWVsZF0gfCBzYWZlSHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbWV0YWRhdGFTdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbJ3JlamVjdFJlYXNvbiddXCIgY2xhc3M9XCJsYWJlbC1kYW5nZXJcIiBbcFRvb2x0aXBdPVwicm93RGF0YVsncmVqZWN0UmVhc29uJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBTdHlsZUNsYXNzPVwidW5zZXQtd2lkdGhcIiBbZXNjYXBlXT1cImZhbHNlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+VOG7qyBjaOG7kWk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbZmllbGRdID09ICcwJyAmJiAhcm93RGF0YVsncmVqZWN0UmVhc29uJ11cIiBjbGFzcz1cImxhYmVsLXNlY29uZGFyeVwiPkNoxrBhXHJcbiAgICAgICAgICAgICAgICAgICAgZHV54buHdDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtmaWVsZF0gPT0gJzEnICYmICFyb3dEYXRhWydyZWplY3RSZWFzb24nXVwiIGNsYXNzPVwibGFiZWwtd2FybmluZ1wiPkNo4budIGR1eeG7h3Q8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbZmllbGRdID09ICcyJ1wiIGNsYXNzPVwibGFiZWwtcHJpbWFyeVwiPsSQw6MgZHV54buHdDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZVVwbG9hZCdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZVsnY3J1ZExpc3RGaWxlVXBsb2FkQ29sdW1uJ107IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIGZpZWxkOiBjb2wuZmllbGQsIGZpbGVTZXR0aW5nOiBjb2wuZmlsZVNldHRpbmdcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGVNYW5hZ2VyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVbJ2NydWRMaXN0RmlsZU1hbmFnZXInXTsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZCwgZmlsZVNldHRpbmc6IGNvbC5maWxlU2V0dGluZ31cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50Q2VsbFN0cmluZzsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwibnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRDZWxsU3RyaW5nOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCBmaWVsZDogY29sLmZpZWxkfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVDZWxsOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBnZXRDb21wb25lbnRCeVR5cGUoY29sLmRhdGFUeXBlKSxcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogcm93SW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnRDZWxsU3RyaW5nIGxldC1yb3dEYXRhIGxldC1maWVsZD1cImZpZWxkXCI+XHJcbiAgICA8c3Bhbj5cclxuICAgICAgICA8IS0tIF9fc3Y6IFNob3J0IFZhbHVlIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkICsgJ19fc3YnXVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGQgKyAnX19zdiddfX1cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXNob3dmdWxsXCIgKGNsaWNrKT1cInRvZ2dsZVNob3dGdWxsKHJvd0RhdGEsIGZpZWxkKVwiIHBUb29sdGlwPVwiQuG6pW0gxJHhu4MgeGVtIHRow6ptXCJcclxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5bLi4uXTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkICsgJ19fc2hvd0Z1bGwnXVwiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zaG93ZnVsbFwiIChjbGljayk9XCJ0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZClcIj5UaHUgZ+G7jW48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm93RGF0YVtmaWVsZCArICdfX3N2J11cIj5cclxuICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXX19XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY3VzdG9tVGVtcGxhdGVDZWxsIGxldC10ZW1wbGF0ZSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jb2w9XCJjb2xcIlxyXG4gICAgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICRpbXBsaWNpdDogcm93RGF0YSxcclxuICAgICAgICBjcnVkTGlzdDogdGhpcyxcclxuICAgICAgICByb3dJbmRleCxcclxuICAgICAgICBjb2wsXHJcbiAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICBleHBhbmRlZCxcclxuICAgICAgICBpY29uVG9nZ2xlUm93RGF0YTogdGhpcy5pY29uVG9nZ2xlUm93RGF0YVxyXG4gICAgfVwiPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvblRvZ2dsZVJvd0dyb3VwIGxldC1yb3dEYXRhPVwicm93RGF0YVwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImhhbmRsZVRvZ2dsZVJvdyhyb3dEYXRhLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgPGkgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCIgW25nQ2xhc3NdPVwiZXhwYW5kZWQgPyAnZmFzIGZhLWZ3IGZhLWNhcmV0LWRvd24nIDogJ2ZhcyBmYS1mdyBmYS1jYXJldC1yaWdodCdcIj48L2k+XHJcbiAgICA8L2E+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjaWNvblRvZ2dsZVJvd0RhdGEgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cImxpbmstb3ItYWN0aW9uIHAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1wbGFpblwiXHJcbiAgICAgICAgW2ljb25dPVwiZXhwYW5kZWQgPyAncGkgcGktY2hldnJvbi1kb3duJyA6ICdwaSBwaS1jaGV2cm9uLXJpZ2h0J1wiXHJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZVRvZ2dsZVJvdyhyb3dEYXRhLCAkZXZlbnQpXCI+PC9idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjX2NvbnRlbnRSb3dHcm91cCBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtZ3JvdXBDb2w9XCJncm91cENvbFwiIGxldC1ncm91cEZpZWxkPVwiX2dyb3VwRmllbGRcIj5cclxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29udGVudENlbGxcIlxyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7cm93RGF0YTogcm93RGF0YSwgY29sOiBncm91cENvbCwgZmllbGQ6IF9ncm91cEZpZWxkfVwiPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8c3BhbiAqbmdJZj1cInNldHRpbmcuY29sdW1uU2V0dGluZy5zaG93R3JvdXBTaXplXCI+XHJcbiAgICAgICAgKHt7cm93R3JvdXBNZXRhZGF0YVtyb3dEYXRhW19ncm91cEZpZWxkXV0uc2l6ZX19KTwvc3Bhbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICN0cmFuZ1RoYWlWNSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItdGV4dC13b3JrZmxvd1wiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93RGF0YS5fX3dvcmtmbG93Q29kZSAmJiAhcm93RGF0YS5oaWRkZW5Xb3JrZmxvd0FjdGlvbiAmJiAhcm93RGF0YS5oaWRkZW5TdGFydFdvcmtmbG93XCIgcEJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgbGluay1vci1hY3Rpb25cIiBsYWJlbD1cIkLhuq90IMSR4bqndVwiIHN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgIzdjYTljZDtcIlxyXG4gICAgICAgICAgICBwVG9vbHRpcD1cIkLhuq90IMSR4bqndSBjaOG6oXkgcXV5IHRyw6xuaFwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dEYXRhLl9fc3RhcnRpbmdXb3JrZmxvdyAmJiAhcm93RGF0YS5fX25vdFJlYWR5Rm9yU3RhcnRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0Zvcm1TdGFydFdvcmtmbG93KHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGEuX193b3JrZmxvd0NvZGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250ZW50XCI+e3tyb3dEYXRhLl9fdGV4dFRyYW5nVGhhaX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuV29ya2Zsb3dBY3Rpb25cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktZWxsaXBzaXMtdlwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxpbmstb3ItYWN0aW9uIHAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZFwiIHBUb29sdGlwPVwiSMOgbmggxJHhu5luZ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2hvd2luZ0FjdGlvbldvcmtmbG93XCIgKGNsaWNrKT1cInNob3dBY3Rpb25Xb3JrZmxvdygkZXZlbnQsIHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICN2aWV3SGlzdG9yeSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIj5cclxuICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktY2FsZW5kYXJcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tcm91bmRlZCBsaW5rLW9yLWFjdGlvblwiIHBUb29sdGlwPVwiWGVtIGzhu4tjaCBz4butXCJcclxuICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiAoY2xpY2spPVwidmlld0hpc3RvcnlXb3JrZmxvdyhzZXR0aW5nLCByb3dEYXRhKVwiPjwvYnV0dG9uPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRhaW5lclN0aWNreT5cclxuICAgIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSB0b3BcIj48L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpeC1zdGlja3kgcmlnaHRcIj48L3NwYW4+XHJcbiAgICA8IS0tIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSBib3R0b21cIj48L3NwYW4+IC0tPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmaXgtc3RpY2t5IGxlZnRcIj48L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjc29ydEljb24gbGV0LWZpZWxkPVwiZmllbGRcIj5cclxuICAgIDxpIGNsYXNzPVwicC1zb3J0YWJsZS1jb2x1bW4taWNvbiBwaVwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhlbTtcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsncGktc29ydC1hbW91bnQtdXAtYWx0JzogZmllbGQgPT0gX3NvcnRGaWVsZCAmJiBfc29ydERpciA9PT0gMSwgJ3BpLXNvcnQtYW1vdW50LWRvd24nOiBmaWVsZCA9PSBfc29ydEZpZWxkICYmIF9zb3J0RGlyID09PSAtMSwgJ3BpLXNvcnQtYWx0JzogZmllbGQgIT0gX3NvcnRGaWVsZCB8fCBfc29ydERpciA9PT0gMH1cIj48L2k+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyRHJvcGRvd24gbGV0LWNvbD1cImNvbFwiPlxyXG4gICAgPGRpdiAjZmlsdGVyQm94IHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1yYWRpdXM6IDRweDtcIj5cclxuICAgICAgICA8ZHJvcGRvd24gKm5nSWY9XCJjb2wgJiYgZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF1cIiBbY29udHJvbF09XCJmaWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImZpbHRlclNjaGVtYS5kcm9wZG93bltjb2wuZmllbGRdLmRhdGFTb3VyY2VcIiBbKHZhbHVlKV09XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAob25IaWRlU21hcnRFdmVudCk9XCJvblNlYXJjaCgpXCIgKG9uU2hvdyk9XCJvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25IaWRlKT1cIm9uSGlkZUZpbHRlckRyb3Bkb3duUGFuZWwoJGV2ZW50KVwiIChtb3VzZWRvd24pPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj48L2Ryb3Bkb3duPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyVGV4dCBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2ICNmaWx0ZXJCb3ggY2xhc3M9XCJ0ZXh0LWZpbHRlciBmaWx0ZXItYm94XCIgdGFiaW5kZXg9XCItMVwiIChtb3VzZWRvd24pPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBjbGFzcz1cImlucHV0LXNlYXJjaFwiIFtwbGFjZWhvbGRlcl09XCJjb2wubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIiAoY2hhbmdlKT1cIm9uU2VhcmNoKClcIlxyXG4gICAgICAgICAgICAgICAgKGtleXVwLmVzYyk9XCJvbkNsZWFyU2VhcmNoKGZpbHRlckJveCwgY29sLmZpZWxkKVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWNsZWFyJzogdHJ1ZSwgJ2RpcnR5JzogZmlsdGVyRGF0YVtjb2wuZmllbGRdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdICE9PSAnJ31cIlxyXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0Lhu48gZmlsdGVyJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIChtb3VzZWRvd24pPVwib25DbGVhclNlYXJjaChmaWx0ZXJCb3gsIGNvbC5maWVsZClcIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+PGkgY2xhc3M9XCJwaSBwaS1maWx0ZXItc2xhc2hcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDxhZnRlci12aWV3LWNoZWNrZWQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChsb2FkZWQpPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2ZpbHRlck51bWJlciBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2ICNmaWx0ZXJCb3ggY2xhc3M9XCJudW1iZXItcGlja2VyLXJhbmdlIGZpbHRlci1ib3hcIiB0YWJpbmRleD1cIi0xXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8dG4tbnVtYmVyLXBpY2tlci1yYW5nZSAjbnVtYmVyUmFuZ2UgW21hc2tUeXBlXT1cImNvbC5kYXRhVHlwZVwiIFsobmdNb2RlbCldPVwiZmlsdGVyRGF0YVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgIFttaW5dPVwiY29sLm1pblwiIFttYXhdPVwiY29sLm1heFwiIChjaGFuZ2UpPVwib25TZWFyY2goKVwiPlxyXG4gICAgICAgICAgICA8L3RuLW51bWJlci1waWNrZXItcmFuZ2U+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3Rpb24tY2xlYXInOiB0cnVlLCAnZGlydHknOiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gJiYgKChmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMF0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMF0gIT09ICcnKSB8fCAoZmlsdGVyRGF0YVtjb2wuZmllbGRdWzFdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdWzFdICE9PSAnJykpfVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInQuG7jyBmaWx0ZXInXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKG1vdXNlZG93bik9XCJvbkNsZWFyTnVtYmVyU2VhcmNoKGZpbHRlckJveCwgbnVtYmVyUmFuZ2UpXCJcclxuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWZpbHRlci1zbGFzaFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGxvYWRlZCk9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyRGF0ZSBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2ICNmaWx0ZXJCb3ggY2xhc3M9XCJkYXRlLXBpY2tlci1yYW5nZSBmaWx0ZXItYm94XCIgdGFiaW5kZXg9XCItMVwiIChtb3VzZWRvd24pPVwiaW5pdEZpbHRlckJveEZvY3VzKGZpbHRlckJveClcIj5cclxuICAgICAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgPHRuLWRhdGV0aW1lLXBpY2tlci1yYW5nZSAjZGF0ZVJhbmdlIFtjb250cm9sXT1cImZpbHRlclNjaGVtYS5kYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlZCk9XCJvbkNoYW5nZURhdGVUaW1lKCRldmVudCwgY29sLmZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8L3RuLWRhdGV0aW1lLXBpY2tlci1yYW5nZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGlvbi1jbGVhcic6IHRydWUsICdkaXJ0eSc6IGZpbHRlckRhdGFbY29sLmZpZWxkXSAmJiAoKGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPT0gJycpIHx8IChmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT09ICcnKSl9XCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cIidC4buPIGZpbHRlcidcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xlYXJEYXRlU2VhcmNoKGZpbHRlckJveCwgZGF0ZVJhbmdlLCBjb2wuZmllbGQpXCIgdGFiaW5kZXg9XCItMVwiPjxpXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHBpLWZpbHRlci1zbGFzaFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGxvYWRlZCk9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyQm9vbGVhbiBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWJvb2xlYW4tYm94XCI+XHJcbiAgICAgICAgPHAtc2VsZWN0QnV0dG9uICpuZ0lmPVwiIWNvbC5taW5pbWl6ZUZpbHRlclwiXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cIlt7dmFsdWU6IHRydWUsIGxhYmVsOiAnQ8OzJywgaWNvbjogJ3BpIHBpLWNoZWNrJ30sIHt2YWx1ZTogZmFsc2UsIGxhYmVsOiAnS2jDtG5nJywgaWNvbjogJ3BpIHBpLXRpbWVzJ31dXCJcclxuICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZUJvb2xlYW4oJGV2ZW50LCBjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbT5cclxuICAgICAgICAgICAgICAgIDxpIHN0eWxlPVwicGFkZGluZzogM3B4IDA7XCIgW2NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3Atc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wubWluaW1pemVGaWx0ZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktZmlsdGVyLXNsYXNoXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWZpbHRlci1ib29sZWFuXCIgKGNsaWNrKT1cInNob3dDaGVja0JveEZpbHRlck1lbnUoJGV2ZW50LCBjb2wuZmllbGQpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktZmlsdGVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWZpbHRlci1ib29sZWFuIHAtYnV0dG9uLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dDaGVja0JveEZpbHRlck1lbnUoJGV2ZW50LCBjb2wuZmllbGQpXCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9jcnVkLWxpc3QvY3J1ZC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC9jcnVkLWxpc3QvY3J1ZC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhOUUsTUFBTSxPQUFPLGlCQUFrQixTQUFRLGlCQUFpQjtJQUNwRCxZQUNXLFNBQW1CO1FBRTFCLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUZWLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFHMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELHlCQUF5QjtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUU7WUFDM0QsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLENBQUM7WUFDMUcsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO29CQUMvQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDeEQsT0FBTztxQkFDVjtvQkFDRCxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNwRDtnQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTt3QkFBRSxPQUFPO29CQUNoQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO29CQUN0RixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDcEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO29CQUN2RSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3BFLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hELE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2hELFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7b0JBQ3pDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUM7b0JBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO2dCQUM5QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDVjtpQkFDSTtnQkFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQzthQUNwQztRQUNMLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7OzhHQS9DUSxpQkFBaUI7a0dBQWpCLGlCQUFpQixvQ0FGZixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsaURDYnRDLDQ5bEVBNitCYzsyRkQ5OUJELGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFFSSxXQUFXLGFBR1YsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIERlY2ltYWxQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExpc3RDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2xpc3QtY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBJTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvaS1saXN0LWNvbXBvbmVudCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuZGVjbGFyZSBsZXQgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdjcnVkLWxpc3QnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jcnVkLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0RlY2ltYWxQaXBlLCBEYXRlUGlwZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENydWRMaXN0Q29tcG9uZW50IGV4dGVuZHMgTGlzdENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBJTGlzdENvbXBvbmVudCwgT25Jbml0IHtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoX2luamVjdG9yKTtcclxuICAgICAgICB0aGlzLmlzVHJlZVRhYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5sb2FkaW5nIHx8IHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmNvbnRhaW5lclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLW92ZXJsYXknKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgncC10YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTY3JvbGxCYXJDb250ZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlU2Nyb2xsQmFyQ29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BzLWNvbnRlbnQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY3JvbGxCYXJDb250ZW50LnBhcmVudE5vZGUucHJlcGVuZChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RUaCA9IGVsZW1lbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCdwLXRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkID4gdGgnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoU2l6ZSA9IGZpcnN0VGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZ0ljb24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLWljb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShsb2FkaW5nSWNvbikuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IChmaXJzdFRoU2l6ZS5oZWlnaHQgLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSAoZmlyc3RUaFNpemUud2lkdGggLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJY29uLnN0eWxlLm1hcmdpblRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luTGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYWRqdXN0ZWRQb3NpdGlvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSwgMjApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLWNhcmQgY2FyZCBjYXJkLXctdGl0bGUgZmxleC1jb250YWluZXItZml0LWNoaWxkXCIgW2F0dHIuaGVpZ2h0LXR5cGVdPVwic2V0dGluZy5oZWlnaHRUeXBlXCJcclxuICAgIFtuZ1N0eWxlXT1cIl9zdHlsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWhlbHBlci1jbGVhcmZpeCBjcnVkLWxpc3QtaGVhZGVyLWFyZWFcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3NlYXJjaEN1c3RvbScpXCIgY2xhc3M9XCJncmlkIHVpLWZsdWlkIGN1c3RvbS1jb2wgY3VzdG9tLXNlYXJjaC1hcmVhXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNvbGxhcHNlZF09XCIhZXhwYW5kZWRTZWFyY2hcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYWluLWNvbnRhaW5lci1zZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIG1haW4tY29udGFpbmVyLXNlYXJjaC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgnc2VhcmNoQ3VzdG9tJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHRoaXN9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UtZXhwYW5kXCIgKGNsaWNrKT1cImV4cGFuZGVkU2VhcmNoID0gIWV4cGFuZGVkU2VhcmNoXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpXCIgW2NsYXNzLnBpLWNhcmV0LXVwXT1cImV4cGFuZGVkU2VhcmNoXCIgW2NsYXNzLnBpLWNhcmV0LWRvd25dPVwiIWV4cGFuZGVkU2VhcmNoXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuSGVhZGVyXCIgY2xhc3M9XCJncmlkIHVpLWZsdWlkIGN1c3RvbS1jb2wgcGFnZS10aXRsZS1hcmVhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5QYWdlVGl0bGVcIiBjbGFzcz1cIm1haW4tdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDxoMSAqbmdJZj1cIiFoYXNUZW1wbGF0ZSgnY3VzdG9tVGl0bGUnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7c2V0dGluZy50aXRsZSAhPSBudWxsID8gc2V0dGluZy50aXRsZSA6ICdEYW5oIHPDoWNoICcgKyBzZXR0aW5nLm9iamVjdE5hbWV9fVxyXG4gICAgICAgICAgICAgICAgPC9oMT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2N1c3RvbVRpdGxlJylcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY3VzdG9tVGl0bGUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZExpc3Q6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbkFkZDogYnV0dG9uQWRkLCBidXR0b25FeHBvcnQ6IGJ1dHRvbkV4cG9ydCwgYnV0dG9uRGVsZXRlOiBidXR0b25EZWxldGVcclxuICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuUGFnZVNldHRpbmdcIiBjbGFzcz1cInBhZ2luYXRvci10YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjdXN0b21QYWdlU2V0dGluZycpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY3VzdG9tUGFnZVNldHRpbmcnKVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2N1c3RvbVBhZ2VTZXR0aW5nJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGFnaW5nLW5leHQtYmFjay1vbmx5IFttb2RlbF09XCJtb2RlbFwiIFtzZXR0aW5nXT1cInNldHRpbmdcIiAob25DaGFuZ2VkKT1cImdldERhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZUxpbWl0UGFnZSk9XCJzYXZlUGFnZVNpemUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcGFnaW5nLW5leHQtYmFjay1vbmx5PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3RvcEdyaWQnKVwiIGNsYXNzPVwiZXh0ZW5kLWNvbnRlbnQtdG9wLWdyaWRcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VsZWN0ZWRJdGVtczogbW9kZWwuc2VsZWN0ZWRJdGVtcywgY3J1ZExpc3Q6IHRoaXN9XCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ3RvcEdyaWQnKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZml0LWNvbnRlbnQgY3J1ZC1saXN0LWJvZHktYXJlYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcnVkLWxpc3QtYm9keS1hcmVhLWlubmVyXCIgc3R5bGU9XCJvdmVyZmxvdzogdW5zZXQ7XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbnRhaW5lci1maXQtY2hpbGRcIiBzdHlsZT1cIm92ZXJmbG93OiB1bnNldDtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5Ub29sYmFyXCIgY2xhc3M9XCJncmlkIGNydWRMaXN0VG9vbGJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5CdXR0b25zICYmIGhhc1RlbXBsYXRlKCd0b29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC03IGxnOmNvbC04J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBidXR0b24tZ3JvdXAgZnVuY3Rpb24tdG9wYmFyIGN1c3RvbS10b29sYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCd0b29sYmFyJylcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiBtb2RlbC5zZWxlY3RlZEl0ZW1zLCBjcnVkTGlzdDogdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uQWRkOiBidXR0b25BZGQsIGJ1dHRvbkV4cG9ydDogYnV0dG9uRXhwb3J0LCBidXR0b25EZWxldGU6IGJ1dHRvbkRlbGV0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkJ1dHRvbnMgJiYgIWhhc1RlbXBsYXRlKCd0b29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC03IGxnOmNvbC04J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBidXR0b24tZ3JvdXAgZnVuY3Rpb24tdG9wYmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdidXR0b25CZWZvcmVUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGxhYmVsPVwixJDDoW5oIFNUVFwiIGNsYXNzPVwicC1idXR0b24tdGV4dFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhbmhTb1RodVR1R3JvdXBMYXN0ZXN0KClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGlkZGVuQWRkXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnV0dG9uQWRkXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2V0dGluZy5zaG93RXhwb3J0U2VsZWN0ZWRJdGVtc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ1dHRvbkV4cG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhpZGRlbkRlbGV0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ1dHRvbkRlbGV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXNldHRpbmcuZGlzYWJsZVNoYXJlICYmIG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDaGlhIHPhursgbGnDqm4ga+G6v3RcIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidDaGlhIHPhursgbGnDqm4ga+G6v3QnIHwgdHJhbnNsYXRlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mbyBsaW5rLW9yLWFjdGlvblwiIGljb249XCJwaSBwaS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY3JlYXRlU2hhcmVMaW5rTXVsdGlwbGUoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQWZ0ZXJUb29sYmFyJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y3J1ZExpc3Q6IHRoaXN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoXCIgY2xhc3M9XCJjb2wtMTIgYWR2YW5jZS1zZWFyY2gtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2V0dGluZy5oaWRkZW5CdXR0b25zID8gJ21kOmNvbC0xMiBsZzpjb2wtMTInIDogJ21kOmNvbC01IGxnOmNvbC00J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RBZHZhbmNlU2VhcmNoOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRTZXR0aW5nOiBzZXR0aW5nLCBzZWFyY2hJbmZvOiBzZWFyY2hJbmZvLCBsb2FkaW5nOiBtb2RlbC5sb2FkaW5nLCBvblNlYXJjaDogaGFuZGxlU2VhcmNoQWR2cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdDogaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2hcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxhZHZhbmNlLXNlYXJjaCAjYWR2YW5jZVNlYXJjaCBbcGFyZW50U2V0dGluZ109XCJzZXR0aW5nXCIgW3NlYXJjaEluZm9dPVwic2VhcmNoSW5mb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJtb2RlbC5sb2FkaW5nXCIgKG9uU2VhcmNoKT1cImhhbmRsZVNlYXJjaEFkdnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Jbml0KT1cImhhbmRsZUluaXRBZHZhbmNlU2VhcmNoKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hZHZhbmNlLXNlYXJjaD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJoYXNUZW1wbGF0ZSgndG9wR3JpZCcpXCIgY2xhc3M9XCJleHRlbmQtY29udGVudC10b3AtZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWxlY3RlZEl0ZW1zOiBtb2RlbC5zZWxlY3RlZEl0ZW1zLCBjcnVkTGlzdDogdGhpc31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgndG9wR3JpZCcpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItdGFibGUgZml0LWNvbnRlbnRcIiBbY2xhc3MuLS10YWJsZS1yZXNwb25zaXZlXT1cInJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLXRhYmxlLWlubmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhX2dyb3VwRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bi1jdXN0b20tc2Nyb2xsYmFyICpuZ0lmPVwic2hvd1Njcm9sbEJhclwiICNzY3JvbGxiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Njcm9sbEhvcml6b250YWxdPVwic2hvd1Njcm9sbEhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVHZXRHcm91cEZpZWxkRmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2FmdGVyQ3J1ZExpc3QnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdhZnRlckNydWRMaXN0JylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdG4tY3VzdG9tLXNjcm9sbGJhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd1Njcm9sbEJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZUdldEdyb3VwRmllbGRGYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX2dyb3VwRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bi1jdXN0b20tc2Nyb2xsYmFyICpuZ0lmPVwic2hvd1Njcm9sbEJhclwiICNzY3JvbGxiYXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1Njcm9sbEhvcml6b250YWxdPVwic2hvd1Njcm9sbEhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVHZXRHcm91cEZpZWxkVHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNUZW1wbGF0ZSgnYWZ0ZXJDcnVkTGlzdCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2FmdGVyQ3J1ZExpc3QnKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90bi1jdXN0b20tc2Nyb2xsYmFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93U2Nyb2xsQmFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlR2V0R3JvdXBGaWVsZFRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1ib3JkZXItbGluZSAtLXRvcFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9yZGVyLWxpbmUgLS1yaWdodFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9yZGVyLWxpbmUgLS1ib3R0b21cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvcmRlci1saW5lIC0tbGVmdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48YWZ0ZXItdmlldy1jaGVja2VkIChsb2FkZWQpPVwiaGFuZGxlUmVhZHkoKVwiPjwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG48bmctY29udGFpbmVyICpuZ0lmPVwiX3Nob3dTZXR0aW5ncyAmJiAhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RTZXR0aW5nOyBjb250ZXh0OiB7XHJcbiAgICAgICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBlbnRpdHlNZXRhZGF0YVNlcnZpY2UsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIHBhcmVudFNldHRpbmc6IHNldHRpbmcsXHJcbiAgICAgICAgcGFyZW50TW9kZWw6IG1vZGVsLCBvblNhdmVkOiBvblNhdmVTZXR0aW5ncywgb25DYW5jZWw6IGhhbmRsZUNhbmNlbFNldHRpbmdcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPHNldHRpbmdzIFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIlxyXG4gICAgICAgIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIChvblNhdmUpPVwib25TYXZlU2V0dGluZ3MoJGV2ZW50KVwiIChvbkNhbmNlbCk9XCJfc2hvd1NldHRpbmdzID0gZmFsc2VcIj5cclxuICAgIDwvc2V0dGluZ3M+IC0tPlxyXG48L25nLWNvbnRhaW5lcj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9zaG93U2V0dGluZ3NSb3dDb2xvciAmJiAhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RTZXR0aW5nUm93OyBjb250ZXh0OiB7XHJcbiAgICAgICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBlbnRpdHlNZXRhZGF0YVNlcnZpY2UsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIHBhcmVudFNldHRpbmc6IHNldHRpbmcsXHJcbiAgICAgICAgcGFyZW50TW9kZWw6IG1vZGVsLCBvblNhdmVkOiBvblNhdmVDb2xvclNldHRpbmdzLCBvbkNhbmNlbDogaGFuZGxlQ2FuY2VsU2V0dGluZ1Jvd1xyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPCEtLSA8c2V0dGluZ3Mtcm93IFtlbnRpdHlNZXRhZGF0YVNlcnZpY2VdPVwiZW50aXR5TWV0YWRhdGFTZXJ2aWNlXCIgW3BhcmVudENvbnRleHRdPVwiY29udGV4dFwiIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIlxyXG4gICAgICAgIFtwYXJlbnRNb2RlbF09XCJtb2RlbFwiIChvblNhdmUpPVwib25TYXZlQ29sb3JTZXR0aW5ncygkZXZlbnQpXCIgKG9uQ2FuY2VsKT1cIl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlXCI+XHJcbiAgICA8L3NldHRpbmdzLXJvdz4gLS0+XHJcbjwvbmctY29udGFpbmVyPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwid29ya2Zsb3dTZXR0aW5nTW9kZWwuc2hvd0VkaXRGb3JtXCIgW2hlYWRlcl09XCInQ+G6pXUgaMOsbmggcXV5IHRyw6xuaCBuZ2hp4buHcCB24bulJyB8IHRyYW5zbGF0ZVwiXHJcbiAgICBbcG9wdXBTaXplXT1cIndvcmtmbG93U2V0dGluZ01vZGVsLnBvcHVwU2l6ZVwiIChvbkhpZGUpPVwid29ya2Zsb3dTZXR0aW5nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjcnVkTGlzdFdvcmtmbG93U2V0dGluZzsgY29udGV4dDoge1xyXG4gICAgICAgIGRpYWxvZ01vZGVsOiB3b3JrZmxvd1NldHRpbmdNb2RlbCwgcGFyZW50U2V0dGluZzogc2V0dGluZywgb25TYXZlZDogb25TYXZlV29ya2Zsb3dTZXR0aW5nc1xyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIndvcmtmbG93U2V0dGluZ01vZGVsLmJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPCEtLSA8d29ya2Zsb3ctc2V0dGluZy1uZXcgI2Zvcm1CYXNlIFtwYXJlbnRTZXR0aW5nXT1cInNldHRpbmdcIiAob25TYXZlZCk9XCJvblNhdmVXb3JrZmxvd1NldHRpbmdzKCRldmVudClcIlxyXG4gICAgICAgIChvbkNhbmNlbCk9XCJ3b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPjwvd29ya2Zsb3ctc2V0dGluZy1uZXc+IC0tPlxyXG48L3RuLWRpYWxvZz5cclxuPGVudGl0eS1wZXJtaXNzaW9uICpuZ0lmPVwiX3Nob3dTZXR0aW5nc1Blcm1pc3Npb24gJiYgIXNldHRpbmcuaGlkZGVuU2V0dGluZ1Blcm1pc3Npb25cIiBbcGFyZW50U2V0dGluZ109XCJzZXR0aW5nXCJcclxuICAgIFtwYXJlbnRDb250ZXh0XT1cImNvbnRleHRcIiBbcGFyZW50TW9kZWxdPVwibW9kZWxcIiBbc2VhcmNoSW5mb109XCJzZWFyY2hJbmZvXCJcclxuICAgIChvbkNhbmNlbCk9XCJfc2hvd1NldHRpbmdzUGVybWlzc2lvbiA9IGZhbHNlXCI+XHJcbjwvZW50aXR5LXBlcm1pc3Npb24+XHJcbjxwLWNvbnRleHRNZW51ICNjb250ZXh0TWVudSBbYXBwZW5kVG9dPVwiJ2JvZHknXCIgW3N0eWxlQ2xhc3NdPVwiJ2FsbG93LXNlbGVjdGVkJ1wiIFttb2RlbF09XCJidXR0b25Db250ZXh0c1wiPlxyXG48L3AtY29udGV4dE1lbnU+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwicHJvY2Vzc1dvcmtmbG93TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicHJvY2Vzc1dvcmtmbG93TW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cInByb2Nlc3NXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBwYWRkaW5nOiAxcmVtXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNydWRMaXN0UHJvY2Vzc1dvcmtmbG93OyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogY3VycmVudEl0ZW0sIGRpYWxvZ01vZGVsOiBwcm9jZXNzV29ya2Zsb3dNb2RlbCwgb25TYXZlZDogaGFuZGxlUHJvY2Vzc2VkV29ya2Zsb3dCYXNlXHJcbiAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9vdGVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvY2Vzc1dvcmtmbG93TW9kZWwuYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwhLS0gPHByb2Nlc3Mtd29ya2Zsb3ctZm9ybSAjZm9ybUJhc2UgW2J1c2luZXNzU2V0dGluZ109XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLnNldHRpbmdcIiBbaXRlbV09XCJjdXJyZW50SXRlbVwiXHJcbiAgICAgICAgICAgIFt3b3JrZmxvd109XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLndvcmtmbG93XCIgW2FjdGlvbl09XCJwcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLmFjdGlvblwiXHJcbiAgICAgICAgICAgIChvblNhdmVkKT1cImhhbmRsZVByb2Nlc3NlZFdvcmtmbG93QmFzZSgpXCIgKG9uQ2FuY2VsKT1cInByb2Nlc3NXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC9wcm9jZXNzLXdvcmtmbG93LWZvcm0+IC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiY2hvWUtpZW5Nb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwiY2hvWUtpZW5Nb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJjaG9ZS2llbk1vZGVsLnBvcHVwU2l6ZVwiIFtzY3JvbGxCYXJTdHlsZUNsYXNzXT1cIidmaXQtY29udGVudCdcIlxyXG4gICAgKG9uSGlkZSk9XCJjaG9ZS2llbk1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNydWRMaXN0Q2hvWUtpZW47IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgZGlhbG9nTW9kZWw6IGNob1lLaWVuTW9kZWxcclxuICAgICAgICB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaG9ZS2llbk1vZGVsLmJ1dHRvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8IS0tIDxjaG8teS1raWVuLWZvcm0gI2Zvcm1CYXNlIFtidXNzaW5lc3NTZXR0aW5nXT1cImNob1lLaWVuTW9kZWwuZGF0YS5zZXR0aW5nXCJcclxuICAgICAgICAgICAgW3Jvd0l0ZW1dPVwiY2hvWUtpZW5Nb2RlbC5kYXRhLnJvd0RhdGFcIiAob25TYXZlZCk9XCJjaG9ZS2llbk1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCJcclxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cImNob1lLaWVuTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgICAgICA8L2Noby15LWtpZW4tZm9ybT4gLS0+XHJcbiAgICA8L2Rpdj5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJ3b3JrZmxvd0hpc3RvcnlNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwid29ya2Zsb3dIaXN0b3J5TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwid29ya2Zsb3dIaXN0b3J5TW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNydWRMaXN0V29ya2Zsb3dTZXR0aW5nOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogY3VycmVudEl0ZW0sIGRpYWxvZ01vZGVsOiB3b3JrZmxvd0hpc3RvcnlNb2RlbFxyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDx3b3JrZmxvdy1oaXN0b3J5LW5ldyAjZm9ybUJhc2UgW2J1c2luZXNzU2V0dGluZ109XCJ3b3JrZmxvd0hpc3RvcnlNb2RlbC5kYXRhLnNldHRpbmdcIlxyXG4gICAgICAgICAgICBbdGFibGVOYW1lXT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLmRhdGEudGFibGVOYW1lXCIgW2l0ZW1dPVwiY3VycmVudEl0ZW1cIlxyXG4gICAgICAgICAgICBbd29ya2Zsb3dTZXR0aW5nXT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLmRhdGEud29ya2Zsb3dTZXR0aW5nXCJcclxuICAgICAgICAgICAgKG9uQ2FuY2VsKT1cIndvcmtmbG93SGlzdG9yeU1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC93b3JrZmxvdy1oaXN0b3J5LW5ldz4gLS0+XHJcbiAgICA8L2Rpdj5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJkZXRhaWxUYXNrTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cImRldGFpbFRhc2tNb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJkZXRhaWxUYXNrTW9kZWwucG9wdXBTaXplXCIgW3Njcm9sbEJhclN0eWxlQ2xhc3NdPVwiJ2ZpdC1jb250ZW50J1wiXHJcbiAgICAob25IaWRlKT1cImRldGFpbFRhc2tNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNydWRMaXN0Rm9ybUNvbmdWaWVjOyBjb250ZXh0OiB7XHJcbiAgICAgICAgZGlhbG9nTW9kZWw6IGRldGFpbFRhc2tNb2RlbCwgaXNGb3JtVmlldzogdHJ1ZVxyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRldGFpbFRhc2tNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS0gPGJhc2UtY29uZ3ZpZWMtZm9ybSAjZm9ybUJhc2UgW21vZGVsXT1cImRldGFpbFRhc2tNb2RlbC5kYXRhLnRhc2tGb3JtTW9kZWxcIiBbZm9yY2VPbmx5Vmlld109XCJ0cnVlXCJcclxuICAgICAgICAob25DYW5jZWwpPVwiZGV0YWlsVGFza01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L2Jhc2UtY29uZ3ZpZWMtZm9ybT4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInBlcm1pc3Npb25TaGFyaW5nTW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInBlcm1pc3Npb25TaGFyaW5nTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCJcclxuICAgIChvbkhpZGUpPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjcnVkTGlzdFBlcm1pc3Npb25TaGFyaW5nOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICRpbXBsaWNpdDogcm93RGF0YUN1cnJlbnQsIGRpYWxvZ01vZGVsOiBwZXJtaXNzaW9uU2hhcmluZ01vZGVsLCBiYXNlU2VydmljZTogc2V0dGluZy5iYXNlU2VydmljZVxyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDxwZXJtaXNzaW9uLXNoYXJpbmcgI2Zvcm1CYXNlIFtpdGVtXT1cInJvd0RhdGFDdXJyZW50XCIgW2Jhc2VTZXJ2aWNlXT1cInNldHRpbmcuYmFzZVNlcnZpY2VcIlxyXG4gICAgICAgICAgICAob25DYW5jZWwpPVwicGVybWlzc2lvblNoYXJpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZVwiPlxyXG4gICAgICAgIDwvcGVybWlzc2lvbi1zaGFyaW5nPiAtLT5cclxuICAgIDwvZGl2PlxyXG48L3RuLWRpYWxvZz5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInBlcm1pc3Npb25MaXN0TW9kZWwuc2hvd0VkaXRGb3JtXCIgI2RpYWxvZyBbaGVhZGVyXT1cInBlcm1pc3Npb25MaXN0TW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCJcclxuICAgIFtwb3B1cFNpemVdPVwicGVybWlzc2lvbkxpc3RNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCIgW3VzZURlZmF1bHRTY3JvbGxCYXJdPVwidHJ1ZVwiXHJcbiAgICAob25IaWRlKT1cInBlcm1pc3Npb25MaXN0TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMCVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RXb3JrZmxvd1Blcm1pc3Npb247IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiByb3dEYXRhQ3VycmVudCwgZGlhbG9nTW9kZWw6IHBlcm1pc3Npb25MaXN0TW9kZWwsIGJ1c2luZXNzU2V0dGluZzogc2V0dGluZ1xyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8IS0tIDx3b3JrZmxvdy1wZXJtaXNzaW9uICNmb3JtQmFzZSBbaXRlbV09XCJyb3dEYXRhQ3VycmVudFwiIFtidXNpbmVzc1NldHRpbmddPVwic2V0dGluZ1wiXHJcbiAgICAgICAgICAgIChvbkNhbmNlbCk9XCJwZXJtaXNzaW9uTGlzdE1vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICAgICAgPC93b3JrZmxvdy1wZXJtaXNzaW9uPiAtLT5cclxuICAgIDwvZGl2PlxyXG48L3RuLWRpYWxvZz5cclxuPHRuLWRpYWxvZyAqbmdJZj1cInN0YXJ0V29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtoZWFkZXJdPVwic3RhcnRXb3JrZmxvd01vZGVsLmhlYWRlciB8IHRyYW5zbGF0ZVwiXHJcbiAgICBbcG9wdXBTaXplXT1cInN0YXJ0V29ya2Zsb3dNb2RlbC5wb3B1cFNpemVcIiBbc2Nyb2xsQmFyU3R5bGVDbGFzc109XCInZml0LWNvbnRlbnQnXCJcclxuICAgIChvbkhpZGUpPVwic3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNydWRMaXN0U3RhcnRXb3JrZmxvdzsgY29udGV4dDoge1xyXG4gICAgICAgICAgICBkaWFsb2dNb2RlbDogc3RhcnRXb3JrZmxvd01vZGVsLCBvblNhdmVkOiBoYW5kbGVTdGFydFdvcmtmbG93RnJvbURpYWxvZ1xyXG4gICAgICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Zvb3Rlcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXJ0V29ya2Zsb3dNb2RlbC5idXR0b25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPCEtLSA8c3RhcnQtd29ya2Zsb3cgI2Zvcm1CYXNlIFt3b3JrZmxvd3NdPVwic3RhcnRXb3JrZmxvd01vZGVsLmRhdGEud29ya2Zsb3dzXCJcclxuICAgICAgICAgICAgW2RlZmF1bHRXb3JrZmxvd109XCJzdGFydFdvcmtmbG93TW9kZWwuZGF0YS5kZWZhdWx0V29ya2Zsb3dcIlxyXG4gICAgICAgICAgICAob25DYW5jZWwpPVwic3RhcnRXb3JrZmxvd01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCIgKG9uU2F2ZWQpPVwiaGFuZGxlU3RhcnRXb3JrZmxvd0Zyb21EaWFsb2coJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvc3RhcnQtd29ya2Zsb3c+IC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiY29uZ1ZpZWNNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtzdHlsZUNsYXNzXT1cIidjb25ndmllYy1mb3JtIHRuLWZvcm0tZGlhbG9nJ1wiXHJcbiAgICBbaGVhZGVyXT1cImNvbmdWaWVjTW9kZWwuaGVhZGVyIHwgdHJhbnNsYXRlXCIgW3BvcHVwU2l6ZV09XCJjb25nVmllY01vZGVsLnBvcHVwU2l6ZVwiXHJcbiAgICAob25IaWRlKT1cImNvbmdWaWVjTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjcnVkTGlzdEZvcm1Db25nVmllYzsgY29udGV4dDoge1xyXG4gICAgICAgIGRpYWxvZ01vZGVsOiBjb25nVmllY01vZGVsLCBnZXREYXRhOiBnZXREYXRhLCBpc0Zvcm1WaWV3OiBmYWxzZVxyXG4gICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLXRlbXBsYXRlICNmb290ZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbmdWaWVjTW9kZWwuYnV0dG9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8IS0tIDxiYXNlLWNvbmd2aWVjLWZvcm0gI2Zvcm1CYXNlIFtwYXJlbnRTZXR0aW5nXT1cImNvbmdWaWVjTW9kZWwuZGF0YS5jb25nVmllY1NldHRpbmdcIlxyXG4gICAgICAgIFttb2RlbF09XCJjb25nVmllY01vZGVsLmRhdGEubW9kZWxcIiAob25TYXZlZCk9XCJjb25nVmllY01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlO2dldERhdGEoKVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cImNvbmdWaWVjTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDwvYmFzZS1jb25ndmllYy1mb3JtPiAtLT5cclxuPC90bi1kaWFsb2c+XHJcbjx0bi1kaWFsb2cgKm5nSWY9XCJzaGFyZUxpbmtNb2RlbC5zaG93RWRpdEZvcm1cIiAjZGlhbG9nIFtzdHlsZUNsYXNzXT1cIidjb25ndmllYy1mb3JtIHRuLWZvcm0tZGlhbG9nJ1wiXHJcbiAgICBbaGVhZGVyXT1cInNoYXJlTGlua01vZGVsLmhlYWRlciB8IHRyYW5zbGF0ZVwiIFtwb3B1cFNpemVdPVwic2hhcmVMaW5rTW9kZWwucG9wdXBTaXplXCIgW3VzZURlZmF1bHRTY3JvbGxCYXJdPVwidHJ1ZVwiXHJcbiAgICAob25IaWRlKT1cInNoYXJlTGlua01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RTaGFyZUxpbmtCeVBlcm1pc3Npb247IGNvbnRleHQ6IHtcclxuICAgICAgICBkaWFsb2dNb2RlbDogc2hhcmVMaW5rTW9kZWwsIHNldHRpbmc6IHNldHRpbmdcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPHNoYXJlLWxpbmstYnktcGVybWlzc2lvbiAjZm9ybUJhc2UgW3NldHRpbmddPVwic2V0dGluZ1wiIFtsc3RJdGVtXT1cInNoYXJlTGlua01vZGVsLmRhdGEubHN0SXRlbVwiXHJcbiAgICAgICAgKG9uQ2FuY2VsKT1cInNoYXJlTGlua01vZGVsLnNob3dFZGl0Rm9ybSA9IGZhbHNlXCI+XHJcbiAgICA8L3NoYXJlLWxpbmstYnktcGVybWlzc2lvbj4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48dG4tZGlhbG9nICpuZ0lmPVwiYXR0YWNoZWRUYXNrTW9kZWwuc2hvd0VkaXRGb3JtXCIgW2hlYWRlcl09XCJhdHRhY2hlZFRhc2tNb2RlbC5oZWFkZXIgfCB0cmFuc2xhdGVcIlxyXG4gICAgW3BvcHVwU2l6ZV09XCJhdHRhY2hlZFRhc2tNb2RlbC5wb3B1cFNpemVcIiBbdXNlRGVmYXVsdFNjcm9sbEJhcl09XCJ0cnVlXCJcclxuICAgIChvbkhpZGUpPVwiYXR0YWNoZWRUYXNrTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2VcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjcnVkTGlzdENvbmdWaWVjOyBjb250ZXh0OiB7XHJcbiAgICAgICAgYmFzZVNlcnZpY2U6IHNldHRpbmcuYmFzZVNlcnZpY2UsIGl0ZW1JZEF0dGFjaDogcm93RGF0YUN1cnJlbnQuaWRcclxuICAgIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwhLS0gPGJhc2UtY29uZ3ZpZWMgW3NlcnZpY2VDb2RlXT1cInNldHRpbmcuYmFzZVNlcnZpY2Uuc2VydmljZUNvZGVcIiBbZW50aXR5XT1cInNldHRpbmcuYmFzZVNlcnZpY2UuZW50aXR5TmFtZVwiXHJcbiAgICAgICAgW2l0ZW1JZEF0dGFjaF09XCJyb3dEYXRhQ3VycmVudC5pZFwiPjwvYmFzZS1jb25ndmllYz4gLS0+XHJcbjwvdG4tZGlhbG9nPlxyXG48bmctdGVtcGxhdGUgI3RhYmxlR2V0R3JvdXBGaWVsZEZhbHNlPlxyXG4gICAgPHAtdGFibGUgI3RhYmxlIFtkYXRhS2V5XT1cIidpZCdcIiBbc2Nyb2xsYWJsZV09XCJwVGFibGVTY3JvbGxhYmxlXCIgW3Njcm9sbEhlaWdodF09XCJwVGFibGVTY3JvbGxIZWlnaHRcIlxyXG4gICAgICAgIFtjb2x1bW5zXT1cInNldHRpbmcuY29sc1wiIFtwYWdpbmF0b3JdPVwiZmFsc2VcIiBbdmFsdWVdPVwiX2RhdGFTb3VyY2VcIiAob25Tb3J0KT1cIm9uU29ydCgkZXZlbnQsIHRhYmxlKVwiXHJcbiAgICAgICAgW2NsYXNzXT1cIl90YWJsZUNsYXNzXCIgW3Jlc3BvbnNpdmVdPVwicmVzcG9uc2l2ZVwiIFtsYXp5XT1cImxhenlcIiBbbG9hZGluZ109XCJtb2RlbC5sb2FkaW5nXCJcclxuICAgICAgICBbKHNlbGVjdGlvbildPVwibW9kZWwuc2VsZWN0ZWRJdGVtc1wiIChvblJvd1Jlb3JkZXIpPVwiaGFuZGxlUm93T3JkZXJlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2NvbGdyb3VwJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFzZUNvbGdyb3VwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdoZWFkZXInKSwgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1ucywgY3J1ZExpc3Q6IHRoaXMsIHJvd0hlYWRlckZpbHRlcjogcm93SGVhZGVyRmlsdGVyLCBjb250ZW50VGg6IGNvbnRlbnRUaCwgY29udGFpbmVyU3RpY2t5OiBjb250YWluZXJTdGlja3ksIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGx9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJIZWFkZXI7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnMsIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGx9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJyb3dJbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJCb2R5OyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCBjb2x1bW5zOiBjb2x1bW5zLCBpbmRleDogaW5kZXgsIGV4cGFuZGVkOiBleHBhbmRlZCwgZXZlbnRTZWxlY3RSb3c6IGhhbmRsZVNlbGVjdFJvdywgZXZlbnRDaGVja2VkOiBoYW5kbGVDaGVja1Jvd0RhdGF9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkICpuZ0lmPVwiaW5kZXggPT0gX2RhdGFTb3VyY2UubGVuZ3RoIC0gMVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBbcmVuZGVyS2V5XT1cIl9kYXRhU291cmNlXCJcclxuICAgICAgICAgICAgICAgIChsb2FkZWQpPVwiaGFuZGxlVGFibGVSZW5kZXJlZCgpXCI+XHJcbiAgICAgICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LXJvd0RhdGEgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgncm93RXhwYW5zaW9uJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIGV4cGFuZGVkOiBleHBhbmRlZCwgZ2V0Q29sU3Bhbkdyb3VwOiBnZXRDb2xTcGFuR3JvdXB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3N1bW1hcnknKVwiIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdzdW1tYXJ5JylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdmb290ZXInKVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2Zvb3RlcicpOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3AtdGFibGU+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjdGFibGVHZXRHcm91cEZpZWxkVHJ1ZT5cclxuICAgIDxwLXRhYmxlICN0YWJsZUdyb3VwIFtzY3JvbGxhYmxlXT1cInBUYWJsZVNjcm9sbGFibGVcIiBbc2Nyb2xsSGVpZ2h0XT1cInBUYWJsZVNjcm9sbEhlaWdodFwiIFtjb2x1bW5zXT1cInNldHRpbmcuY29sc1wiXHJcbiAgICAgICAgW3BhZ2luYXRvcl09XCJmYWxzZVwiIFt2YWx1ZV09XCJfZGF0YVNvdXJjZVwiIFttZXRhS2V5U2VsZWN0aW9uXT1cImZhbHNlXCIgKG9uU29ydCk9XCJvblNvcnQoJGV2ZW50LCB0YWJsZUdyb3VwKVwiXHJcbiAgICAgICAgW2NsYXNzXT1cIl90YWJsZUNsYXNzXCIgW2N1c3RvbVNvcnRdPVwidHJ1ZVwiIFtyZXNwb25zaXZlXT1cInJlc3BvbnNpdmVcIiBbbGF6eV09XCJ0cnVlXCIgW2xvYWRpbmddPVwibW9kZWwubG9hZGluZ1wiXHJcbiAgICAgICAgWyhzZWxlY3Rpb24pXT1cIm1vZGVsLnNlbGVjdGVkSXRlbXNcIiBbZXhwYW5kZWRSb3dLZXlzXT1cIm1vZGVsLmV4cGFuZGVkUm93S2V5c1wiIFtkYXRhS2V5XT1cIl9ncm91cEZpZWxkXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoJ2NvbGdyb3VwJyk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnN9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbGdyb3VwJylcIiBwVGVtcGxhdGU9XCJjb2xncm91cFwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFzZUNvbGdyb3VwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdoZWFkZXInKSwgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1ucywgY3J1ZExpc3Q6IHRoaXMsIHJvd0hlYWRlckZpbHRlcjogcm93SGVhZGVyRmlsdGVyLCBjb250ZW50VGg6IGNvbnRlbnRUaCwgY29udGFpbmVyU3RpY2t5OiBjb250YWluZXJTdGlja3ksIGZ1bmNDaGVja0FsbDogaGFuZGxlQ2hlY2tBbGxfR3JvdXB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXInKVwiIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRySGVhZGVyOyBjb250ZXh0OiB7JGltcGxpY2l0OiBjb2x1bW5zLCBmdW5jQ2hlY2tBbGw6IGhhbmRsZUNoZWNrQWxsX0dyb3VwfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiXHJcbiAgICAgICAgICAgIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJyb3dHcm91cE1ldGFkYXRhW3Jvd0RhdGFbX2dyb3VwRmllbGRdXSAmJiByb3dHcm91cE1ldGFkYXRhW3Jvd0RhdGFbX2dyb3VwRmllbGRdXS5pbmRleCA9PSByb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtd2lkZ2V0LWhlYWRlciBncm91cC1yb3dcIiBzdHlsZT1cImJvcmRlcjogMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZVwiPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuQ2hlY2tib3hcIiBjbGFzcz1cImNlbnRlciBjaGtib3hcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJyb3dHcm91cENoZWNrZWRbcm93RGF0YVtfZ3JvdXBGaWVsZF1dXCIgYmluYXJ5PVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJoYW5kbGVDaGVja1Jvd0dyb3VwKHJvd0RhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdyb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIFtjb2xTcGFuXT1cImdldENvbFNwYW5Hcm91cCgpXCIgW2NsYXNzXT1cIl9jbGFzc1Jvd0dyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItcm93LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgW3BSb3dUb2dnbGVyXT1cInJvd0RhdGFcIiBjbGFzcz1cImNvbnRhaW5lci1yb3ctZ3JvdXAtdG9nZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZXhwYW5kZWQgPyAnZmFzIGZhLWZ3IGZhLWNhcmV0LWRvd24nIDogJ2ZhcyBmYS1mdyBmYS1jYXJldC1yaWdodCdcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtcm93LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2NvbnRlbnRSb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9jb250ZW50Um93R3JvdXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjb250ZW50Um93R3JvdXAnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnY29udGVudFJvd0dyb3VwJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdyb3dHcm91cCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgncm93R3JvdXAnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDb250ZXh0Um93R3JvdXBSb290KHJvd0RhdGEsIGV4cGFuZGVkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicm93ZXhwYW5zaW9uXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LXJvd0RhdGEgbGV0LWluZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ckJvZHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHJvd0RhdGEsIGNvbHVtbnM6IGNvbHVtbnMsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGZhbHNlLCBldmVudFNlbGVjdFJvdzogaGFuZGxlU2VsZWN0Um93R3JvdXAsIGV2ZW50Q2hlY2tlZDogaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwfVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCAqbmdJZj1cImluZGV4ID09IF9kYXRhU291cmNlLmxlbmd0aCAtIDFcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgW3JlbmRlcktleV09XCJfZGF0YVNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAobG9hZGVkKT1cImhhbmRsZVRhYmxlUmVuZGVyZWQoKVwiPlxyXG4gICAgICAgICAgICA8L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImhhc1RlbXBsYXRlKCdzdW1tYXJ5JylcIiBwVGVtcGxhdGU9XCJzdW1tYXJ5XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZSgnc3VtbWFyeScpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJoYXNUZW1wbGF0ZSgnZm9vdGVyJylcIiBwVGVtcGxhdGU9XCJmb290ZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKCdmb290ZXInKTsgY29udGV4dDogeyRpbXBsaWNpdDogY29sdW1uc31cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG4gICAgPGFmdGVyLXZpZXctY2hlY2tlZD48L2FmdGVyLXZpZXctY2hlY2tlZD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNiYXNlQ29sZ3JvdXAgbGV0LWNvbHVtbnM+XHJcbiAgICA8Y29sZ3JvdXA+XHJcbiAgICAgICAgPGNvbCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkNoZWNrYm94XCIgW3N0eWxlLndpZHRoXT1cIndpZHRoQ2hlY2tib3hcIiAvPlxyXG4gICAgICAgIDxjb2wgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIFtzdHlsZS53aWR0aF09XCJ3aWR0aE9yZGVyQ29sdW1uXCIgLz5cclxuICAgICAgICA8Y29sICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgc3R5bGU9XCJ3aWR0aDogMi41cmVtXCIgLz5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8Y29sICpuZ0lmPVwiY29sICYmIGNvbC52aXNpYmxlICYmIGNvbC5maWVsZCE9J2Z1bmN0aW9uJ1wiIFtzdHlsZS53aWR0aF09XCJjb2wud2lkdGhcIiAvPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxjb2wgKm5nSWY9XCJlbmFibGVSZW9yZGVyUm93XCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiIC8+XHJcbiAgICAgICAgPGNvbCAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCIgW3N0eWxlLndpZHRoXT1cIndpZHRoRnVuY3Rpb25Db2x1bW4gfHwgX3dpZHRoRnVuY3Rpb25Db2x1bW5cIiAvPlxyXG4gICAgPC9jb2xncm91cD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNidXR0b25BZGQ+XHJcbiAgICA8c3BhbiBbYXBwQXV0aG9yaXplXT1cInNlcnZpY2VDb2RlXCIgW3Blcm1pc3Npb25dPVwiYXV0aG9yaXplUGF0aHNbY29tbW9uQ29uc3QuQUREXVwiXHJcbiAgICAgICAgW2VuYWJsZUF1dGhvcml6ZV09XCJidXR0b25BcHBseUF1dGhvcml6ZVtjb21tb25Db25zdC5BRERdXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGxhYmVsPVwiVGjDqm0gbeG7m2lcIiBpY29uPVwicGkgcGktcGx1c1wiIGNsYXNzPVwicC1idXR0b24tdGV4dFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbW9kZWwuYmFzZVJlYWR5XCIgKGNsaWNrKT1cImFkZCgpXCI+PC9idXR0b24+XHJcbiAgICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjYnV0dG9uRXhwb3J0PlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cIm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIlxyXG4gICAgICAgIFtwZXJtaXNzaW9uXT1cImF1dGhvcml6ZVBhdGhzW2NvbW1vbkNvbnN0LkVYUE9SVF9FWENFTF1cIlxyXG4gICAgICAgIFtlbmFibGVBdXRob3JpemVdPVwiYnV0dG9uQXBwbHlBdXRob3JpemVbY29tbW9uQ29uc3QuRVhQT1JUX0VYQ0VMXVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGVcclxuICAgICAgICBsYWJlbD1cIlh14bqldCBjw6FjIG3hu6VjIMSRw6MgY2jhu41uICh7e21vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RofX0pXCIgaWNvbj1cImZhcyBmYS1maWxlLWV4Y2VsXCJcclxuICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2Vzc1wiIChjbGljayk9XCJ4dWF0Q2FjTXVjRGFDaG9uKClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNidXR0b25EZWxldGU+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIWhpZGRlbkRlbGV0ZSAmJiBtb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDAgJiYgIWRpc2FibGVNdWx0aXBsZURlbGV0ZSgpXCJcclxuICAgICAgICBbYXBwQXV0aG9yaXplXT1cInNlcnZpY2VDb2RlXCIgW3Blcm1pc3Npb25dPVwiYXV0aG9yaXplUGF0aHNbY29tbW9uQ29uc3QuREVMRVRFX01VTFRJUExFXVwiXHJcbiAgICAgICAgW2VuYWJsZUF1dGhvcml6ZV09XCJidXR0b25BcHBseUF1dGhvcml6ZVtjb21tb25Db25zdC5ERUxFVEVfTVVMVElQTEVdXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZVxyXG4gICAgICAgIFtsYWJlbF09XCInWMOzYSAnICsgKG1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoKSB8IHRyYW5zbGF0ZVwiIGljb249XCJwaSBwaS10cmFzaFwiXHJcbiAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlclwiIChjbGljayk9XCJkZWxldGVNdXRpcGxlKClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICN0ckhlYWRlciBsZXQtY29sdW1ucyBsZXQtZnVuY0NoZWNrQWxsPVwiZnVuY0NoZWNrQWxsXCI+XHJcbiAgICA8dHIgY2xhc3M9XCJ0aXRsZS1yb3dcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiY2hrYm94IGxpbmstb3ItYWN0aW9uIGNlbGwtY2hlY2tib3hcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWhhc1RlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktcmVmcmVzaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgYnRuUmVsb2FkXCIgcFRvb2x0aXA9XCJMw6BtIG3hu5tpIGThu68gbGnhu4d1XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kZWwubG9hZGluZ1wiIChjbGljayk9XCJyZWxvYWQoKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NydWRMaXN0OiB0aGlzfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdldFRlbXBsYXRlKCdoZWFkZXJDaGVja2JveCcpXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtblwiIGNsYXNzPVwic3R0IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAoZGJsY2xpY2spPVwicmVsb2FkKClcIj5cclxuICAgICAgICAgICAge3sgJ1RUJyB8dHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpXCIgY2xhc3M9XCJub3BhZCByb3ctZXhwYW5zaW9uLXRvZ2dsZSBjZW50ZXJcIiBzdHlsZT1cIndpZHRoOiAyLjVyZW1cIlxyXG4gICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdJZj1cImNvbCAmJiBjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQhPSdmdW5jdGlvbidcIiBbbmdTdHlsZV09XCJjb2wuZXh0ZW5kRGF0YS5oZWFkZXJTdHlsZVwiXHJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwidW5zZXQtd2lkdGhcIiBbY2xhc3NdPVwiY29sLmV4dGVuZERhdGEuaGVhZGVyQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW3RuU29ydGFibGVDb2x1bW5dPVwiY29sLmZpZWxkXCIgW2hvc3RSZWZdPVwidGhpc1wiIFt0blNvcnRhYmxlQ29sdW1uRGlzYWJsZWRdPVwiIWNvbC5zb3J0XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5maXJzdC10aF09XCJpPT0wXCIgW2VzY2FwZV09XCJmYWxzZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUaDsgY29udGV4dDogeyRpbXBsaWNpdDogY29sfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5zb3J0IHx8IGNvbC5zb3J0Q2xpZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRJY29uOyBjb250ZXh0OiB7ZmllbGQ6IGNvbC5maWVsZH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cImVuYWJsZVJlb3JkZXJSb3dcIiBzdHlsZT1cIndpZHRoOiAzMHB4XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb2xGdW5jdGlvbkhlYWRlclwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC90cj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dIZWFkZXJGaWx0ZXI7IGNvbnRleHQ6IHtjb2x1bW5zOiBjb2x1bW5zLCBmdW5jQ2hlY2tBbGw6IGZ1bmNDaGVja0FsbH1cIj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3Jvd0hlYWRlckZpbHRlciBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtZnVuY0NoZWNrQWxsPVwiZnVuY0NoZWNrQWxsXCI+XHJcbiAgICA8dHIgY2xhc3M9XCJmaWx0ZXItcm93XCIgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GaWx0ZXJSb3dcIj5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5DaGVja2JveFwiIGNsYXNzPVwiY2hrYm94IG5vcGFkIGNlbnRlclwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICBbY2xhc3MudHJpY2hlY2tib3gtY3VzdG9tLWZhbHNlXT1cImNoZWNrZWRBbGwgPT09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDxwLXRyaVN0YXRlQ2hlY2tib3ggWyhuZ01vZGVsKV09XCJjaGVja2VkQWxsXCIgYmluYXJ5PVwidHJ1ZVwiIChvbkNoYW5nZSk9XCJmdW5jQ2hlY2tBbGwoKVwiPlxyXG4gICAgICAgICAgICA8L3AtdHJpU3RhdGVDaGVja2JveD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW5cIiBjbGFzcz1cInN0dCBjZW50ZXIgdi10b3BcIiBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCIgY2xhc3M9XCJwaWNrLWNvbG9yLXJvd1wiIHBUb29sdGlwPVwiQ+G6pXUgaMOsbmggaGnhu4NuIHRo4buLIG3DoHVcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNob3dTZXR0aW5nUm93Q29sb3IoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0aCAqbmdJZj1cImhhc1RlbXBsYXRlKCdyb3dFeHBhbnNpb24nKVwiIGNsYXNzPVwibm9wYWQgY2VudGVyIHJvdy1leHBhbnNpb24tdG9nZ2xlXCJcclxuICAgICAgICAgICAgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8dGggKm5nSWY9XCJjb2wudmlzaWJsZSAmJiBjb2wuZmllbGQgIT0gJ2Z1bmN0aW9uJ1wiIGNsYXNzPVwiY2VsbC1oZWFkZXItZmlsdGVyIGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5hbGxvd0ZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudGVtcGxhdGVGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wudGVtcGxhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbCwgZmlsdGVyRGF0YTogZmlsdGVyRGF0YSwgb25TZWFyY2g6IG9uU2VhcmNoLCBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsOiBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsLCBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsOiBvbkhpZGVGaWx0ZXJEcm9wZG93blBhbmVsfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbC50ZW1wbGF0ZUZpbHRlclwiIFtuZ1N3aXRjaF09XCJjb2wuY29udHJvbFR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbC5yYXdDb2x1bW59XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sLmRhdGFUeXBlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ludCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ludFdpdGhvdXRNYXNrJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlck51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2NvbDogY29sfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRldGltZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWx0ZXJEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7Y29sOiBjb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlckJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlclRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntjb2w6IGNvbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGggKm5nSWY9XCJlbmFibGVSZW9yZGVyUm93XCIgc3R5bGU9XCJ3aWR0aDogMzBweFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtblwiIGNsYXNzPVwiY2VudGVyIHNldHRpbmctY2VsbCBjb2x1bW4tZnVuY3Rpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3Muc3RpY2t5XT1cInNldHRpbmcuc3RpY2t5Q29sdW1uXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nXCIgdHlwZT1cImJ1dHRvblwiIHBCdXR0b24gcFJpcHBsZSBpY29uPVwicGkgcGktY29nXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCIgcFRvb2x0aXA9XCJD4bqldSBow6xuaCBoaeG7g24gdGjhu4tcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTZXR0aW5ncygpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5TZXR0aW5nUGVybWlzc2lvblwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXVzZXJzXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCIgcFRvb2x0aXA9XCJQaMOibiBxdXnhu4FuIGThu68gbGnhu4d1XCIgdG9vbHRpcFBvc2l0aW9uPVwibGVmdFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNoZWNrUGVybWlzc2lvblRvVXNlQnV0dG9uKEJVVFRPTl9QSEFOX1FVWUVOKVwiIChjbGljayk9XCJzaG93U2V0dGluZ3NQZXJtaXNzaW9uKClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlblNldHRpbmdXb3JrZmxvd1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLXNpdGVtYXBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIiBwVG9vbHRpcD1cIkPhuqV1IGjDrG5oIHF1eSB0csOsbmhcIiB0b29sdGlwUG9zaXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2hlY2tQZXJtaXNzaW9uVG9Vc2VCdXR0b24oQlVUVE9OX0NBVV9ISU5IX1FVWV9UUklOSClcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTZXR0aW5nc1dvcmtmbG93TmV3KClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICA8L3RyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbEZ1bmN0aW9uSGVhZGVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uXCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwiY29sdW1uLWZ1bmN0aW9uXCIgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VsbC1oZWFkZXItZnVuY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7J0dSSUQuRlVOQ1RJT04nfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RoPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGVudFRoIGxldC1jb2w+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVtcGxhdGVIZWFkZXJDb250ZW50W2NvbC5maWVsZF1cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVIZWFkZXJDb250ZW50W2NvbC5maWVsZF1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0ZW1wbGF0ZUhlYWRlckNvbnRlbnRbY29sLmZpZWxkXVwiPlxyXG4gICAgICAgIHt7Y29sLmxhYmVsfX1cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3RyQm9keSBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCJcclxuICAgIGxldC1ldmVudFNlbGVjdFJvdz1cImV2ZW50U2VsZWN0Um93XCIgbGV0LWV2ZW50Q2hlY2tlZD1cImV2ZW50Q2hlY2tlZFwiPlxyXG4gICAgPHRyICpuZ0lmPVwiIXJvd0RhdGEudGVtcGxhdGVcIiBbdG5SZW9yZGVyYWJsZVJvd109XCJpbmRleFwiIFtob3N0UmVmXT1cInRoaXNcIiBbYXR0ci5yb3dJbmRleF09XCJpbmRleFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwicm93RGF0YS5vYmpTdHlsZUNsYXNzXCIgW2NsYXNzLnVpLXN0YXRlLWhpZ2hsaWdodF09XCJyb3dEYXRhLl9jaGVja2VkXCIgW3BUb29sdGlwXT1cInJvd0RhdGEudG9vbHRpcFwiXHJcbiAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgW3Rvb2x0aXBTdHlsZUNsYXNzXT1cInJvd0RhdGEudG9vbHRpcENsYXNzXCIgW2VzY2FwZV09XCJlc2NhcGVcIlxyXG4gICAgICAgIChjbGljayk9XCJldmVudFNlbGVjdFJvdygkZXZlbnQsIHJvd0RhdGEpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZXR0aW5nLmhpZGRlbkNoZWNrYm94ICYmICFyb3dEYXRhLmhpZGRlbltmaWVsZENoZWNrYm94XVwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJjaGtib3ggbGluay1vci1hY3Rpb24gY2VsbC1jaGVja2JveFwiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkQ2hlY2tib3hdXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLnJvd1NwYW5dPVwicm93RGF0YS5yb3dTcGFuICYmIHJvd0RhdGEucm93U3BhbltmaWVsZENoZWNrYm94XVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb3dEYXRhLmhpZGRlbkNoZWNrQm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNUZW1wbGF0ZSgnY2hlY2tib3gnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jaGVja2JveCBbKG5nTW9kZWwpXT1cInJvd0RhdGEuX2NoZWNrZWRcIiBiaW5hcnk9XCJ0cnVlXCIgKG9uQ2hhbmdlKT1cImV2ZW50Q2hlY2tlZChyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1RlbXBsYXRlKCdjaGVja2JveCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2NoZWNrYm94JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntyb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogaW5kZXh9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8dGQgKm5nSWY9XCIhc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtbiAmJiAhcm93RGF0YS5oaWRkZW5bZmllbGRPcmRlcl1cIiBjbGFzcz1cInN0dFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIiBbYXR0ci5jb2xTcGFuXT1cInJvd0RhdGEuY29sU3BhbiAmJiByb3dEYXRhLmNvbFNwYW5bZmllbGRPcmRlcl1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRPcmRlcl1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctY2FyZFwiIFtuZ1N0eWxlXT1cInJvd0RhdGEuYm9va21hcmtTdHlsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkT3JkZXJdfX1cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclN0aWNreVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiaGFzVGVtcGxhdGUoJ3Jvd0V4cGFuc2lvbicpICYmICFyb3dEYXRhLmhpZGRlbltmaWVsZENvbEV4cGFuZF1cIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm5vLXBhZGRpbmcgY2VudGVyIHJvdy1leHBhbnNpb24tdG9nZ2xlXCIgW2NsYXNzLnN0aWNreV09XCJzZXR0aW5nLnN0aWNreUNvbHVtblwiXHJcbiAgICAgICAgICAgIFthdHRyLmNvbFNwYW5dPVwicm93RGF0YS5jb2xTcGFuICYmIHJvd0RhdGEuY29sU3BhbltmaWVsZENvbEV4cGFuZF1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRDb2xFeHBhbmRdXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uVG9nZ2xlUm93RGF0YTsgY29udGV4dDoge3Jvd0RhdGE6IHJvd0RhdGEsIGV4cGFuZGVkOiBleHBhbmRlZH1cIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkeW5hbWljQ29sQm9keXM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IGNvbHVtbnMsIHJvd0RhdGE6IHJvd0RhdGEsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGV4cGFuZGVkfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cImVuYWJsZVJlb3JkZXJSb3cgJiYgIXJvd0RhdGEuaGlkZGVuW2ZpZWxkQ29sUmVvcmRlcl1cIiBjbGFzcz1cIm5vLXBhZGRpbmcgY2VudGVyXCJcclxuICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkQ29sUmVvcmRlcl1cIlxyXG4gICAgICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bZmllbGRDb2xSZW9yZGVyXVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1hcnJvd3MtYWx0XCIgc3R5bGU9XCJjdXJzb3I6cG9pbnRlcjsgcGFkZGluZzogOHB4OyBjb2xvcjogIzU1NTtcIiBwUmVvcmRlcmFibGVSb3dIYW5kbGU+PC9pPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gJiYgIXJvd0RhdGEuaGlkZGVuW2ZpZWxkRnVuY3Rpb25dXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtY2VudGVyIGNvbHVtbi1mdW5jdGlvblwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIFtjbGFzcy5zdGlja3ldPVwic2V0dGluZy5zdGlja3lDb2x1bW5cIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sU3Bhbl09XCJyb3dEYXRhLmNvbFNwYW4gJiYgcm93RGF0YS5jb2xTcGFuW2ZpZWxkRnVuY3Rpb25dXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLnJvd1NwYW5dPVwicm93RGF0YS5yb3dTcGFuICYmIHJvd0RhdGEucm93U3BhbltmaWVsZEZ1bmN0aW9uXVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1RlbXBsYXRlKCdmdW5jdGlvbicpXCIgY2xhc3M9XCJwLXRvb2xiYXItZ3JvdXAtY2VudGVyIGJ1dHRvbi1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0VGVtcGxhdGUoJ2Z1bmN0aW9uJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaGFzVGVtcGxhdGUoJ2Z1bmN0aW9uJylcIiBjbGFzcz1cInAtdG9vbGJhci1ncm91cC1jZW50ZXIgYnV0dG9uLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQmVmb3JlJylcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2V0dGluZy5zaG93VmVyc2lvbkJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIHBSaXBwbGUgaWNvbj1cInBpIHBpLWNhbGVuZGFyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tc3VjY2VzcyBsaW5rLW9yLWFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBUb29sdGlwPVwiWGVtIGzhu4tjaCBz4butIHBoacOqbiBi4bqjblwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93TGlzdFZlcnNpb24ocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuRWRpdFwiIFthcHBBdXRob3JpemVdPVwic2VydmljZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGVybWlzc2lvbl09XCJhdXRob3JpemVQYXRoc1tjb21tb25Db25zdC5FRElUXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVBdXRob3JpemVdPVwiYnV0dG9uQXBwbHlBdXRob3JpemVbY29tbW9uQ29uc3QuRURJVF1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRWRpdChyb3dEYXRhKVwiIFtwVG9vbHRpcF09XCInRk9STS5FRElUJyB8IHRyYW5zbGF0ZVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8gbGluay1vci1hY3Rpb25cIiBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXJvd0RhdGEuaGlkZGVuRGVsZXRlXCIgW2FwcEF1dGhvcml6ZV09XCJzZXJ2aWNlQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwZXJtaXNzaW9uXT1cImF1dGhvcml6ZVBhdGhzW2NvbW1vbkNvbnN0LkRFTEVURV1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlQXV0aG9yaXplXT1cImJ1dHRvbkFwcGx5QXV0aG9yaXplW2NvbW1vbkNvbnN0LkRFTEVURV1cIiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRGVsZXRlKHJvd0RhdGEpXCIgW3BUb29sdGlwXT1cIidGT1JNLkRFTEVURScgfCB0cmFuc2xhdGVcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgbGluay1vci1hY3Rpb25cIiBpY29uPVwicGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dNZW51QnV0dG9ucyAmJiBtZW51QnV0dG9uc1wiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaW5rLW9yLWFjdGlvbiBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm8gcC1idXR0b24tcm91bmRlZFwiIHBUb29sdGlwPVwiQ2jhu6ljIG7Eg25nIGtow6FjXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNob3dDb250ZXh0TWVudSgkZXZlbnQsIHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3Jvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiBpbmRleH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRUZW1wbGF0ZSgnYnV0dG9uQWZ0ZXInKVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFpbmVyU3RpY2t5XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3RyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGEudGVtcGxhdGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93RGF0YS50ZW1wbGF0ZTsgY29udGV4dDoge1xyXG4gICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsIGNvbHVtbnM6IGNvbHVtbnMsIGluZGV4OiBpbmRleCwgZXhwYW5kZWQ6IGV4cGFuZGVkLCBldmVudFNlbGVjdFJvdzogZXZlbnRTZWxlY3RSb3csIGV2ZW50Q2hlY2tlZDogZXZlbnRDaGVja2VkXHJcbiAgICAgICAgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZHluYW1pY0NvbEJvZHlzIGxldC1jb2x1bW5zIGxldC1yb3dEYXRhPVwicm93RGF0YVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZDsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgY29sOiBjb2wsIGluZGV4OiBpbmRleCwgaTogaSwgZXhwYW5kZWQ6IGV4cGFuZGVkfVwiPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGVudFRkIGxldC1yb3dEYXRhIGxldC1jb2w9XCJjb2xcIiBsZXQtaW5kZXg9XCJpbmRleFwiIGxldC1leHBhbmRlZD1cImV4cGFuZGVkXCIgbGV0LWk9XCJpXCI+XHJcbiAgICA8dGQgKm5nSWY9XCJjb2wgJiYgY29sLnZpc2libGUgJiYgY29sLmZpZWxkICE9ICdmdW5jdGlvbicgJiYgIXJvd0RhdGEuaGlkZGVuW2NvbC5maWVsZF1cIlxyXG4gICAgICAgIFthdHRyLmNvbFNwYW5dPVwicm93RGF0YS5jb2xTcGFuICYmIHJvd0RhdGEuY29sU3Bhbltjb2wuZmllbGRdXCJcclxuICAgICAgICBbYXR0ci5yb3dTcGFuXT1cInJvd0RhdGEucm93U3BhbiAmJiByb3dEYXRhLnJvd1NwYW5bY29sLmZpZWxkXVwiIFtuZ1N0eWxlXT1cImNvbC5leHRlbmREYXRhLnN0eWxlXCJcclxuICAgICAgICBbY2xhc3NdPVwiY29sLmNlbGxDbGFzc1wiIFtjbGFzcy5maXJzdC10ZF09XCJpID09IDBcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIiBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIFtlc2NhcGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+e3tjb2wubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAge3tyb3dEYXRhWydwaXBlX18nICsgY29sLmZpZWxkXX19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5waXBlXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1jb2x1bW4tdGl0bGVcIiBbcFRvb2x0aXBdPVwiY29sLmZ1bGxMYWJlbFwiIFtlc2NhcGVdPVwiZmFsc2VcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2V0dGluZy5zaG93RWRpdExpbmsgJiYgY29sLnNob3dFZGl0TGlua1wiIGNsYXNzPVwibGluay1vci1hY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwidmlldyhyb3dEYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZUNlbGw7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb250ZW50Q2VsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YTogcm93RGF0YSwgcm93SW5kZXg6IGluZGV4LCBjb2w6IGNvbCwgZXhwYW5kZWQ6IGV4cGFuZGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNldHRpbmcuc2hvd0VkaXRMaW5rIHx8ICFjb2wuc2hvd0VkaXRMaW5rXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVDZWxsOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb250ZW50Q2VsbCxcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogaW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWluZXJTdGlja3lcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvdGQ+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGVudENlbGwgbGV0LWNvbD1cImNvbFwiIGxldC1yb3dEYXRhIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWZpZWxkPVwiZmllbGRcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UZW1wbGF0ZUNlbGw7IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgJGltcGxpY2l0OiBjb2wudGVtcGxhdGUsXHJcbiAgICAgICAgICAgIHJvd0RhdGE6IHJvd0RhdGEsIHJvd0luZGV4OiByb3dJbmRleCwgY29sOiBjb2wsIGV4cGFuZGVkOiBleHBhbmRlZFxyXG4gICAgICAgIH1cIj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2wudGVtcGxhdGVcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2wuZGF0YVR5cGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidjb2xvcidcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtwVG9vbHRpcF09XCJyb3dEYXRhW2ZpZWxkXVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6cm93RGF0YVtmaWVsZF19XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7bWFyZ2luOjAgYXV0bztcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2ljb24nXCIgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO3RleHQtYWxpZ246Y2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPGkgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3dEYXRhW2ZpZWxkXVwiPjwvaT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdIHwgZGF0ZTonZGQvTU0veXl5eSdcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF0gfCB0bkRhdGU6Y29sLmRhdGFUeXBlOmNvbC5mb3JtYXR9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZXRpbWUnXCIgW3BUb29sdGlwXT1cInJvd0RhdGFbZmllbGRdIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbSdcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgdG5EYXRlOmNvbC5kYXRhVHlwZTpjb2wuZm9ybWF0fX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3VzZXInXCIgY2xhc3M9XCJ1c2VyXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgdXNlckZvcm1hdCB8IGFzeW5jfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCIndXNlcnMnXCIgW2lubmVySFRNTF09XCJyb3dEYXRhW2ZpZWxkXSB8IHVzZXJzRm9ybWF0IHwgYXN5bmNcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInaW50J1wiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXSB8IG51bWJlcn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidpbnRXaXRob3V0TWFzaydcIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZF19fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdIHwgY3VycmVuY3k6XCJWTkRcIn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAge3tyb3dEYXRhW2ZpZWxkXSB8IG51bWJlcn19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidib29sZWFuJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggY2xhc3M9XCJib29sZWFuLWRhdGEtdHlwZVwiIFsobmdNb2RlbCldPVwicm93RGF0YVtmaWVsZF1cIiBiaW5hcnk9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVDaGVja0JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9wLWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInaHRtbCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3dEYXRhW2ZpZWxkXT09bnVsbD8nJzpyb3dEYXRhW2ZpZWxkXVwiIFtpbm5lckhUTUxdPVwicm93RGF0YVtmaWVsZF0gfCBzYWZlSHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInbWV0YWRhdGFTdGF0dXMnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbJ3JlamVjdFJlYXNvbiddXCIgY2xhc3M9XCJsYWJlbC1kYW5nZXJcIiBbcFRvb2x0aXBdPVwicm93RGF0YVsncmVqZWN0UmVhc29uJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBTdHlsZUNsYXNzPVwidW5zZXQtd2lkdGhcIiBbZXNjYXBlXT1cImZhbHNlXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+VOG7qyBjaOG7kWk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbZmllbGRdID09ICcwJyAmJiAhcm93RGF0YVsncmVqZWN0UmVhc29uJ11cIiBjbGFzcz1cImxhYmVsLXNlY29uZGFyeVwiPkNoxrBhXHJcbiAgICAgICAgICAgICAgICAgICAgZHV54buHdDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93RGF0YVtmaWVsZF0gPT0gJzEnICYmICFyb3dEYXRhWydyZWplY3RSZWFzb24nXVwiIGNsYXNzPVwibGFiZWwtd2FybmluZ1wiPkNo4budIGR1eeG7h3Q8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvd0RhdGFbZmllbGRdID09ICcyJ1wiIGNsYXNzPVwibGFiZWwtcHJpbWFyeVwiPsSQw6MgZHV54buHdDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZVVwbG9hZCdcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjcnVkTGlzdEZpbGVVcGxvYWRDb2x1bW47IGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHJvd0RhdGEsIHBhcmVudENvbnRleHQ6IGNvbnRleHQsIGZpZWxkOiBjb2wuZmllbGQsIGZpbGVTZXR0aW5nOiBjb2wuZmlsZVNldHRpbmdcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGVNYW5hZ2VyJ1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3J1ZExpc3RGaWxlTWFuYWdlcjsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZCwgZmlsZVNldHRpbmc6IGNvbC5maWxlU2V0dGluZ31cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50Q2VsbFN0cmluZzsgY29udGV4dDogeyRpbXBsaWNpdDogcm93RGF0YSwgZmllbGQ6IGNvbC5maWVsZH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwibnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRDZWxsU3RyaW5nOyBjb250ZXh0OiB7JGltcGxpY2l0OiByb3dEYXRhLCBmaWVsZDogY29sLmZpZWxkfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tVGVtcGxhdGVDZWxsOyBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBnZXRDb21wb25lbnRCeVR5cGUoY29sLmRhdGFUeXBlKSxcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhOiByb3dEYXRhLCByb3dJbmRleDogcm93SW5kZXgsIGNvbDogY29sLCBleHBhbmRlZDogZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2NvbnRlbnRDZWxsU3RyaW5nIGxldC1yb3dEYXRhIGxldC1maWVsZD1cImZpZWxkXCI+XHJcbiAgICA8IS0tIF9fc3Y6IFNob3J0IFZhbHVlIC0tPlxyXG4gICAgPHNwYW4+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGFbZmllbGQgKyAnX19zdiddXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ11cIj5cclxuICAgICAgICAgICAgICAgIHt7cm93RGF0YVtmaWVsZCArICdfX3N2J119fVxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtc2hvd2Z1bGxcIiAoY2xpY2spPVwidG9nZ2xlU2hvd0Z1bGwocm93RGF0YSwgZmllbGQpXCIgcFRvb2x0aXA9XCJC4bqlbSDEkeG7gyB4ZW0gdGjDqm1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlsuLi5dPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddXCI+XHJcbiAgICAgICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdfX1cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXNob3dmdWxsXCIgKGNsaWNrKT1cInRvZ2dsZVNob3dGdWxsKHJvd0RhdGEsIGZpZWxkKVwiPlRodSBn4buNbjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb3dEYXRhW2ZpZWxkICsgJ19fc3YnXVwiPlxyXG4gICAgICAgICAgICB7e3Jvd0RhdGFbZmllbGRdfX1cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvc3Bhbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNjdXN0b21UZW1wbGF0ZUNlbGwgbGV0LXRlbXBsYXRlIGxldC1yb3dEYXRhPVwicm93RGF0YVwiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbD1cImNvbFwiXHJcbiAgICBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XHJcbiAgICAgICAgJGltcGxpY2l0OiByb3dEYXRhLFxyXG4gICAgICAgIGNydWRMaXN0OiB0aGlzLFxyXG4gICAgICAgIHJvd0luZGV4LFxyXG4gICAgICAgIGNvbCxcclxuICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgIGljb25Ub2dnbGVSb3dEYXRhOiB0aGlzLmljb25Ub2dnbGVSb3dEYXRhXHJcbiAgICB9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNpY29uVG9nZ2xlUm93R3JvdXAgbGV0LXJvd0RhdGE9XCJyb3dEYXRhXCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cclxuICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwiaGFuZGxlVG9nZ2xlUm93KHJvd0RhdGEsICRldmVudClcIj5cclxuICAgICAgICA8aSBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIiBbbmdDbGFzc109XCJleHBhbmRlZCA/ICdmYXMgZmEtZncgZmEtY2FyZXQtZG93bicgOiAnZmFzIGZhLWZ3IGZhLWNhcmV0LXJpZ2h0J1wiPjwvaT5cclxuICAgIDwvYT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNpY29uVG9nZ2xlUm93RGF0YSBsZXQtcm93RGF0YT1cInJvd0RhdGFcIiBsZXQtZXhwYW5kZWQ9XCJleHBhbmRlZFwiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBwUmlwcGxlIGNsYXNzPVwibGluay1vci1hY3Rpb24gcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXBsYWluXCJcclxuICAgICAgICBbaWNvbl09XCJleHBhbmRlZCA/ICdwaSBwaS1jaGV2cm9uLWRvd24nIDogJ3BpIHBpLWNoZXZyb24tcmlnaHQnXCJcclxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlVG9nZ2xlUm93KHJvd0RhdGEsICRldmVudClcIj48L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNfY29udGVudFJvd0dyb3VwIGxldC1yb3dEYXRhPVwicm93RGF0YVwiIGxldC1ncm91cENvbD1cImdyb3VwQ29sXCIgbGV0LWdyb3VwRmllbGQ9XCJfZ3JvdXBGaWVsZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50Q2VsbFwiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntyb3dEYXRhOiByb3dEYXRhLCBjb2w6IGdyb3VwQ29sLCBmaWVsZDogX2dyb3VwRmllbGR9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxzcGFuICpuZ0lmPVwic2V0dGluZy5jb2x1bW5TZXR0aW5nLnNob3dHcm91cFNpemVcIj5cclxuICAgICAgICAoe3tyb3dHcm91cE1ldGFkYXRhW3Jvd0RhdGFbX2dyb3VwRmllbGRdXS5zaXplfX0pPC9zcGFuPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3RyYW5nVGhhaVY1IGxldC1yb3dEYXRhPVwicm93RGF0YVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci10ZXh0LXdvcmtmbG93XCI+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFyb3dEYXRhLl9fd29ya2Zsb3dDb2RlICYmICFyb3dEYXRhLmhpZGRlbldvcmtmbG93QWN0aW9uICYmICFyb3dEYXRhLmhpZGRlblN0YXJ0V29ya2Zsb3dcIiBwQnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBsaW5rLW9yLWFjdGlvblwiIGxhYmVsPVwiQuG6r3QgxJHhuqd1XCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjN2NhOWNkO1wiXHJcbiAgICAgICAgICAgIHBUb29sdGlwPVwiQuG6r3QgxJHhuqd1IGNo4bqheSBxdXkgdHLDrG5oXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJvd0RhdGEuX19zdGFydGluZ1dvcmtmbG93ICYmICFyb3dEYXRhLl9fbm90UmVhZHlGb3JTdGFydFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzaG93Rm9ybVN0YXJ0V29ya2Zsb3cocm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93RGF0YS5fX3dvcmtmbG93Q29kZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRlbnRcIj57e3Jvd0RhdGEuX190ZXh0VHJhbmdUaGFpfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhcm93RGF0YS5oaWRkZW5Xb3JrZmxvd0FjdGlvblwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGluay1vci1hY3Rpb24gcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yb3VuZGVkXCIgcFRvb2x0aXA9XCJIw6BuaCDEkeG7mW5nXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzaG93aW5nQWN0aW9uV29ya2Zsb3dcIiAoY2xpY2spPVwic2hvd0FjdGlvbldvcmtmbG93KCRldmVudCwgcm93RGF0YSlcIj48L2J1dHRvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3ZpZXdIaXN0b3J5IGxldC1yb3dEYXRhPVwicm93RGF0YVwiPlxyXG4gICAgPGJ1dHRvbiBwQnV0dG9uIGljb249XCJwaSBwaS1jYWxlbmRhclwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1yb3VuZGVkIGxpbmstb3ItYWN0aW9uXCIgcFRvb2x0aXA9XCJYZW0gbOG7i2NoIHPhu61cIlxyXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIChjbGljayk9XCJ2aWV3SGlzdG9yeVdvcmtmbG93KHNldHRpbmcsIHJvd0RhdGEpXCI+PC9idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGFpbmVyU3RpY2t5PlxyXG4gICAgPHNwYW4gY2xhc3M9XCJmaXgtc3RpY2t5IHRvcFwiPjwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZml4LXN0aWNreSByaWdodFwiPjwvc3Bhbj5cclxuICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJmaXgtc3RpY2t5IGJvdHRvbVwiPjwvc3Bhbj4gLS0+XHJcbiAgICA8c3BhbiBjbGFzcz1cImZpeC1zdGlja3kgbGVmdFwiPjwvc3Bhbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNzb3J0SWNvbiBsZXQtZmllbGQ9XCJmaWVsZFwiPlxyXG4gICAgPGkgY2xhc3M9XCJwLXNvcnRhYmxlLWNvbHVtbi1pY29uIHBpXCIgc3R5bGU9XCJmb250LXNpemU6IDAuOGVtO1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydwaS1zb3J0LWFtb3VudC11cC1hbHQnOiBmaWVsZCA9PSBfc29ydEZpZWxkICYmIF9zb3J0RGlyID09PSAxLCAncGktc29ydC1hbW91bnQtZG93bic6IGZpZWxkID09IF9zb3J0RmllbGQgJiYgX3NvcnREaXIgPT09IC0xLCAncGktc29ydC1hbHQnOiBmaWVsZCAhPSBfc29ydEZpZWxkIHx8IF9zb3J0RGlyID09PSAwfVwiPjwvaT5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJEcm9wZG93biBsZXQtY29sPVwiY29sXCI+XHJcbiAgICA8ZGl2ICNmaWx0ZXJCb3ggc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxyXG4gICAgICAgIDxkcm9wZG93biAqbmdJZj1cImNvbCAmJiBmaWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXVwiIFtjb250cm9sXT1cImZpbHRlclNjaGVtYS5kcm9wZG93bltjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF0uZGF0YVNvdXJjZVwiIFsodmFsdWUpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgIChvbkhpZGVTbWFydEV2ZW50KT1cIm9uU2VhcmNoKClcIiAob25TaG93KT1cIm9uU2hvd0ZpbHRlckRyb3Bkb3duUGFuZWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvbkhpZGUpPVwib25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbCgkZXZlbnQpXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPjwvZHJvcGRvd24+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJUZXh0IGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cInRleHQtZmlsdGVyIGZpbHRlci1ib3hcIiB0YWJpbmRleD1cIi0xXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiaW5wdXQtc2VhcmNoXCIgW3BsYWNlaG9sZGVyXT1cImNvbC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiIChjaGFuZ2UpPVwib25TZWFyY2goKVwiXHJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZXNjKT1cIm9uQ2xlYXJTZWFyY2goZmlsdGVyQm94LCBjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieydhY3Rpb24tY2xlYXInOiB0cnVlLCAnZGlydHknOiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF0gIT09ICcnfVwiXHJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCInQuG7jyBmaWx0ZXInXCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKG1vdXNlZG93bik9XCJvbkNsZWFyU2VhcmNoKGZpbHRlckJveCwgY29sLmZpZWxkKVwiXHJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIj48aSBjbGFzcz1cInBpIHBpLWZpbHRlci1zbGFzaFwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPGFmdGVyLXZpZXctY2hlY2tlZCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGxvYWRlZCk9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDwvYWZ0ZXItdmlldy1jaGVja2VkPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZmlsdGVyTnVtYmVyIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cIm51bWJlci1waWNrZXItcmFuZ2UgZmlsdGVyLWJveFwiIHRhYmluZGV4PVwiLTFcIiAobW91c2Vkb3duKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPGRpdiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDx0bi1udW1iZXItcGlja2VyLXJhbmdlICNudW1iZXJSYW5nZSBbbWFza1R5cGVdPVwiY29sLmRhdGFUeXBlXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXJEYXRhW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgW21pbl09XCJjb2wubWluXCIgW21heF09XCJjb2wubWF4XCIgKGNoYW5nZSk9XCJvblNlYXJjaCgpXCI+XHJcbiAgICAgICAgICAgIDwvdG4tbnVtYmVyLXBpY2tlci1yYW5nZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGlvbi1jbGVhcic6IHRydWUsICdkaXJ0eSc6IGZpbHRlckRhdGFbY29sLmZpZWxkXSAmJiAoKGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVswXSAhPT0gJycpIHx8IChmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT0gbnVsbCAmJiBmaWx0ZXJEYXRhW2NvbC5maWVsZF1bMV0gIT09ICcnKSl9XCJcclxuICAgICAgICAgICAgW3BUb29sdGlwXT1cIidC4buPIGZpbHRlcidcIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiAobW91c2Vkb3duKT1cIm9uQ2xlYXJOdW1iZXJTZWFyY2goZmlsdGVyQm94LCBudW1iZXJSYW5nZSlcIlxyXG4gICAgICAgICAgICB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAobG9hZGVkKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJEYXRlIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgI2ZpbHRlckJveCBjbGFzcz1cImRhdGUtcGlja2VyLXJhbmdlIGZpbHRlci1ib3hcIiB0YWJpbmRleD1cIi0xXCIgKG1vdXNlZG93bik9XCJpbml0RmlsdGVyQm94Rm9jdXMoZmlsdGVyQm94KVwiPlxyXG4gICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiPlxyXG4gICAgICAgICAgICA8dG4tZGF0ZXRpbWUtcGlja2VyLXJhbmdlICNkYXRlUmFuZ2UgW2NvbnRyb2xdPVwiZmlsdGVyU2NoZW1hLmRhdGVSYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2VkKT1cIm9uQ2hhbmdlRGF0ZVRpbWUoJGV2ZW50LCBjb2wuZmllbGQpXCI+XHJcbiAgICAgICAgICAgIDwvdG4tZGF0ZXRpbWUtcGlja2VyLXJhbmdlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aW9uLWNsZWFyJzogdHJ1ZSwgJ2RpcnR5JzogZmlsdGVyRGF0YVtjb2wuZmllbGRdICYmICgoZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9IG51bGwgJiYgZmlsdGVyRGF0YVtjb2wuZmllbGRdWzBdICE9PSAnJykgfHwgKGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPSBudWxsICYmIGZpbHRlckRhdGFbY29sLmZpZWxkXVsxXSAhPT0gJycpKX1cIlxyXG4gICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0Lhu48gZmlsdGVyJ1wiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXHJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25DbGVhckRhdGVTZWFyY2goZmlsdGVyQm94LCBkYXRlUmFuZ2UsIGNvbC5maWVsZClcIiB0YWJpbmRleD1cIi0xXCI+PGlcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktZmlsdGVyLXNsYXNoXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8YWZ0ZXItdmlldy1jaGVja2VkIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAobG9hZGVkKT1cImluaXRGaWx0ZXJCb3hGb2N1cyhmaWx0ZXJCb3gpXCI+XHJcbiAgICAgICAgPC9hZnRlci12aWV3LWNoZWNrZWQ+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNmaWx0ZXJCb29sZWFuIGxldC1jb2w9XCJjb2xcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItYm9vbGVhbi1ib3hcIj5cclxuICAgICAgICA8cC1zZWxlY3RCdXR0b24gKm5nSWY9XCIhY29sLm1pbmltaXplRmlsdGVyXCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiW3t2YWx1ZTogdHJ1ZSwgbGFiZWw6ICdDw7MnLCBpY29uOiAncGkgcGktY2hlY2snfSwge3ZhbHVlOiBmYWxzZSwgbGFiZWw6ICdLaMO0bmcnLCBpY29uOiAncGkgcGktdGltZXMnfV1cIlxyXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiZmlsdGVyRGF0YVtjb2wuZmllbGRdXCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlQm9vbGVhbigkZXZlbnQsIGNvbC5maWVsZClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJwYWRkaW5nOiAzcHggMDtcIiBbY2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1zZWxlY3RCdXR0b24+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC5taW5pbWl6ZUZpbHRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWZpbHRlckRhdGFbY29sLmZpZWxkXVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1maWx0ZXItc2xhc2hcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZmlsdGVyLWJvb2xlYW5cIiAoY2xpY2spPVwic2hvd0NoZWNrQm94RmlsdGVyTWVudSgkZXZlbnQsIGNvbC5maWVsZClcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImZpbHRlckRhdGFbY29sLmZpZWxkXVwiIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1maWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tZmlsdGVyLWJvb2xlYW4gcC1idXR0b24tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0NoZWNrQm94RmlsdGVyTWVudSgkZXZlbnQsIGNvbC5maWVsZClcIj48L2J1dHRvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|