tnx-shared 5.0.21 → 5.0.25
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/bundles/tnx-shared.umd.js +81 -362
- package/bundles/tnx-shared.umd.js.map +1 -1
- package/bundles/tnx-shared.umd.min.js +1 -1
- package/bundles/tnx-shared.umd.min.js.map +1 -1
- package/classes/base/data-form-base.d.ts.map +1 -1
- package/classes/base/data-list-base.d.ts +1 -0
- package/classes/base/data-list-base.d.ts.map +1 -1
- package/classes/form-schema.d.ts +0 -3
- package/classes/form-schema.d.ts.map +1 -1
- package/classes/public-function.d.ts +1 -1
- package/components/crud/crud-form/crud-form.component.d.ts +2 -2
- package/components/crud/crud-list/crud-list.component.d.ts +0 -10
- package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
- package/components/tn-app-notification/tn-app-notification.component.d.ts +2 -2
- package/components/tn-app-notification/tn-app-notification.component.d.ts.map +1 -1
- package/components/workflow/services/entity-workflow-setting.service.d.ts.map +1 -1
- package/esm2015/classes/base/data-form-base.js +2 -30
- package/esm2015/classes/base/data-list-base.js +6 -60
- package/esm2015/classes/form-schema.js +1 -3
- package/esm2015/components/crud/crud-list/crud-list.component.js +11 -160
- package/esm2015/components/tn-app-notification/tn-app-notification.component.js +2 -2
- package/esm2015/components/workflow/services/entity-workflow-history.service.js +4 -4
- package/esm2015/components/workflow/services/entity-workflow-setting.service.js +15 -10
- package/esm2015/services/crud.service.js +2 -2
- package/esm2015/tnx-shared.module.js +3 -1
- package/fesm2015/tnx-shared.js +72 -294
- package/fesm2015/tnx-shared.js.map +1 -1
- package/package.json +2 -2
- package/tnx-shared.metadata.json +1 -1
- package/tnx-shared.module.d.ts.map +1 -1
- package/tnx-shared.module.ngfactory.d.ts.map +1 -1
|
@@ -20,7 +20,6 @@ import { ExportService } from '../../../services/export.service';
|
|
|
20
20
|
import { LoggerService } from '../../../services/logger.service';
|
|
21
21
|
import { ModuleConfigService } from '../../../services/module-config.service';
|
|
22
22
|
import { NotifierService } from '../../../services/notifier.service';
|
|
23
|
-
import { UserService } from '../../../services/user.service';
|
|
24
23
|
import { multipleSort } from '../../../utils/array';
|
|
25
24
|
import { addZero } from '../../../utils/date';
|
|
26
25
|
import { SearchInfo } from '../../models/search';
|
|
@@ -28,7 +27,6 @@ import { StateMachinesService } from '../../statemachines/services/statemachines
|
|
|
28
27
|
import { TnCustomScrollbarComponent } from '../../tn-custom-scrollbar/tn-custom-scrollbar.component';
|
|
29
28
|
import { CanBo_HoSoService } from '../../workflow/services/canbo-hoso.service';
|
|
30
29
|
import { EntityWorkflowHistoryService } from '../../workflow/services/entity-workflow-history.service';
|
|
31
|
-
import { WorkflowHistoryService } from '../../workflow/services/workflow-history.service';
|
|
32
30
|
import { dataSourceIcon } from '../../workflow/workflow-setting/workflow-setting.component';
|
|
33
31
|
import { baseTrinhKy } from '../utils';
|
|
34
32
|
import { ComCtxConstants } from './../../../configs/component-context.constant';
|
|
@@ -903,117 +901,6 @@ export class CrudListComponent extends ComponentBase {
|
|
|
903
901
|
];
|
|
904
902
|
});
|
|
905
903
|
}
|
|
906
|
-
getItemWorkflowSetting(rowData) {
|
|
907
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
908
|
-
let workflowSetting = this.setting.workflowSettingNew;
|
|
909
|
-
if (this.setting.isWorkflowTree
|
|
910
|
-
&& this.setting.workflowConfigAdvance
|
|
911
|
-
&& this.setting.workflowConfigAdvance.getWorkflowSetting) {
|
|
912
|
-
workflowSetting = yield this.setting.workflowConfigAdvance.getWorkflowSetting(rowData);
|
|
913
|
-
}
|
|
914
|
-
if (!workflowSetting || workflowSetting.workflows.length == 0) {
|
|
915
|
-
return this._notifierService.showWarning('Đối tượng chưa được cấu hình quy trình nghiệp vụ');
|
|
916
|
-
}
|
|
917
|
-
return workflowSetting;
|
|
918
|
-
});
|
|
919
|
-
}
|
|
920
|
-
showFormStartWorkflow(rowData) {
|
|
921
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
922
|
-
const workflowSetting = yield this.getItemWorkflowSetting(rowData);
|
|
923
|
-
if (!workflowSetting)
|
|
924
|
-
return;
|
|
925
|
-
if (workflowSetting.workflows.length == 1) {
|
|
926
|
-
return this.startWorkflow(rowData, workflowSetting.workflows[0]);
|
|
927
|
-
}
|
|
928
|
-
this.startWorkflowModel.data.workflows = workflowSetting.workflows;
|
|
929
|
-
this.startWorkflowModel.data.defaultWorkflow = workflowSetting.workflowCode;
|
|
930
|
-
this.startWorkflowModel.data.item = rowData;
|
|
931
|
-
this.startWorkflowModel.showEditForm = true;
|
|
932
|
-
});
|
|
933
|
-
}
|
|
934
|
-
handleStartWorkflowFromDialog(workflow) {
|
|
935
|
-
this.startWorkflowModel.showEditForm = false;
|
|
936
|
-
this.startWorkflow(this.startWorkflowModel.data.item, workflow);
|
|
937
|
-
}
|
|
938
|
-
showActionWorkflowNew(evt, rowData) {
|
|
939
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
940
|
-
const resultGetActionWorkflow = yield this.getActionWorkflowNew(rowData);
|
|
941
|
-
if (!Array.isArray(resultGetActionWorkflow))
|
|
942
|
-
return;
|
|
943
|
-
const [buttonContexts, hasPermission] = resultGetActionWorkflow;
|
|
944
|
-
rowData.__hasPermission = hasPermission;
|
|
945
|
-
rowData.__actions = buttonContexts;
|
|
946
|
-
this.buttonContexts = buttonContexts;
|
|
947
|
-
this._showContextMenu(evt);
|
|
948
|
-
});
|
|
949
|
-
}
|
|
950
|
-
getActionWorkflowNew(rowData) {
|
|
951
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
952
|
-
if (this.showingActionWorkflow)
|
|
953
|
-
return;
|
|
954
|
-
const workflowSetting = yield this.getItemWorkflowSetting(rowData);
|
|
955
|
-
if (!workflowSetting)
|
|
956
|
-
return;
|
|
957
|
-
this.showingActionWorkflow = true;
|
|
958
|
-
this.currentItem = rowData;
|
|
959
|
-
let hasPermission = false;
|
|
960
|
-
this.buttonContexts = [];
|
|
961
|
-
const buttonContexts = [];
|
|
962
|
-
// Nếu k có workflow code nghĩa là chưa chạy quy trình hoặc quy trình lỗi => Cho chạy lại
|
|
963
|
-
if (!rowData.__workflowCode) {
|
|
964
|
-
buttonContexts.push({
|
|
965
|
-
label: `Bắt đầu quy trình`,
|
|
966
|
-
icon: 'pi pi-play',
|
|
967
|
-
command: () => this.showFormStartWorkflow(rowData)
|
|
968
|
-
});
|
|
969
|
-
hasPermission = true;
|
|
970
|
-
}
|
|
971
|
-
else {
|
|
972
|
-
const itemWorkflowSetting = workflowSetting.workflows.find(q => q.code == rowData.__workflowCode);
|
|
973
|
-
if (!itemWorkflowSetting) {
|
|
974
|
-
return this._notifierService.showWarning(`Không tìm thấy quy trình có mã ${rowData.__workflowCode}`);
|
|
975
|
-
}
|
|
976
|
-
const actions = itemWorkflowSetting.data.actions[rowData.__trangThai];
|
|
977
|
-
const actionAllows = (yield this.setting.baseService.getActionAllow(rowData.id)).data;
|
|
978
|
-
actionAllows.forEach(actionCode => {
|
|
979
|
-
const action = actions.find(q => q.code == actionCode);
|
|
980
|
-
if (action) {
|
|
981
|
-
buttonContexts.push({
|
|
982
|
-
soThuTu: action.soThuTu,
|
|
983
|
-
actionCode: action.code,
|
|
984
|
-
icon: this.sourceIcon[action.icon],
|
|
985
|
-
label: action.name,
|
|
986
|
-
command: () => this.processWorkflowNew(itemWorkflowSetting, action)
|
|
987
|
-
});
|
|
988
|
-
}
|
|
989
|
-
});
|
|
990
|
-
buttonContexts.sort(multipleSort('soThuTu'));
|
|
991
|
-
// Kiểm tra người cuối cùng thực hiện có phải người hiện tại không thì cho phép rollback
|
|
992
|
-
const workflowHistoryService = this._injector.get(WorkflowHistoryService);
|
|
993
|
-
const userService = this._injector.get(UserService);
|
|
994
|
-
const userId = userService.getId();
|
|
995
|
-
let userIdStringUpper = '';
|
|
996
|
-
if (userId) {
|
|
997
|
-
userIdStringUpper = userId.toUpperCase();
|
|
998
|
-
}
|
|
999
|
-
const itemWorkflowHistoryLast = (yield workflowHistoryService.getLastByItemId(rowData.id)).data;
|
|
1000
|
-
if (itemWorkflowHistoryLast && itemWorkflowHistoryLast.userIdCreated.toUpperCase() == userIdStringUpper) {
|
|
1001
|
-
buttonContexts.push({
|
|
1002
|
-
icon: 'pi pi-replay',
|
|
1003
|
-
label: 'Thu hồi',
|
|
1004
|
-
command: () => this.rollbackWorkflowNew(rowData)
|
|
1005
|
-
});
|
|
1006
|
-
}
|
|
1007
|
-
buttonContexts.push({
|
|
1008
|
-
icon: 'pi pi-list',
|
|
1009
|
-
label: 'Xem lịch sử',
|
|
1010
|
-
command: () => this.viewHistoryWorkflowNew(rowData)
|
|
1011
|
-
});
|
|
1012
|
-
}
|
|
1013
|
-
this.showingActionWorkflow = false;
|
|
1014
|
-
return [buttonContexts, hasPermission];
|
|
1015
|
-
});
|
|
1016
|
-
}
|
|
1017
904
|
_showContextMenu(evt) {
|
|
1018
905
|
this.contextMenu.show(evt);
|
|
1019
906
|
evt.preventDefault();
|
|
@@ -1030,32 +917,9 @@ export class CrudListComponent extends ComponentBase {
|
|
|
1030
917
|
}));
|
|
1031
918
|
});
|
|
1032
919
|
}
|
|
1033
|
-
rollbackWorkflowNew(rowData) {
|
|
1034
|
-
this._notifierService.showConfirm('Bạn có chắc chắn muốn khôi phục trạng thái trước đó')
|
|
1035
|
-
.then(res => {
|
|
1036
|
-
if (!res)
|
|
1037
|
-
return;
|
|
1038
|
-
this.setting.baseService.rollback(rowData)
|
|
1039
|
-
.then(res => this.handleResponse(res, 'Khôi phục trạng thái trước thành công', f => {
|
|
1040
|
-
this.onRollbackedWorkflow.emit(rowData.id);
|
|
1041
|
-
this.onChangedStatusWorkflow.emit(rowData.id);
|
|
1042
|
-
this.getData();
|
|
1043
|
-
}));
|
|
1044
|
-
});
|
|
1045
|
-
}
|
|
1046
920
|
viewHistoryWorkflow(id) {
|
|
1047
921
|
this.showHistoryWorkflow = true;
|
|
1048
922
|
}
|
|
1049
|
-
viewHistoryWorkflowNew(rowData) {
|
|
1050
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1051
|
-
this.currentItem = rowData;
|
|
1052
|
-
const workflowSetting = yield this.getItemWorkflowSetting(rowData);
|
|
1053
|
-
if (!workflowSetting)
|
|
1054
|
-
return;
|
|
1055
|
-
this.workflowHistoryModel.data.workflowSetting = workflowSetting;
|
|
1056
|
-
this.workflowHistoryModel.showEditForm = true;
|
|
1057
|
-
});
|
|
1058
|
-
}
|
|
1059
923
|
handleHideHistoryWorkflow() {
|
|
1060
924
|
this.showHistoryWorkflow = false;
|
|
1061
925
|
}
|
|
@@ -1095,14 +959,6 @@ export class CrudListComponent extends ComponentBase {
|
|
|
1095
959
|
}
|
|
1096
960
|
});
|
|
1097
961
|
}
|
|
1098
|
-
processWorkflowNew(itemWorkflowSetting, workflowAction) {
|
|
1099
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1100
|
-
this.processWorkflowModel.showEditForm = true;
|
|
1101
|
-
this.processWorkflowModel.header = workflowAction.name;
|
|
1102
|
-
this.processWorkflowModel.data.action = workflowAction;
|
|
1103
|
-
this.processWorkflowModel.data.workflow = itemWorkflowSetting;
|
|
1104
|
-
});
|
|
1105
|
-
}
|
|
1106
962
|
startWorkflow(rowData, workflow) {
|
|
1107
963
|
this.setting.baseService.startWorkflow(rowData.id, workflow.code)
|
|
1108
964
|
.then(res => this.handleResponse(res, 'Chạy quy trình thành công', f => {
|
|
@@ -2422,19 +2278,12 @@ export class CrudListComponent extends ComponentBase {
|
|
|
2422
2278
|
showSettingsWorkflow() {
|
|
2423
2279
|
this._showSettingsWorkflow = true;
|
|
2424
2280
|
}
|
|
2425
|
-
showSettingsWorkflowNew() {
|
|
2426
|
-
this.workflowSettingModel.showEditForm = true;
|
|
2427
|
-
}
|
|
2428
2281
|
onSaveWorkflowSettings(event) {
|
|
2429
2282
|
this.setting.workflowSetting = event;
|
|
2430
2283
|
this._commonService.reloadPage();
|
|
2431
2284
|
this._showSettingsWorkflow = false;
|
|
2432
2285
|
this.getData();
|
|
2433
2286
|
}
|
|
2434
|
-
onSaveWorkflowSettingsNew(evt) {
|
|
2435
|
-
this.workflowSettingModel.showEditForm = false;
|
|
2436
|
-
this._commonService.reloadPage();
|
|
2437
|
-
}
|
|
2438
2287
|
onRemoveWorkflowSettings(evt) {
|
|
2439
2288
|
this._showSettingsWorkflow = false;
|
|
2440
2289
|
this.getData();
|
|
@@ -2461,13 +2310,15 @@ export class CrudListComponent extends ComponentBase {
|
|
|
2461
2310
|
nodeScrollBarContent.parentNode.prepend(element);
|
|
2462
2311
|
}
|
|
2463
2312
|
const firstTh = element.parentNode.querySelector('p-table thead tr:first-child > th');
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2313
|
+
if (firstTh) {
|
|
2314
|
+
const firstThSize = firstTh.getBoundingClientRect();
|
|
2315
|
+
const loadingIcon = element.querySelector('.p-datatable-loading-icon');
|
|
2316
|
+
const fontSize = parseFloat(getComputedStyle(loadingIcon).fontSize);
|
|
2317
|
+
const top = (firstThSize.height - fontSize) / 2;
|
|
2318
|
+
const left = (firstThSize.width - fontSize) / 2;
|
|
2319
|
+
loadingIcon.style.marginTop = `${top}px`;
|
|
2320
|
+
loadingIcon.style.marginLeft = `${left}px`;
|
|
2321
|
+
}
|
|
2471
2322
|
}
|
|
2472
2323
|
else {
|
|
2473
2324
|
this.adjustPositionLoadingMask();
|
|
@@ -2479,7 +2330,7 @@ CrudListComponent.decorators = [
|
|
|
2479
2330
|
{ type: Component, args: [{
|
|
2480
2331
|
// tslint:disable-next-line: component-selector
|
|
2481
2332
|
selector: 'crud-list',
|
|
2482
|
-
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=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-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]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\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=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" 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 <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></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=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\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 [config]=\"configScrollBar\"\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]=\"hasTemplate('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 [config]=\"configScrollBar\"\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<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-dialog>\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 <workflow-setting-new #formBase [parentSetting]=\"setting\" (onSaved)=\"onSaveWorkflowSettingsNew($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'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\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%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"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=\"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 <workflow-history-new #formBase [baseService]=\"setting.baseService\" [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<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-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 <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<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=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"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=\"!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=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; 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=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"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=\"!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=\"!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 <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!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=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"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=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; 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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [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\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"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 [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\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\" [style.width]=\"widthCheckbox\">\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=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"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 (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 (click)=\"showSettingsWorkflow()\"></button>\r\n <button *ngIf=\"!setting.hiddenSettingWorkflowNew\" 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 (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 [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\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 [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { '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\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\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 *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" 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]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\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\" class=\"no-padding center\">\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\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\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=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n 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\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\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 || !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\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\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 #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> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</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 (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\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\" pButton class=\"p-button-text link-or-action\" label=\"B\u1EAFt \u0111\u1EA7u\"\r\n style=\"border: 1px solid #7ca9cd;\" pTooltip=\"B\u1EAFt \u0111\u1EA7u ch\u1EA1y quy tr\u00ECnh\" tooltipPosition=\"top\"\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)=\"showActionWorkflowNew($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-replay\" class=\"p-button-text p-button-rounded link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED\"\r\n tooltipPosition=\"top\" (click)=\"viewHistoryWorkflowNew(rowData)\"></button>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\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\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
|
|
2333
|
+
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=\"searchCustom\" class=\"p-grid ui-fluid custom-p-col custom-search-area\">\r\n <div class=\"p-col-12 main-container-search\">\r\n <div class=\"p-grid main-container-search-inner\">\r\n <ng-container>\r\n <ng-container *ngTemplateOutlet=\"searchCustom; context: {$implicit: this}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenHeader\" class=\"p-grid ui-fluid custom-p-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]=\"{crudList: this}\">\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!setting.hiddenPageSetting\" class=\"paginator-table\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\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=\"p-grid crudListToolbar\">\r\n <ng-container>\r\n <div *ngIf=\"!setting.hiddenButtons && hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar custom-toolbar\">\r\n <ng-container\r\n [ngTemplateOutletContext]=\"{selectedItems: model.selectedItems, crudList: this}\"\r\n [ngTemplateOutlet]=\"getTemplate('toolbar')\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!setting.hiddenButtons && !hasTemplate('toolbar')\"\r\n [ngClass]=\"setting.hiddenAdvanceSearch ? 'p-md-12 p-lg-12' : 'p-md-7 p-lg-8'\"\r\n class=\"p-col-12 button-group function-topbar\">\r\n <button *ngIf=\"!hiddenAdd\" type=\"button\" pButton pRipple label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\"\r\n class=\"p-button-text\" (click)=\"add()\"></button>\r\n <button *ngIf=\"model.selectedItems.length > 0\" 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 <button *ngIf=\"!hiddenDelete && model.selectedItems.length > 0 && !disableMultipleDelete()\"\r\n type=\"button\" pButton pRipple\r\n label=\"{{ 'X\u00F3a' | translate }} ({{model.selectedItems.length}})\" icon=\"pi pi-trash\"\r\n class=\"p-button-text p-button-danger\" (click)=\"deleteMutiple()\"></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=\"p-col-12 advance-search-container\"\r\n [ngClass]=\"setting.hiddenButtons ? 'p-md-12 p-lg-12' : 'p-md-5 p-lg-4'\">\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 [config]=\"configScrollBar\"\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]=\"hasTemplate('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 [config]=\"configScrollBar\"\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<settings *ngIf=\"_showSettings && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveSettings($event)\"\r\n (onCancel)=\"_showSettings = false\">\r\n</settings>\r\n<settings-row *ngIf=\"_showSettingsRowColor && !setting.hiddenSetting\" [entityMetadataService]=\"entityMetadataService\"\r\n [parentContext]=\"context\" [parentSetting]=\"setting\" [parentModel]=\"model\" (onSave)=\"onSaveColorSettings($event)\"\r\n (onCancel)=\"_showSettingsRowColor = false\">\r\n</settings-row>\r\n<workflow-setting-dialog *ngIf=\"_showSettingsWorkflow && !setting.hiddenSettingWorkflow\" [parentSetting]=\"setting\"\r\n [parentContext]=\"context\" [parentModel]=\"model\" (onSaved)=\"onSaveWorkflowSettings($event)\"\r\n (onRemoved)=\"onRemoveWorkflowSettings($event)\" (onCancel)=\"_showSettingsWorkflow = false\"></workflow-setting-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'\" [model]=\"buttonContexts\">\r\n</p-contextMenu>\r\n<tn-dialog *ngIf=\"showFormWorkflow\" #dialog [header]=\"headerWorkflow | translate\" [popupSize]=\"popupSizeWorkflow\"\r\n [scrollBarStyleClass]=\"'fit-content'\" (onHide)=\"showFormWorkflow = false\">\r\n <div style=\"height: 100%\">\r\n <simple-workflow-form #formBase [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [action]=\"actionWorkflow\" (onInvalidWorkflow)=\"handleInvalidWF($event)\" (onSaved)=\"handleProcessedWorflow()\"\r\n (onCancel)=\"showFormWorkflow = false\">\r\n </simple-workflow-form>\r\n </div>\r\n</tn-dialog>\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%\">\r\n <process-workflow-form #formBase [bussinessSetting]=\"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=\"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 <workflow-history-new #formBase [baseService]=\"setting.baseService\" [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<workflow-history-dialog *ngIf=\"showHistoryWorkflow\" [baseService]=\"setting.baseService\" [item]=\"currentItem\"\r\n [workflowSetting]=\"setting.workflowSetting\" (onHide)=\"handleHideHistoryWorkflow()\">\r\n</workflow-history-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=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"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=\"!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=\"rowExpansion\" pTemplate=\"rowexpansion\" let-rowData let-expanded=\"expanded\">\r\n <ng-container\r\n *ngTemplateOutlet=\"rowExpansion; context: {rowData: rowData, expanded: expanded, getColSpanGroup: getColSpanGroup}\">\r\n </ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; 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=\"header\" pTemplate=\"header\" let-columns>\r\n <ng-container\r\n *ngTemplateOutlet=\"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=\"!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=\"!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 <span class=\"content-row-group\">\r\n <ng-container *ngIf=\"!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=\"contentRowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"contentRowGroup\"\r\n [ngTemplateOutletContext]=\"getContextRowGroup(rowData)\">\r\n </ng-container>\r\n </ng-container>\r\n </span>\r\n </a>\r\n </div>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowGroup\">\r\n <ng-container [ngTemplateOutlet]=\"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=\"summary\" pTemplate=\"summary\">\r\n <ng-container *ngTemplateOutlet=\"summary\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"footer\" pTemplate=\"footer\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"footer; context: {$implicit: columns}\"></ng-container>\r\n </ng-template>\r\n <ng-template *ngIf=\"colgroup\" pTemplate=\"colgroup\" let-columns>\r\n <ng-container *ngTemplateOutlet=\"colgroup; 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 #trHeader let-columns let-funcCheckAll=\"funcCheckAll\">\r\n <tr class=\"title-row\">\r\n <ng-container *ngIf=\"!setting.hiddenCheckbox\">\r\n <th [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [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\" [style.width]=\"widthOrderColumn\" class=\"stt nopad center\"\r\n [class.sticky]=\"setting.stickyColumn\">\r\n {{ 'TT' |translate}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <th *ngIf=\"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 [class.first-th]=\"i==0\" [escape]=\"false\" tooltipPosition=\"top\" [tnSortableColumn]=\"col.field\">\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\" [style.width]=\"widthCheckbox\">\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=\"rowExpansion\" class=\"nopad center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <th *ngIf=\"col.visible && col.field != 'function'\" class=\"cell-header-filter center\">\r\n <ng-container *ngIf=\"col.allowFilter\">\r\n <ng-container *ngIf=\"col.templateFilter\">\r\n <ng-container [ngTemplateOutlet]=\"col.templateFilter\"\r\n [ngTemplateOutletContext]=\"{col: col, filterData: filterData, onSearch: onSearch, onShowFilterDropdownPanel: onShowFilterDropdownPanel, onHideFilterDropdownPanel: onHideFilterDropdownPanel}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.templateFilter\" [ngSwitch]=\"col.controlType\">\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDropdown\"\r\n [ngTemplateOutletContext]=\"{col: col.rawColumn}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'number'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\" [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <ng-container *ngSwitchCase=\"'int'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <ng-container [ngTemplateOutlet]=\"filterNumber\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'datetime'\">\r\n <ng-container [ngTemplateOutlet]=\"filterDate\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngTemplateOutlet]=\"filterBoolean\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"filterText\"\r\n [ngTemplateOutletContext]=\"{col: col}\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </th>\r\n </ng-container>\r\n <th *ngIf=\"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 (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 (click)=\"showSettingsWorkflow()\"></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 [style.width]=\"widthFunctionColumn || _widthFunctionColumn\">\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 [tnReorderableRow]=\"index\" [attr.rowIndex]=\"index\"\r\n [ngClass]=\"mergeClassObj(rowData, { '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\">\r\n <td [style.width]=\"widthCheckbox\" class=\"chkbox link-or-action cell-checkbox\"\r\n [class.sticky]=\"setting.stickyColumn\">\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 *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n <td *ngIf=\"!setting.hiddenOrderColumn && (!rowData.hidden || !rowData.hidden[fieldOrder])\"\r\n [style.width]=\"widthOrderColumn\" 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]=\"getBookmarkColor(rowData, columns)\"></span>\r\n {{rowData[fieldOrder]}}\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n <td *ngIf=\"rowExpansion\" class=\"no-padding center row-expansion-toggle\" [class.sticky]=\"setting.stickyColumn\">\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\" class=\"no-padding center\">\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\">\r\n <td class=\"text-center column-function\" style=\"text-align: center;\" [class.sticky]=\"setting.stickyColumn\">\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=\"fas fa-history\"\r\n class=\"p-button-rounded p-button-success link-or-action\" pTooltip=\"Xem l\u1ECBch s\u1EED phi\u00EAn b\u1EA3n\"\r\n tooltipPosition=\"top\" (click)=\"showListVersion(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple [disabled]=\"disableEdit(rowData)\"\r\n 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\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\" class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"delete(rowData)\"></button>\r\n <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-rounded\" pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\"\r\n tooltipPosition=\"top\" (click)=\"showContextMenu($event, rowData)\"></button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\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 || !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\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"view(rowData)\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, expanded, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded,this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, expanded, this)\">\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 #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> ({{rowGroupMetadata[rowData[_groupField]].size}})</span>\r\n</ng-template>\r\n<ng-template #entityWorkflowStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <span class=\"content\">{{rowData.statusString ? rowData.statusString : rowData.strcurrentStateCode}}</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 (click)=\"showActionWorkflow($event, rowData)\"></button>\r\n </div>\r\n</ng-template>\r\n<ng-template #workflowCoreStatus let-rowData=\"rowData\">\r\n <div class=\"container-text-workflow\">\r\n <a class=\"content\" (click)=\"goToTask($event)\" href=\"javascript:;\">{{rowData.strworkflowCoreStatus}}</a>\r\n </div>\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\r\n [options]=\"[{value: true, label: 'C\u00F3', icon: 'pi pi-check'}, {value: false, label: 'Kh\u00F4ng', icon: 'pi pi-times'}]\"\r\n [multiple]=\"true\" [(ngModel)]=\"filterData[col.field]\" (onChange)=\"onChangeBoolean($event, col.field)\">\r\n <ng-template let-item>\r\n <i style=\"padding: 3px 0;\" [class]=\"item.icon\"></i>\r\n </ng-template>\r\n </p-selectButton>\r\n </div>\r\n</ng-template>",
|
|
2483
2334
|
providers: [DecimalPipe, DatePipe],
|
|
2484
2335
|
styles: [".container-table{display:flex;flex-direction:column;overflow:hidden}.container-table .container-table-inner{display:flex;height:auto;max-height:100%;min-height:60px;position:relative}.container-table-inner>tn-custom-scrollbar{width:100%}.cell-checkbox{text-align:center}.pick-color-row{border:1px solid #d1d1d1;border-radius:2px;bottom:0;cursor:pointer;display:flex;flex-wrap:wrap;height:1.4em;left:0;margin:auto;position:absolute;right:0;top:0;width:1.4em}.pick-color-row>div{background:#84d140;border:1px solid #fff;flex:0 0 50%}.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{align-items:center;display:flex}.cell-header-function>span{flex:1 1;text-align:center}.cell-header-function button{height:24px;margin:0;padding:0;width:24px}.group-icon{color:#256aa2;font-weight:400}.group-icon i{font-size:.8em;margin-right:5px}.center{text-align:center!important}.row-card{height:100%;left:0;position:absolute;top:0;width:5px}.column-function{min-width:80px;padding:0}.custom-search-area{background-color:#f2f2f2;margin:-.5em -1em .5em;padding-left:.5em;padding-right:.5em}.main-container-search-inner{margin-bottom:-.5em}.filter-row>th:not(.sticky):not(.chkbox){padding:3px!important}.container-text-workflow{align-items:center;display:flex;justify-content:center}.container-text-workflow .link-or-action{color:#2196f3;cursor:pointer}.container-text-workflow .content{flex:1 1}.btnReload{height:2rem;left:50%;position:absolute;top:50%;transform:translate(-50%,calc(-50% - 1px));width:2rem}.toggle-showfull{color:#00f;cursor:pointer;font-size:.8rem;font-weight:700;white-space:nowrap}::ng-deep crud-list .advance-search-container{display:flex;justify-content:flex-end}::ng-deep crud-list advance-search{display:block;flex:1;max-width:400px}::ng-deep crud-list .main-container-search-inner .container-control>div{overflow:hidden}::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{min-width:200px;position:fixed;z-index:10}::ng-deep crud-list .p-datatable .p-datatable-thead>tr>th .container-icon-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}::ng-deep crud-list .check-all-custom{height:0;position:absolute;width: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{background-color:#fff;border-radius:3px;display:flex;min-width:0}::ng-deep crud-list .cell-header-filter .filter-box>div{border:1px solid #ced4da;border-radius:3px 0 0 3px;border-right:none;flex:1;outline:none;overflow:hidden}::ng-deep crud-list .cell-header-filter .filter-box>span{align-items:center;background:#f5f6f8;border:1px solid #ced4da;color:#6c757d;cursor:pointer;display:inline-flex;flex-basis:32px;height:32px;justify-content:center;min-width:unset;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{border:none;box-shadow:none!important;padding-left:5px;padding-right:5px}::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{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;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{box-shadow:5px 0 15px 1px rgba(0,0,0,.27058823529411763);min-width:250px;position:absolute;top:calc(50% - 16px);z-index:2}::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{border-color:#2196f3;box-shadow:0 0 0 .2rem #a6d5fa;flex:1;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:translateX(-50%)}::ng-deep crud-list .cell-header-filter:last-child .filter-box{right:3px}::ng-deep crud-list .table-border-line{background-color:#eee;position:absolute;z-index:5}::ng-deep crud-list .table-border-line.--left,::ng-deep crud-list .table-border-line.--right{bottom:0;top:0;width:1px}::ng-deep crud-list .table-border-line.--bottom,::ng-deep crud-list .table-border-line.--top{height:1px;left:0;right:0}::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}}"]
|
|
2485
2336
|
},] }
|
|
@@ -2567,4 +2418,4 @@ CrudListComponent.propDecorators = {
|
|
|
2567
2418
|
onRollbackedWorkflow: [{ type: Output }],
|
|
2568
2419
|
onChangedStatusWorkflow: [{ type: Output }]
|
|
2569
2420
|
};
|
|
2570
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1saXN0L2NydWQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUVILFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUM5RyxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFBcUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xHLE9BQU8sRUFDSCx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFDdEYsZUFBZSxFQUFFLFFBQVEs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dXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlLCBEZWNpbWFsUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBBZnRlckNvbnRlbnRJbml0LFxyXG4gICAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFBpcGVUcmFuc2Zvcm0sXHJcbiAgICBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL2NvbnRleHRtZW51JztcclxuaW1wb3J0IHsgVGFibGUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy90YWJsZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBFbnVtR2V0UmVmVHlwZSwgS2V5RmllbGRHZXRSZWZUeXBlLCBLZXlGbGFzaFNob3cgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IEVudmlyb25tZW50U2NoZW1hLCBpc0FycmF5LCBpc0xpdGVyYWxPYmplY3QgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Vudmlyb25tZW50LXNjaGVtYSc7XHJcbmltcG9ydCB7XHJcbiAgICBDaGVja0JveExpc3RDb250cm9sU2NoZW1hLCBDb2x1bW5TY2hlbWFCYXNlLCBDb250cm9sVHlwZSwgQ3J1ZExpc3RDb25maWcsIENydWRMaXN0RGF0YSxcclxuICAgIENydWRMaXN0U2V0dGluZywgRGF0YVR5cGUsIERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hLCBEaWFsb2dNb2RlbCwgRHJvcGRvd25Db250cm9sU2NoZW1hLFxyXG4gICAgRXhwb3J0SXRlbXNNb2RlLCBGb3JtQ29udHJvbEJhc2UsIEhlaWdodFR5cGUsIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSwgT3BlcmF0b3IsIFBvcHVwU2l6ZSxcclxuICAgIFRleHRBbGlnbiwgVGV4dENvbnRyb2xTY2hlbWFcclxufSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcclxuaW1wb3J0IHsgQWN0aW9uLCBFbnVtV0ZOaG9tVHJhbmdUaGFpLCBNYW5hZ2VyVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvd29ya2Zsb3ctc2NoZW1hJztcclxuaW1wb3J0IHsgRmlsdGVyLCBHcmlkSW5mbywgU29ydCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEN1c3RvbVJvdXRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jdXN0b20tcm91dGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktbWV0YWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9leHBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBtdWx0aXBsZVNvcnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9hcnJheSc7XHJcbmltcG9ydCB7IGFkZFplcm8gfSBmcm9tICcuLi8uLi8uLi91dGlscy9kYXRlJztcclxuaW1wb3J0IHsgU2VhcmNoSW5mbyB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gnO1xyXG5pbXBvcnQgeyBTdGF0ZU1hY2hpbmVzU2VydmljZSB9IGZyb20gJy4uLy4uL3N0YXRlbWFjaGluZXMvc2VydmljZXMvc3RhdGVtYWNoaW5lcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi90bi1jdXN0b20tc2Nyb2xsYmFyL3RuLWN1c3RvbS1zY3JvbGxiYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgV2ZJdGVtIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvbW9kZWxzL21vZGVscyc7XHJcbmltcG9ydCB7IENhbkJvX0hvU29TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvY2FuYm8taG9zby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZSB9IGZyb20gJy4uLy4uL3dvcmtmbG93L3NlcnZpY2VzL2VudGl0eS13b3JrZmxvdy1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvd29ya2Zsb3ctaGlzdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZGF0YVNvdXJjZUljb24gfSBmcm9tICcuLi8uLi93b3JrZmxvdy93b3JrZmxvdy1zZXR0aW5nL3dvcmtmbG93LXNldHRpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgYmFzZVRyaW5oS3kgfSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnY3J1ZC1saXN0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtEZWNpbWFsUGlwZSwgRGF0ZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcnVkTGlzdENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XHJcbiAgICB0YWJsZTogVGFibGU7XHJcbiAgICBAVmlld0NoaWxkKFRhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IF90YWJsZSh2OiBUYWJsZSkge1xyXG4gICAgICAgIHRoaXMudGFibGUgPSB2O1xyXG4gICAgICAgIHRoaXMudGFibGVSZWFkeS5uZXh0KHRoaXMpO1xyXG4gICAgfVxyXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgY29udGFpbmVyOiBFbGVtZW50UmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdpY29uVG9nZ2xlUm93R3JvdXAnLCB7IHN0YXRpYzogdHJ1ZSB9KSBpY29uVG9nZ2xlUm93R3JvdXA6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdpY29uVG9nZ2xlUm93RGF0YScsIHsgc3RhdGljOiB0cnVlIH0pIGljb25Ub2dnbGVSb3dEYXRhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgnZW50aXR5V29ya2Zsb3dTdGF0dXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZW1wbGF0ZUVudGl0eVdvcmtmbG93U3RhdHVzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgndHJhbmdUaGFpVjUnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZW1wbGF0ZVRyYW5nVGhhaVY1OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgndmlld0hpc3RvcnknLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZW1wbGF0ZUNvbFZpZXdIaXN0b3J5OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgnd29ya2Zsb3dDb3JlU3RhdHVzJywgeyBzdGF0aWM6IHRydWUgfSkgdGVtcGxhdGVXb3JrZmxvd0NvcmVTdGF0dXM6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxiYXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzY3JvbGxiYXI6IFRuQ3VzdG9tU2Nyb2xsYmFyQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnY29udGV4dE1lbnUnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnc2VhcmNoQ3VzdG9tJywgeyBzdGF0aWM6IHRydWUgfSkgc2VhcmNoQ3VzdG9tOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgaGVhZGVyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnaGVhZGVyRmlsdGVyJywgeyBzdGF0aWM6IHRydWUgfSkgaGVhZGVyRmlsdGVyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgncm93RXhwYW5zaW9uJywgeyBzdGF0aWM6IHRydWUgfSkgcm93RXhwYW5zaW9uOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnc3VtbWFyeScsIHsgc3RhdGljOiB0cnVlIH0pIHN1bW1hcnk6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdmb290ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb290ZXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdjb2xncm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIGNvbGdyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgncm93R3JvdXAnLCB7IHN0YXRpYzogdHJ1ZSB9KSByb3dHcm91cDogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2NvbnRlbnRSb3dHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRlbnRSb3dHcm91cDogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGNoaWxkcmVuOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gICAgQElucHV0KCkgbW9kZWw6IENydWRMaXN0RGF0YSA9IG5ldyBDcnVkTGlzdERhdGEoKTtcclxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRMaXN0U2V0dGluZyA9IG5ldyBDcnVkTGlzdFNldHRpbmcoKTtcclxuICAgIEBJbnB1dCgpIGZpbGVOYW1lID0gJ2V4cG9ydCc7XHJcbiAgICBASW5wdXQoKSBsYXp5ID0gdHJ1ZTsgLy8gxJHhurd0IGdpw6EgdHLhu4sgbsOgeSBi4bqxbmcgZmFsc2UgdGjDrCBz4bq9IGZpbHRlciDEkWMgY2xpZW50XHJcblxyXG4gICAgLy8gZHVuZyBkb24gdmkgcmVtIGRlIHdpZHRoIGtob25nIGJpIGFuaCBodW9uZyBib2kgZm9udCBzaXplIGN1YSB0aCwgbm8gc2UgbGF5IHRoZW8gZm9udCBzaXplIGN1YSB0aGUgaHRtbFxyXG4gICAgQElucHV0KCkgd2lkdGhDaGVja2JveCA9ICcyLjVyZW0nO1xyXG4gICAgQElucHV0KCkgd2lkdGhPcmRlckNvbHVtbiA9ICczLjVyZW0nO1xyXG4gICAgX2RlZmF1bHRXaXRoRnVuY3Rpb25Db2x1bW4gPSA4MTtcclxuICAgIF93aWR0aEZ1bmN0aW9uQ29sdW1uID0gYCR7dGhpcy5fZGVmYXVsdFdpdGhGdW5jdGlvbkNvbHVtbn1weGA7XHJcbiAgICBASW5wdXQoKSB3aWR0aEZ1bmN0aW9uQ29sdW1uOiBzdHJpbmc7XHJcbiAgICBfY2xhc3NSb3dHcm91cCA9ICduby1wYWRkaW5nJztcclxuICAgIEBJbnB1dCgpIHNldCBjbGFzc1Jvd0dyb3VwKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xhc3NSb3dHcm91cCA9IGBuby1wYWRkaW5nICR7dmFsdWV9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzUm93R3JvdXAgPSBgbm8tcGFkZGluZ2A7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgQElucHV0KCkgc2hvd1Njcm9sbEJhciA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxhYmxlID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwVGFibGVTY3JvbGxIZWlnaHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBASW5wdXQoKSByZXNwb25zaXZlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGNvbmZpZ1Njcm9sbEJhcjogYW55O1xyXG4gICAgQElucHV0KCkgc2hvd1Njcm9sbEhvcml6b250YWwgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2hvd1JhZGlvID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBoaWRkZW5BZGQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuRWRpdCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuVmlldyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZGlzYWJsZUtleXByZXNzQ29udHJvbCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgY2FuY2VsQnViYmxlID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGVzY2FwZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBjb25maWc6IENydWRMaXN0Q29uZmlnID0gbmV3IENydWRMaXN0Q29uZmlnKCk7XHJcbiAgICBASW5wdXQoKSBlbmFibGVSZW9yZGVyUm93ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBJbnB1dCgpIHRlbXBsYXRlc0Zyb21QYXJlbnQ6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBJbnB1dCgpIGNoaWxkcmVuRnJvbVBhcmVudDogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gICAgQElucHV0KCkgbWVudUJ1dHRvbnM6IChyb3dEYXRhKSA9PiBNZW51SXRlbVtdO1xyXG4gICAgQElucHV0KCkgZmllbGRPcmRlcjogc3RyaW5nID0gJ19pbmRleCc7XHJcblxyXG4gICAgX3N0eWxlOiBhbnkgPSB7fTtcclxuICAgIEBJbnB1dCgpIHNldCBzdHlsZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNldCB0YWJsZUNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudHJpbSgpICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIF9kYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgc2V0IGRhdGFTb3VyY2UodmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTb3VyY2UgPSBbXTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgZGF0YVNvdXJjZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xyXG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG4gICAgfVxyXG4gICAgLy8gZmlsdGVyIG3hurdjIMSR4buLbmggY2hvIGRldiBjb2RlXHJcbiAgICBASW5wdXQoKSBmaWx0ZXJfZGVmYXVsdDogRmlsdGVyW10gPSBbXTtcclxuXHJcbiAgICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZW9yZGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGVja0FsbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblJlbG9hZDogRXZlbnRFbWl0dGVyPEdyaWRJbmZvPiA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZEluZm8+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWxvYWRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ29udGVudEluaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZGQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uVmlldzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZU11bHRpcGxlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uSW52YWxpZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWZ0ZXJUcmluaEt5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uU3RhcnRlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUHJvY2Vzc2VkV29ya2Zsb3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Sb2xsYmFja2VkV29ya2Zsb3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2VkU3RhdHVzV29ya2Zsb3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSB0YWJsZVJlYWR5ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgdGFibGVSZWFkeVNvdXJjZSQgPSB0aGlzLnRhYmxlUmVhZHkuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICByb3dHcm91cENoZWNrZWQ6IGFueSA9IHt9O1xyXG4gICAgcm93R3JvdXBNZXRhZGF0YTogYW55ID0ge307XHJcbiAgICBkYXRhU291cmNlSW50ZXJuYWw6IGFueVtdO1xyXG4gICAgY2xhc3NUb29sYmFyID0gJyc7XHJcbiAgICBpdGVtU2V0dGluZ3M6IGFueSA9IHt9O1xyXG4gICAgc29ydEhpc3Rvcnk6IFNvcnRbXSA9IFtdO1xyXG4gICAgc29ydENsaWVudEhpc3Rvcnk6IGFueSA9IHt9O1xyXG4gICAgX2dyb3VwRmllbGQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBlbmFibGVkV2YxID0gdW5kZWZpbmVkO1xyXG4gICAgc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gZmFsc2U7XHJcbiAgICBidXR0b25Db250ZXh0czogTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIF9kZWZhdWx0VGFibGVDbGFzcyA9ICduZXctdGFibGUgc2NyLXRhYmxlIGNydWQtbGlzdC10YWJsZSc7XHJcbiAgICBfdGFibGVDbGFzcyA9ICcnO1xyXG4gICAgX3Nob3dTZXR0aW5nc1Jvd0NvbG9yID0gZmFsc2U7XHJcbiAgICBfc2hvd1NldHRpbmdzID0gZmFsc2U7XHJcbiAgICBfc2hvd1NldHRpbmdzV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgIF9zaG93U2V0dGluZ3NQZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICBfY29sb3JGaWx0ZXJUYWJsZSA9IFtdO1xyXG4gICAgX3NvcnRGaWVsZCA9ICcnO1xyXG4gICAgX3NvcnREaXI6IC0xIHwgMCB8IDEgfCAyID0gLTE7XHJcblxyXG4gICAgdGVtcGxhdGU6IGFueSA9IHt9O1xyXG4gICAgdGVtcGxhdGVGaWx0ZXI6IEZpbHRlcltdID0gW107XHJcbiAgICB0ZW1wbGF0ZUhlYWRlckNvbnRlbnQ6IGFueSA9IHt9O1xyXG5cclxuICAgIGNhY2hlZFRyYW5zZm9ybXMgPSB7fTtcclxuXHJcbiAgICBmaWx0ZXJTY2hlbWE6IGFueSA9IHt9O1xyXG4gICAgZmlsdGVyRGF0YTogYW55ID0ge307XHJcbiAgICBzZWFyY2hJbmZvOiBTZWFyY2hJbmZvID0gbmV3IFNlYXJjaEluZm8oKTtcclxuICAgIGNyZWF0aW5nU2VhcmNoSW5mbyA9IGZhbHNlO1xyXG5cclxuICAgIGZpbHRlcl9jdXN0b206IEZpbHRlcltdID0gW107XHJcbiAgICAvLyBmaWx0ZXIgY+G7p2EgYWR2YW5jZSBzZWFyY2ggdHLhuqMgduG7gVxyXG4gICAgZmlsdGVyX2FkdmFuY2VTZWFyY2g6IEZpbHRlcltdID0gW107XHJcbiAgICAvLyBmaWx0ZXIgdGhlbyBjw6FjIGZpbHRlciBoaeG7g24gdGjhu4sgdHJvbmcgY+G7mXQgY+G7p2EgZ3JpZFxyXG4gICAgZmlsdGVyX2NvbHVtbjogRmlsdGVyW10gPSBbXTtcclxuXHJcbiAgICB0aW1lb3V0OiBhbnk7XHJcbiAgICBpbnRlcnZhbDogYW55O1xyXG4gICAgZGF0YUFkdmFuY2U6IGFueSA9IHt9O1xyXG5cclxuICAgIGN1cnJlbnRJdGVtOiBhbnk7XHJcbiAgICBzaG93Rm9ybVdvcmtmbG93ID0gZmFsc2U7XHJcbiAgICBoZWFkZXJXb3JrZmxvdyA9ICcnO1xyXG4gICAgYWN0aW9uV29ya2Zsb3c6IEFjdGlvbjtcclxuICAgIHBvcHVwU2l6ZVdvcmtmbG93OiBQb3B1cFNpemUgPSBuZXcgUG9wdXBTaXplKHsgd2lkdGg6IDk1MCwgaGVpZ2h0OiA1NDAgfSk7XHJcbiAgICBzaG93SGlzdG9yeVdvcmtmbG93ID0gZmFsc2U7XHJcblxyXG4gICAgc3RhcnRXb3JrZmxvd01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnQ2jhu41uIHF1eSB0csOsbmggbmdoaeG7h3AgduG7pSBz4butIGThu6VuZydcclxuICAgIH0pO1xyXG4gICAgcHJvY2Vzc1dvcmtmbG93TW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKCk7XHJcbiAgICB3b3JrZmxvd1NldHRpbmdNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoKTtcclxuICAgIHdvcmtmbG93SGlzdG9yeU1vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XHJcbiAgICAgICAgaGVhZGVyOiAnWGVtIGzhu4tjaCBz4butJ1xyXG4gICAgfSk7XHJcblxyXG4gICAgZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XHJcbiAgICBlbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlOiBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlO1xyXG5cclxuICAgIHN0YXRlTWFjaGluZXNTZXJ2aWNlOiBTdGF0ZU1hY2hpbmVzU2VydmljZTtcclxuXHJcbiAgICBjYW5Cb19Ib1NvU2VydmljZTogQ2FuQm9fSG9Tb1NlcnZpY2U7XHJcblxyXG4gICAgc291cmNlSWNvbjogYW55ID0ge307XHJcbiAgICBzdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZEl0ZW1MYXN0OiBhbnk7XHJcblxyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueTtcclxuICAgIGVudmlyb25tZW50OiBFbnZpcm9ubWVudFNjaGVtYTtcclxuXHJcbiAgICBwdWJsaWMgX3JvdXRlcjogUm91dGVyO1xyXG4gICAgcHVibGljIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XHJcbiAgICBwdWJsaWMgX2N1c3RvbVJvdXRlclNlcnZpY2U6IEN1c3RvbVJvdXRlclNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX3VuU3Vic2NyaWJlQWxsID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHB1YmxpYyBfZXhwb3J0U2VydmljZTogRXhwb3J0U2VydmljZTtcclxuICAgIHB1YmxpYyBfbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZTtcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBfaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfc2FudGlsaXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgICAgIHB1YmxpYyBfZGF0ZVBpcGU6IERhdGVQaXBlLFxyXG4gICAgICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZ1NlcnZpY2U6IE1vZHVsZUNvbmZpZ1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVkUm91dGUgPSB0aGlzLl9pbmplY3Rvci5nZXQoQWN0aXZhdGVkUm91dGUpO1xyXG4gICAgICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ3VzdG9tUm91dGVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fZXhwb3J0U2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChFeHBvcnRTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9sb2dnZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KExvZ2dlclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuZW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLnN0YXRlTWFjaGluZXNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFN0YXRlTWFjaGluZXNTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmNhbkJvX0hvU29TZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENhbkJvX0hvU29TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrQWxsID0gdGhpcy5oYW5kbGVDaGVja0FsbC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tBbGxfR3JvdXAgPSB0aGlzLmhhbmRsZUNoZWNrQWxsX0dyb3VwLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5FTlRJVFlfTUVUQURBVEFfUkVMT0FERUQsIHNlcnZpY2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVudGl0eU1ldGFkYXRhU2VydmljZSA9IHNlcnZpY2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRhdGVSYW5nZSA9IG5ldyBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSh7IGFwcGVuZFRvOiAnYm9keScgfSk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTY2hlbWEuZHJvcGRvd24gPSB7fTtcclxuXHJcbiAgICAgICAgZGF0YVNvdXJjZUljb24uZm9yRWFjaChzb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUljb25bc291cmNlLmlkXSA9IHNvdXJjZS50ZW47XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudGVtcGxhdGVGaWx0ZXIgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl90YWJsZUNsYXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgPSB0aGlzLl9kZWZhdWx0VGFibGVDbGFzcztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBUYWJsZUNsYXNzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdENvbHVtblNjaGVtYSh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTZWFyY2hTY2hlbWEoKTtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5oaWRkZW5UcmluaEt5ICYmICF0aGlzLm1lbnVCdXR0b25zKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVudUJ1dHRvbnMgPSAoKSA9PiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gTuG6v3UgbcOgIOG6qW4gYWR2YW5jZXNlYXJjaCA9PiBz4bq9IGtow7RuZyBjw7MgdHJpZ2dlciBsb2FkIGRhdGEgdOG7qyBhZHZhbmNlIHNlYXJjaCA9PiBwaOG6o2kgdOG7sSBn4buNaSBnZXREYXRhIOG7nyBPbkluaXRcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkFkdmFuY2VTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wuZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5maW5kVGVtcGxhdGUoYGhlYWRlciR7Y29sLmZpZWxkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpfSR7Y29sLmZpZWxkLnN1YnN0cmluZygxKX1gKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVIZWFkZXJDb250ZW50W2NvbC5maWVsZF0gPSB0ZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub25Db250ZW50SW5pdC5lbWl0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldHVwVGFibGVDbGFzcygpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLm11bHRpcGxlQ2hlY2tXaGVuQ2xpY2tSb3cgfHwgIXRoaXMuc2V0dGluZy5oaWRkZW5DaGVja2JveCkge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzICs9ICcgbXVsdGktY2hlY2snO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIHNpbmdsZS1jaGVjayc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnN0aWNreUNvbHVtbikge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzICs9ICcgc3RpY2t5LWNvbHVtbnMtYWN0aXZlJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIGhpZGRlbi1jb2x1bW4tY2hlY2tib3gnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtbikge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzICs9ICcgaGlkZGVuLWNvbHVtbi1vcmRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRDb2x1bW5TY2hlbWEoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdKSB7XHJcbiAgICAgICAgaWYgKGNvbHMpIHtcclxuICAgICAgICAgICAgbGV0IGNvbEZ1bmN0aW9uID0gbnVsbCwgY29sR3JvdXAgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmZpZWxkID09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2xGdW5jdGlvbiA9IGNvbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5ncm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbC5ncm91cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbEdyb3VwID0gY29sO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKGNvbEZ1bmN0aW9uICYmICFjb2xGdW5jdGlvbi53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2lkdGhGdW5jdGlvbkNvbHVtbiA9IGNvbEZ1bmN0aW9uLndpZHRoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29sb3JTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29sdW1uU2V0dGluZyhjb2xHcm91cCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFnZVNldHRpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5leHRlbmRDb2x1bW5zKHRoaXMuc2V0dGluZy5jb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtYXRDb2x1bW5zKHRoaXMuc2V0dGluZy5jb2xzKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUNvbHVtblNldHRpbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5idWlsZEZpbHRlckNvbHVtbih0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZXh0ZW5kQ29sdW1ucyhjb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10sIGFwcGVuZENvbCA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWNvbHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHRlbXA6IENvbHVtblNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHRtcENvbHMgPSBbLi4uY29sc107XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscy5mb3JFYWNoKGNvbFJlb3JkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHNbaV0uZmllbGQgPT0gY29sUmVvcmRlci5jb2x1bW5Db2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaChjb2xzW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29scy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEPDsm4gbOG6oWkgbmjhu69uZyBjb2RlIG3DoCBraMO0bmcgxJHGsOG7o2MgY+G6pXUgaMOsbmggdGjDrCBnaMOpcCBs4bqhaSB0aGVvIGluZGV4IMSRxrDhu6NjIGtoYWkgYsOhb1xyXG4gICAgICAgICAgICBsZXQgdGVtcENvbHM6IENvbHVtblNjaGVtYUJhc2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBpbmRleENvbE9sZCA9IHRtcENvbHMuZmluZEluZGV4KHAgPT4gcC5maWVsZCA9PSBjb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4Q29sT2xkID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wLnNwbGljZSgwLCAwLCBjb2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVMOsbSB24buLIHRyw60gY+G7p2EgY+G7mXQgcGjDrWEgdHLGsOG7m2MgdHJvbmcgbGlzdCByZW9yZGVyIG3hu5tpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4Q29sQmVmb3JlTmV3ID0gdGVtcC5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4Q29sQmVmb3JlTmV3ID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBDb2xzLnNwbGljZSgwLCAwLCBjb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUw6xtIHbhu4sgdHLDrSBj4bunYSBj4buZdCB0csaw4bubYyBj4buZdCDEkWFuZyBraeG7g20gdHJhIHRyb25nIGxpc3QgY+G7mXQgZ+G7kWNcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb2xPbGQgPSB0bXBDb2xzLmZpbmRJbmRleChwID0+IHAuZmllbGQgPT0gdG1wQ29sc1tpbmRleENvbE9sZCAtIDFdLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhDb2xCZWZvcmVOZXcgPSB0ZW1wLmZpbmRJbmRleChwID0+IHAuZmllbGQgPT0gdG1wQ29sc1tpbmRleENvbE9sZCAtIDFdLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gPT4gxJDhur9uIGtoaSB0aOG6pXkgdGjDrCBhZGQgY+G7mXQgaGnhu4duIHThuqFpIHbDoCBsaXN0IHThuqFtIHbDoG8gduG7iyB0csOtIGNow6huXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4Q29sQmVmb3JlTmV3ID09IHRlbXAubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goY29sLCAuLi50ZW1wQ29scyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnNwbGljZShpbmRleENvbEJlZm9yZU5ldyArIDEsIDAsIGNvbCwgLi4udGVtcENvbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29scyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjb2xzLnNwbGljZSgwLCBjb2xzLmxlbmd0aCk7XHJcbiAgICAgICAgY29scy5zcGxpY2UoMCwgMCwgLi4udGVtcCk7XHJcblxyXG4gICAgICAgIGxldCBmaXJzdENvbFZpc2libGUgPSBudWxsO1xyXG4gICAgICAgIGxldCBmb3VuZEl0ZW1TaG93RWRpdExpbmsgPSBmYWxzZTtcclxuICAgICAgICB0ZW1wLnNwbGljZSgwLCB0ZW1wLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IHRtcENvbDogQ29sdW1uU2NoZW1hQmFzZSA9IG51bGw7XHJcbiAgICAgICAgZm9yIChjb25zdCBpbmQgaW4gY29scykge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29sc1tpbmRdO1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5yYXdDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRlbXAucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscy5maW5kKHAgPT4gcC5jb2x1bW5Db2RlID09IGVsZW1lbnQuZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcudmlzaWJsZSAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy52aXNpYmxlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZpc2libGUgPSBjb25maWcudmlzaWJsZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubGFiZWwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQubGFiZWwgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZWxlbWVudC5sYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnRleHRBbGlnbiAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy50ZXh0QWxpZ24gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudGV4dEFsaWduID0gY29uZmlnLnRleHRBbGlnbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcud2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb25maWcud2lkdGggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQud2lkdGggPSBjb25maWcud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGFUeXBlID09IG51bGwgfHwgZWxlbWVudC5kYXRhVHlwZSA9PSB1bmRlZmluZWQgfHwgZWxlbWVudC5kYXRhVHlwZSA9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhVHlwZSA9IERhdGFUeXBlLnN0cmluZztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudmlzaWJsZVxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuc2V0dGluZy5ncm91cENvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnQuZmllbGQgPT0gdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLmZpZWxkXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYmFzZVNlcnZpY2UgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29udHJvbFR5cGUgPSBDb250cm9sVHlwZS5kcm9wZG93bjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQucmF3Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZE5lZWRHZXRSZWYucHVzaChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFtLZXlGaWVsZEdldFJlZlR5cGVdID0gRW51bUdldFJlZlR5cGUuU0VSVkVSO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWVGaWVsZCA9ICdpZCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGxheUZpZWxkID0gJ3Rlbic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sID0gbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0NvbHVtbjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5kcm9wZG93bixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlUmVmRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3N0cicgKyBlbGVtZW50LmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dGaWx0ZXI6IGVsZW1lbnQuYWxsb3dGaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZ1JlZkZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscy5maW5kKHAgPT4gcC5jb2x1bW5Db2RlID09IHRtcENvbC5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdSZWZGaWVsZCAmJiBjb25maWdSZWZGaWVsZC52aXNpYmxlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbC52aXNpYmxlID0gY29uZmlnUmVmRmllbGQudmlzaWJsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2godG1wQ29sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RDb2xWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbFZpc2libGUgPSB0bXBDb2w7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LmRhdGFTb3VyY2UgJiYgZWxlbWVudC5kYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRyb2xUeXBlID0gQ29udHJvbFR5cGUuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLkxPQ0FMO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2wgPSBuZXcgQ29sdW1uU2NoZW1hQmFzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Q29sdW1uOiBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGU6IENvbnRyb2xUeXBlLmRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IGVsZW1lbnQuZGF0YVR5cGVSZWZGaWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VTZXJ2aWNlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdzdHInICsgZWxlbWVudC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBlbGVtZW50LmFsbG93RmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkUmVmQ29sdW1uOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdSZWZGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSB0bXBDb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnUmVmRmllbGQgJiYgY29uZmlnUmVmRmllbGQudmlzaWJsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2wudmlzaWJsZSA9IGNvbmZpZ1JlZkZpZWxkLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKHRtcENvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2xWaXNpYmxlID0gdG1wQ29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29sVmlzaWJsZSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5mb3JjZUdldERhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmJhc2VTZXJ2aWNlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFtLZXlGaWVsZEdldFJlZlR5cGVdID0gRW51bUdldFJlZlR5cGUuU0VSVkVSO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbHVlRmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlRmllbGQgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5RmllbGQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BsYXlGaWVsZCA9ICd0ZW4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5zaG93RWRpdExpbmspIHtcclxuICAgICAgICAgICAgICAgIGZvdW5kSXRlbVNob3dFZGl0TGluayA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmb3VuZEl0ZW1TaG93RWRpdExpbmsgJiYgZmlyc3RDb2xWaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGZpcnN0Q29sVmlzaWJsZS5zaG93RWRpdExpbmsgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb2xzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgY29scy5wdXNoKC4uLnRlbXApO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnNvcnQoXHJcbiAgICAgICAgICAgIG11bHRpcGxlU29ydCh7IG5hbWU6ICdzb3J0JywgcHJpbWVyOiBhID0+IGEgPT0gbnVsbCB9LCAnb3JkZXInKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGggPSBbXTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZCA9IFtdO1xyXG4gICAgICAgIGNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNvbC52aXNpYmxlKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChjb2wubWF4V29yZERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1Xb3JkLnB1c2goY29sKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb2wubWF4TGVuZ3RoRGlzcGxheSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkSGFzTWF4aW11bUxlbmd0aC5wdXNoKGNvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZm9ybWF0Q29sdW1ucyhjb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10pOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzKSB7XHJcbiAgICAgICAgICAgIGNvbC5leHRlbmREYXRhLnN0eWxlID0gdGhpcy5nZXRDb2x1bW5TdHlsZShjb2wpO1xyXG4gICAgICAgICAgICBjb2wuZXh0ZW5kRGF0YS5oZWFkZXJTdHlsZSA9IHRoaXMuZ2V0Q29sdW1uU3R5bGUoY29sLCB0cnVlKTtcclxuICAgICAgICAgICAgY29sLmV4dGVuZERhdGEuaGVhZGVyQ2xhc3MgPSB0aGlzLmdldENlbGxDbGFzc0hlYWRlcihjb2wpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbHVtblNldHRpbmcoY29sR3JvdXA6IENvbHVtblNjaGVtYUJhc2UpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4gPSBjb2xHcm91cDtcclxuICAgICAgICBjb25zdCBkYXRhU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTFVNTl9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVNldHRpbmcpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGRhdGFTZXR0aW5nKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR0aW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNldHRpbmdzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkID0gZWxlbWVudC5zZXR0aW5nLnNvcnRGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyID0gZWxlbWVudC5zZXR0aW5nLnNvcnREaXIgPyBlbGVtZW50LnNldHRpbmcuc29ydERpciA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXIgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkID0gZWxlbWVudC5zZXR0aW5nLmdyb3VwRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkICYmIGNvbEdyb3VwICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHcm91cEZpZWxkKGNvbEdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZGV0YWlscyA9IGVsZW1lbnQuc2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbEdyb3VwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0R3JvdXBGaWVsZChjb2xHcm91cCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0R3JvdXBGaWVsZChjb2xHcm91cCkge1xyXG4gICAgICAgIGlmICgoY29sR3JvdXAuZGF0YVNvdXJjZSAmJiBjb2xHcm91cC5kYXRhU291cmNlLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgIHx8IGNvbEdyb3VwLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBgc3RyJHtjb2xHcm91cC5maWVsZH1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGNvbEdyb3VwLmZpZWxkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVDb2x1bW5TZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGNvbHVtblNldHRpbmcgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGNvbHVtblNldHRpbmcuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0dGluZy5zb3J0RmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXR0aW5nLnNvcnREaXIgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0dGluZy5ncm91cEZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldHRpbmcuZGV0YWlscyA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHM7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIGNvbHVtblNldHRpbmcucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgc2V0dGluZzogdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xVTU5fU0VUVElORywgSlNPTi5zdHJpbmdpZnkoY29sdW1uU2V0dGluZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sb3JTZXR0aW5nKCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFQYWdlU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTE9SX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhUGFnZVNldHRpbmcpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGRhdGFQYWdlU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZXR0aW5nc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkID0gZWxlbWVudC5jb2xvckZpbHRlckZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlID0gZWxlbWVudC5jb2xvckZpbHRlclRhYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGVDb2xvclNldHRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhY2hlQ29sb3JTZXR0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbG9yRmlsdGVyVGFibGUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtVmFsdWVzID0gW107XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbMF0gPSBpdGVtLmNvbXBhcmVUeXBlO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzFdID0gaXRlbS5maWx0ZXJWYWx1ZTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1syXSA9IHRoaXMuY29udmVydFRvRGF0ZShpdGVtLmZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1szXSA9IE51bWJlcihpdGVtLmZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1s0XSA9ICgvdHJ1ZS9pKS50ZXN0KGl0ZW0uZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzVdID0gaXRlbS5jb2xvcjtcclxuICAgICAgICAgICAgdGhpcy5fY29sb3JGaWx0ZXJUYWJsZS5wdXNoKGl0ZW1WYWx1ZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbG9yU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjb2xvclNldHRpbmcgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFDb2xvclNldHRpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xPUl9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YUNvbG9yU2V0dGluZykge1xyXG4gICAgICAgICAgICBjb2xvclNldHRpbmcgPSBKU09OLnBhcnNlKGRhdGFDb2xvclNldHRpbmcpO1xyXG4gICAgICAgICAgICBjb2xvclNldHRpbmcuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29sb3JGaWx0ZXJGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29sb3JGaWx0ZXJUYWJsZSA9IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBjb2xvclNldHRpbmcucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgY29sb3JGaWx0ZXJGaWVsZDogdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQsIGNvbG9yRmlsdGVyVGFibGU6IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MT1JfU0VUVElORywgSlNPTi5zdHJpbmdpZnkoY29sb3JTZXR0aW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQYWdlU2V0dGluZygpIHtcclxuICAgICAgICBjb25zdCBkYXRhUGFnZVNldHRpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5QQUdFX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhUGFnZVNldHRpbmcpIHtcclxuICAgICAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcGFnZVNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhUGFnZVNldHRpbmcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2VTZXR0aW5ncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHBhZ2VTZXR0aW5nc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZSA9IGVsZW1lbnQucGFnZVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlUGFnZVNldHRpbmcoKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcGFnZVNldHRpbmcgPSBbXTtcclxuICAgICAgICBsZXQgY2hlY2tFeGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGRhdGFQYWdlU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFQYWdlU2V0dGluZykge1xyXG4gICAgICAgICAgICBwYWdlU2V0dGluZyA9IEpTT04ucGFyc2UoZGF0YVBhZ2VTZXR0aW5nKTtcclxuICAgICAgICAgICAgcGFnZVNldHRpbmcuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucGFnZVNpemUgPSB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjaGVja0V4aXN0KSB7XHJcbiAgICAgICAgICAgIHBhZ2VTZXR0aW5nLnB1c2goeyBwYXRobmFtZTogcGF0aE5hbWUsIHBhZ2VTaXplOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemUgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5QQUdFX1NFVFRJTkcsIEpTT04uc3RyaW5naWZ5KHBhZ2VTZXR0aW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5maXhIZWlnaHRUeXBlSW5EaWFsb2cpIHtcclxuICAgICAgICAgICAgY29uc3QgJGRpYWxvZyA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnLnAtZGlhbG9nJyk7XHJcbiAgICAgICAgICAgIGlmICghISRkaWFsb2cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5oZWlnaHRUeXBlID0gSGVpZ2h0VHlwZS5jdXN0b207XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblJlYWR5LmVtaXQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlU2VsZWN0Um93ID0gKGV2dCwgZGF0YSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhhc0N1c3RvbUhhbmRsZUNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kaXNhYmxlUm93U2VsZWN0V2hlbkNsaWNrQWN0aW9uXHJcbiAgICAgICAgICAgICYmIChldnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnLmxpbmstb3ItYWN0aW9uJylcclxuICAgICAgICAgICAgICAgIHx8IGV2dC50YXJnZXQuY2xvc2VzdCgnLmxpbmstb3ItYWN0aW9uJylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX2NsZWFyU2VsZWN0ZWQoZXZ0KTtcclxuICAgICAgICBpZiAodGhpcy5faXNDbGlja0NoZWNrQm94KGV2dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvbGRDaGVja2VkID0gZGF0YS5fY2hlY2tlZDtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChwLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcC5fY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGEuX2NoZWNrZWQgPSAhb2xkQ2hlY2tlZDtcclxuICAgICAgICBsZXQgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5maXJlRXZlbnRXaGVuUmVTZWxlY3QpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUxhc3QgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGEoZGF0YSwgZXZ0LnRhcmdldC5jbG9zZXN0KCd0cicpLCBmaXJlRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNlbGVjdFJvd0dyb3VwID0gKGV2dCwgZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5kaXNhYmxlUm93U2VsZWN0V2hlbkNsaWNrQWN0aW9uXHJcbiAgICAgICAgICAgICYmIChldnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnLmxpbmstb3ItYWN0aW9uJylcclxuICAgICAgICAgICAgICAgIHx8IGV2dC50YXJnZXQuY2xvc2VzdCgnLmxpbmstb3ItYWN0aW9uJylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRoaXMuX2NsZWFyU2VsZWN0ZWQoZXZ0KTtcclxuICAgICAgICBpZiAodGhpcy5faXNDbGlja0NoZWNrQm94KGV2dCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zTW9kaWZpZWQgPSBbLi4udGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwLl9jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1zTW9kaWZpZWQuc29tZShxID0+IHEuaWQgPT0gZGF0YS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zTW9kaWZpZWQucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtc01vZGlmaWVkLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChpdGVtLCBudWxsLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhLl9jaGVja2VkID0gIWRhdGEuX2NoZWNrZWQ7XHJcblxyXG4gICAgICAgIGxldCBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmZpcmVFdmVudFdoZW5SZVNlbGVjdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1MYXN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChkYXRhLCBldnQudGFyZ2V0LmNsb3Nlc3QoJ3RyJyksIGZpcmVFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRMYXN0SXRlbVNlbGVjdGVkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3QgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXNbdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfaXNDbGlja0NoZWNrQm94KGV2dCkge1xyXG4gICAgICAgIHJldHVybiBldnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncC1jaGVja2JveC1ib3gnKSB8fCBldnQudGFyZ2V0LmNsb3Nlc3QoJy5wLWNoZWNrYm94LWJveCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VtaXRSb3dTZWxlY3QodHJFbGVtZW50LCBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHtcclxuICAgICAgICAgICAgZWxlbWVudDogdHJFbGVtZW50LFxyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpIHtcclxuICAgICAgICB0aGlzLnRhYmxlLnRvZ2dsZVJvdyhyb3dEYXRhLCBldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyB2YWxpZGF0ZVBlcm1pc3Npb24ocm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0gPSByb3dEYXRhO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1TdGF0dXMgPSB0aGlzLnNldHRpbmcud29ya2Zsb3dTZXR0aW5nLnN0YXR1c2VzLmZpbmQocCA9PiBwLnRyYW5nVGhhaUNvbnRhaW5lci5tYSA9PSByb3dEYXRhLmN1cnJlbnRTdGF0ZUNvZGUpO1xyXG4gICAgICAgIC8vIEtp4buDbSB0cmEgbmfGsOG7nWkgZMO5bmcgY8OzIHF1eeG7gW4gxJHhu5FpIHbhu5tpIHRy4bqhbmcgdGjDoWkgY+G7p2EgYuG6o24gZ2hpIGtow7RuZ1xyXG4gICAgICAgIGxldCBoYXNQZXJtaXNzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgdXNlckRhdGEgPSB0aGlzLm1vZGVsLmFkdmFuY2VEYXRhLnVzZXJEYXRhO1xyXG4gICAgICAgIGlmICghdXNlckRhdGEpIHJldHVybiBoYXNQZXJtaXNzaW9uO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IHVzZXJEYXRhLmlkO1xyXG4gICAgICAgIGNvbnN0IHVzZXJJZFVwcGVyID0gdXNlcklkID09IG51bGwgPyBudWxsIDogdXNlcklkLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgY29uc3QgdXNlckdyb3VwSWRzID0gdXNlckRhdGEudXNlckdyb3Vwcy5tYXAoaXRlbSA9PiBpdGVtLmlkKTtcclxuICAgICAgICBjb25zdCB1c2VyT3JnSWRzID0gdXNlckRhdGEub3JnYW5pemF0aW9ucy5tYXAoaXRlbSA9PiBpdGVtLmlkKTtcclxuICAgICAgICBpZiAoaXRlbVN0YXR1cy50eXBlID09IEVudW1XRk5ob21UcmFuZ1RoYWkuQkFUX0RBVSkge1xyXG4gICAgICAgICAgICBpZiAocm93RGF0YS5jcmVhdGVkQnkgJiYgcm93RGF0YS5jcmVhdGVkQnkudG9VcHBlckNhc2UoKSA9PSB1c2VySWRVcHBlcikge1xyXG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtU3RhdHVzLnVzZXJJbmZvLnVzZXJJZHMgIT0gbnVsbCAmJiBpdGVtU3RhdHVzLnVzZXJJbmZvLnVzZXJJZHMuaW5kZXhPZih1c2VySWQpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW1TdGF0dXMuZ3JvdXBJbmZvLmdyb3VwSWRzICE9IG51bGwgJiYgaXRlbVN0YXR1cy5ncm91cEluZm8uZ3JvdXBJZHMuc29tZShxID0+IHVzZXJHcm91cElkcy5pbmRleE9mKHEpID4gLTEpKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtU3RhdHVzLm9yZ0luZm8ub3JnSWRzICE9IG51bGwgJiYgaXRlbVN0YXR1cy5vcmdJbmZvLm9yZ0lkcy5zb21lKHEgPT4gdXNlck9yZ0lkcy5pbmRleE9mKHEpID4gLTEpKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5hZ2VyVHlwZXMgPSBpdGVtU3RhdHVzLnVzZXJJbmZvLm1hbmFnZXJUeXBlcztcclxuICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VyVHlwZXMgIT0gbnVsbCAmJiBtYW5hZ2VyVHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2VySWRMYXN0VXBwZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb25WaUlkTGFzdFVwcGVyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbS51c2VySWRMYXN0SW5Xb3JrZmxvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VySWRMYXN0VXBwZXIgPSB0aGlzLmN1cnJlbnRJdGVtLnVzZXJJZExhc3RJbldvcmtmbG93LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJdGVtLmRvblZpSWRMYXN0SW5Xb3JrZmxvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb25WaUlkTGFzdFVwcGVyID0gdGhpcy5jdXJyZW50SXRlbS5kb25WaUlkTGFzdEluV29ya2Zsb3cudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gTMOgIG5nxrDhu51pIGN14buRaSBjw7luZyB0aGFvIHTDoWMgduG7m2kgYuG6o24gZ2hpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmFnZXJUeXBlcy5pbmRleE9mKE1hbmFnZXJUeXBlLk5HVU9JX0NVT0lfQ1VORykgPiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VySWRMYXN0VXBwZXIgPT0gdXNlcklkVXBwZXJcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFuYWdlclR5cGVzLmluZGV4T2YoTWFuYWdlclR5cGUuTkdVT0lfVEFPKSA+IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvd0RhdGEuY3JlYXRlZEJ5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvd0RhdGEuY3JlYXRlZEJ5LnRvVXBwZXJDYXNlKCkgPT0gdXNlcklkVXBwZXJcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFuYWdlclR5cGVzLmluZGV4T2YoTWFuYWdlclR5cGUuQ0FQX1RSRU4pID4gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuY3VycmVudEl0ZW0uZG9uVmlJZExhc3RJbldvcmtmbG93ID09IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyRGF0YS51c2VyQ2FwRHVvaUlkc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJEYXRhLnVzZXJDYXBEdW9pSWRzLnNvbWUocSA9PiBxLnRvVXBwZXJDYXNlKCkgPT0gdXNlcklkTGFzdFVwcGVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCEhdGhpcy5jdXJyZW50SXRlbS5kb25WaUlkTGFzdEluV29ya2Zsb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyRGF0YS5kb25WaUNhcER1b2lJZHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyRGF0YS5kb25WaUNhcER1b2lJZHMuc29tZShxID0+IHEudG9VcHBlckNhc2UoKSA9PSBkb25WaUlkTGFzdFVwcGVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGFzUGVybWlzc2lvbjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2hvd0FjdGlvbldvcmtmbG93KGV2dCwgcm93RGF0YSkge1xyXG4gICAgICAgIGNvbnN0IFtidXR0b25Db250ZXh0cywgaGFzUGVybWlzc2lvbl0gPSBhd2FpdCB0aGlzLmdldEFjdGlvbldvcmtmbG93KHJvd0RhdGEpO1xyXG4gICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMgPSBidXR0b25Db250ZXh0cztcclxuICAgICAgICByb3dEYXRhLl9faGFzUGVybWlzc2lvbiA9IGhhc1Blcm1pc3Npb247XHJcbiAgICAgICAgcm93RGF0YS5fX2FjdGlvbnMgPSB0aGlzLmJ1dHRvbkNvbnRleHRzO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEFjdGlvbldvcmtmbG93KHJvd0RhdGEpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVQZXJtaXNzaW9uKHJvd0RhdGEpO1xyXG4gICAgICAgIGxldCBidXR0b25Db250ZXh0cyA9IFtdO1xyXG4gICAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICBidXR0b25Db250ZXh0cyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzQWN0aW9uID0gdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZy5zdGF0dXNBY3Rpb25zLmZpbmQocCA9PiBwLnNvdXJjZVN0YXR1cyA9PSByb3dEYXRhLmN1cnJlbnRTdGF0ZUNvZGUpO1xyXG4gICAgICAgICAgICBpZiAoc3RhdHVzQWN0aW9uID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zOiBBY3Rpb25bXSA9IHN0YXR1c0FjdGlvbi5hY3Rpb25zO1xyXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMgPSBhY3Rpb25zLm1hcChpdGVtID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uQ29kZTogaXRlbS5tYSxcclxuICAgICAgICAgICAgICAgICAgICBpY29uOiB0aGlzLnNvdXJjZUljb25baXRlbS5pY29uXSxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogaXRlbS50ZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5wcm9jZXNzV29ya2Zsb3cocm93RGF0YS5pZCwgaXRlbSlcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YS51c2VySWRMYXN0SW5Xb3JrZmxvdyAmJiByb3dEYXRhLnVzZXJJZExhc3RJbldvcmtmbG93LnRvVXBwZXJDYXNlKCkgPT0gdGhpcy5tb2RlbC5hZHZhbmNlRGF0YS51c2VyRGF0YS5pZC50b1VwcGVyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3BpIHBpLXJlcGxheScsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdLaMO0aSBwaOG7pWMgdHLhuqFuZyB0aMOhaSB0csaw4bubYycsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5yb2xsYmFja1dvcmtmbG93KHJvd0RhdGEuaWQpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGljb246ICdwaSBwaS1saXN0JyxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiAnWGVtIGzhu4tjaCBz4butJyxcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMudmlld0hpc3RvcnlXb3JrZmxvdyhyb3dEYXRhLmlkKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBidXR0b25Db250ZXh0cywgaGFzUGVybWlzc2lvblxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRJdGVtV29ya2Zsb3dTZXR0aW5nKHJvd0RhdGEpIHtcclxuICAgICAgICBsZXQgd29ya2Zsb3dTZXR0aW5nID0gdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZ05ldztcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmlzV29ya2Zsb3dUcmVlXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZy53b3JrZmxvd0NvbmZpZ0FkdmFuY2VcclxuICAgICAgICAgICAgJiYgdGhpcy5zZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZS5nZXRXb3JrZmxvd1NldHRpbmcpIHtcclxuICAgICAgICAgICAgd29ya2Zsb3dTZXR0aW5nID0gYXdhaXQgdGhpcy5zZXR0aW5nLndvcmtmbG93Q29uZmlnQWR2YW5jZS5nZXRXb3JrZmxvd1NldHRpbmcocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZyB8fCB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ8SQ4buRaSB0xrDhu6NuZyBjaMawYSDEkcaw4bujYyBj4bqldSBow6xuaCBxdXkgdHLDrG5oIG5naGnhu4dwIHbhu6UnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHdvcmtmbG93U2V0dGluZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93Rm9ybVN0YXJ0V29ya2Zsb3cocm93RGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0V29ya2Zsb3cocm93RGF0YSwgd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93c1swXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0V29ya2Zsb3dNb2RlbC5kYXRhLndvcmtmbG93cyA9IHdvcmtmbG93U2V0dGluZy53b3JrZmxvd3M7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuZGF0YS5kZWZhdWx0V29ya2Zsb3cgPSB3b3JrZmxvd1NldHRpbmcud29ya2Zsb3dDb2RlO1xyXG4gICAgICAgIHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTdGFydFdvcmtmbG93RnJvbURpYWxvZyh3b3JrZmxvdzogV2ZJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGFydFdvcmtmbG93KHRoaXMuc3RhcnRXb3JrZmxvd01vZGVsLmRhdGEuaXRlbSwgd29ya2Zsb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaG93QWN0aW9uV29ya2Zsb3dOZXcoZXZ0LCByb3dEYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0R2V0QWN0aW9uV29ya2Zsb3cgPSBhd2FpdCB0aGlzLmdldEFjdGlvbldvcmtmbG93TmV3KHJvd0RhdGEpO1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyZXN1bHRHZXRBY3Rpb25Xb3JrZmxvdykpIHJldHVybjtcclxuICAgICAgICBjb25zdCBbYnV0dG9uQ29udGV4dHMsIGhhc1Blcm1pc3Npb25dID0gcmVzdWx0R2V0QWN0aW9uV29ya2Zsb3c7XHJcbiAgICAgICAgcm93RGF0YS5fX2hhc1Blcm1pc3Npb24gPSBoYXNQZXJtaXNzaW9uO1xyXG4gICAgICAgIHJvd0RhdGEuX19hY3Rpb25zID0gYnV0dG9uQ29udGV4dHM7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGJ1dHRvbkNvbnRleHRzO1xyXG4gICAgICAgIHRoaXMuX3Nob3dDb250ZXh0TWVudShldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEFjdGlvbldvcmtmbG93TmV3KHJvd0RhdGEpOiBQcm9taXNlPGFueVtdIHwgdm9pZD4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dpbmdBY3Rpb25Xb3JrZmxvdykgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc2hvd2luZ0FjdGlvbldvcmtmbG93ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICBsZXQgaGFzUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMgPSBbXTtcclxuICAgICAgICBjb25zdCBidXR0b25Db250ZXh0cyA9IFtdO1xyXG4gICAgICAgIC8vIE7hur91IGsgY8OzIHdvcmtmbG93IGNvZGUgbmdoxKlhIGzDoCBjaMawYSBjaOG6oXkgcXV5IHRyw6xuaCBob+G6t2MgcXV5IHRyw6xuaCBs4buXaSA9PiBDaG8gY2jhuqF5IGzhuqFpXHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9fd29ya2Zsb3dDb2RlKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGBC4bqvdCDEkeG6p3UgcXV5IHRyw6xuaGAsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktcGxheScsXHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnNob3dGb3JtU3RhcnRXb3JrZmxvdyhyb3dEYXRhKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtV29ya2Zsb3dTZXR0aW5nID0gd29ya2Zsb3dTZXR0aW5nLndvcmtmbG93cy5maW5kKHEgPT4gcS5jb2RlID09IHJvd0RhdGEuX193b3JrZmxvd0NvZGUpO1xyXG4gICAgICAgICAgICBpZiAoIWl0ZW1Xb3JrZmxvd1NldHRpbmcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoYEtow7RuZyB0w6xtIHRo4bqleSBxdXkgdHLDrG5oIGPDsyBtw6MgJHtyb3dEYXRhLl9fd29ya2Zsb3dDb2RlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBpdGVtV29ya2Zsb3dTZXR0aW5nLmRhdGEuYWN0aW9uc1tyb3dEYXRhLl9fdHJhbmdUaGFpXTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aW9uQWxsb3dzID0gKGF3YWl0IHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5nZXRBY3Rpb25BbGxvdyhyb3dEYXRhLmlkKSkuZGF0YTtcclxuICAgICAgICAgICAgYWN0aW9uQWxsb3dzLmZvckVhY2goYWN0aW9uQ29kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBhY3Rpb25zLmZpbmQocSA9PiBxLmNvZGUgPT0gYWN0aW9uQ29kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvVGh1VHU6IGFjdGlvbi5zb1RodVR1LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25Db2RlOiBhY3Rpb24uY29kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGhpcy5zb3VyY2VJY29uW2FjdGlvbi5pY29uXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGFjdGlvbi5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnByb2Nlc3NXb3JrZmxvd05ldyhpdGVtV29ya2Zsb3dTZXR0aW5nLCBhY3Rpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBidXR0b25Db250ZXh0cy5zb3J0KG11bHRpcGxlU29ydCgnc29UaHVUdScpKTtcclxuICAgICAgICAgICAgLy8gS2nhu4NtIHRyYSBuZ8aw4budaSBjdeG7kWkgY8O5bmcgdGjhu7FjIGhp4buHbiBjw7MgcGjhuqNpIG5nxrDhu51pIGhp4buHbiB04bqhaSBraMO0bmcgdGjDrCBjaG8gcGjDqXAgcm9sbGJhY2tcclxuICAgICAgICAgICAgY29uc3Qgd29ya2Zsb3dIaXN0b3J5U2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlKTtcclxuICAgICAgICAgICAgY29uc3QgdXNlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoVXNlclNlcnZpY2UpO1xyXG4gICAgICAgICAgICBjb25zdCB1c2VySWQgPSB1c2VyU2VydmljZS5nZXRJZCgpO1xyXG4gICAgICAgICAgICBsZXQgdXNlcklkU3RyaW5nVXBwZXIgPSAnJztcclxuICAgICAgICAgICAgaWYgKHVzZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgdXNlcklkU3RyaW5nVXBwZXIgPSB1c2VySWQudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaXRlbVdvcmtmbG93SGlzdG9yeUxhc3QgPSAoYXdhaXQgd29ya2Zsb3dIaXN0b3J5U2VydmljZS5nZXRMYXN0QnlJdGVtSWQocm93RGF0YS5pZCkpLmRhdGE7XHJcbiAgICAgICAgICAgIGlmIChpdGVtV29ya2Zsb3dIaXN0b3J5TGFzdCAmJiBpdGVtV29ya2Zsb3dIaXN0b3J5TGFzdC51c2VySWRDcmVhdGVkLnRvVXBwZXJDYXNlKCkgPT0gdXNlcklkU3RyaW5nVXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktcmVwbGF5JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdUaHUgaOG7k2knLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnJvbGxiYWNrV29ya2Zsb3dOZXcocm93RGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzLnB1c2goXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogJ3BpIHBpLWxpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnWGVtIGzhu4tjaCBz4butJyxcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnZpZXdIaXN0b3J5V29ya2Zsb3dOZXcocm93RGF0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zaG93aW5nQWN0aW9uV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gW2J1dHRvbkNvbnRleHRzLCBoYXNQZXJtaXNzaW9uXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zaG93Q29udGV4dE1lbnUoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93KGV2dCk7XHJcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJvbGxiYWNrV29ya2Zsb3coaWQpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oJ0LhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiBraMO0aSBwaOG7pWMgdHLhuqFuZyB0aMOhaSB0csaw4bubYyDEkcOzJylcclxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uucm9sbGJhY2tXb3JrZmxvdyhpZClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICdLaMO0aSBwaOG7pWMgdHLhuqFuZyB0aMOhaSB0csaw4bubYyB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByb2xsYmFja1dvcmtmbG93TmV3KHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0NvbmZpcm0oJ0LhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiBraMO0aSBwaOG7pWMgdHLhuqFuZyB0aMOhaSB0csaw4bubYyDEkcOzJylcclxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uucm9sbGJhY2socm93RGF0YSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICdLaMO0aSBwaOG7pWMgdHLhuqFuZyB0aMOhaSB0csaw4bubYyB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJvbGxiYWNrZWRXb3JrZmxvdy5lbWl0KHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlZFN0YXR1c1dvcmtmbG93LmVtaXQocm93RGF0YS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmlld0hpc3RvcnlXb3JrZmxvdyhpZDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5zaG93SGlzdG9yeVdvcmtmbG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB2aWV3SGlzdG9yeVdvcmtmbG93TmV3KHJvd0RhdGE6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEl0ZW0gPSByb3dEYXRhO1xyXG4gICAgICAgIGNvbnN0IHdvcmtmbG93U2V0dGluZyA9IGF3YWl0IHRoaXMuZ2V0SXRlbVdvcmtmbG93U2V0dGluZyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXdvcmtmbG93U2V0dGluZykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud29ya2Zsb3dIaXN0b3J5TW9kZWwuZGF0YS53b3JrZmxvd1NldHRpbmcgPSB3b3JrZmxvd1NldHRpbmc7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd0hpc3RvcnlNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUhpZGVIaXN0b3J5V29ya2Zsb3coKSB7XHJcbiAgICAgICAgdGhpcy5zaG93SGlzdG9yeVdvcmtmbG93ID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzc1dvcmtmbG93KGlkOiBudW1iZXIsIHdvcmtmbG93QWN0aW9uOiBBY3Rpb24pIHtcclxuICAgICAgICAvLyBO4bq/dSBraMO0bmcgY+G6p24gbeG7nyBkaWFsb2cgbcOgIHRo4buxYyBoaeG7h24gYWN0aW9uIGx1w7RuXHJcbiAgICAgICAgaWYgKHdvcmtmbG93QWN0aW9uLmFjdGlvbk9wdGlvbnMgJiYgIXdvcmtmbG93QWN0aW9uLmFjdGlvbk9wdGlvbnMub3BlbkRpYWxvZykge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhUHJvY2VzcyA9IHtcclxuICAgICAgICAgICAgICAgIHlLaWVuOiAnJyxcclxuICAgICAgICAgICAgICAgIGhhblh1THk6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBmaWxlRGluaEtlbTogbnVsbFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZVdmID0gYXdhaXQgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnZhbGlkYXRlUHJvY2Vzc1dvcmtmbG93KHRoaXMuY3VycmVudEl0ZW0uaWQsIHdvcmtmbG93QWN0aW9uLm1hLCBkYXRhUHJvY2Vzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UodmFsaWRhdGVXZiwgJycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLnByb2Nlc3NXb3JrZmxvdyh0aGlzLmN1cnJlbnRJdGVtLmlkLCB3b3JrZmxvd0FjdGlvbi5tYSwgZGF0YVByb2Nlc3MpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCBgJHt3b3JrZmxvd0FjdGlvbi50ZW59IHRow6BuaCBjw7RuZ2AsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb2Nlc3NlZFdvcmZsb3coKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTuG6v3UgZGF0YSA9IHRydWUgbmdoxKlhIGzDoCBi4buLIGzhu5dpIChOZ8aw4budaSBkw7luZyB0aHXhu5ljIDIgxJHGoW4gduG7iyBuaMawbmcgY2jGsGEgY2jhu41uIMSRxqFuIHbhu4sgxJHhu4MgdGjhu7FjIGhp4buHbiBhY3Rpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uV29ya2Zsb3cgPSB3b3JrZmxvd0FjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyV29ya2Zsb3cgPSB3b3JrZmxvd0FjdGlvbi50ZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dGb3JtV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9LCBmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25JbnZhbGlkV29ya2Zsb3cuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbTogdGhpcy5jdXJyZW50SXRlbSxcclxuICAgICAgICAgICAgICAgICAgICBhY3Rpb25Db2RlOiB3b3JrZmxvd0FjdGlvbi5tYVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25Xb3JrZmxvdyA9IHdvcmtmbG93QWN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLmhlYWRlcldvcmtmbG93ID0gd29ya2Zsb3dBY3Rpb24udGVuO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dGb3JtV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzV29ya2Zsb3dOZXcoaXRlbVdvcmtmbG93U2V0dGluZzogYW55LCB3b3JrZmxvd0FjdGlvbjogYW55KSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuaGVhZGVyID0gd29ya2Zsb3dBY3Rpb24ubmFtZTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NXb3JrZmxvd01vZGVsLmRhdGEuYWN0aW9uID0gd29ya2Zsb3dBY3Rpb247XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5kYXRhLndvcmtmbG93ID0gaXRlbVdvcmtmbG93U2V0dGluZztcclxuICAgIH1cclxuXHJcbiAgICBzdGFydFdvcmtmbG93KHJvd0RhdGEsIHdvcmtmbG93OiBXZkl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc3RhcnRXb3JrZmxvdyhyb3dEYXRhLmlkLCB3b3JrZmxvdy5jb2RlKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICdDaOG6oXkgcXV5IHRyw6xuaCB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdGFydGVkV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2VkU3RhdHVzV29ya2Zsb3cuZW1pdChyb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW52YWxpZFdGKGV2dCkge1xyXG4gICAgICAgIHRoaXMub25JbnZhbGlkV29ya2Zsb3cuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVByb2Nlc3NlZFdvcmZsb3coKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Rm9ybVdvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvY2Vzc2VkV29ya2Zsb3dCYXNlKCkge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc1dvcmtmbG93TW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NlZFdvcmtmbG93LmVtaXQodGhpcy5jdXJyZW50SXRlbS5pZCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHRoaXMuY3VycmVudEl0ZW0uaWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRCeVR5cGUoY29udHJvbFR5cGU6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAnZW50aXR5V29ya2Zsb3dTdGF0dXMnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlRW50aXR5V29ya2Zsb3dTdGF0dXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAndHJhbmdUaGFpVjUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVHJhbmdUaGFpVjU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb250cm9sVHlwZSA9PSAnX192aWV3SGlzdG9yeScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDb2xWaWV3SGlzdG9yeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2xUeXBlID09ICd3b3JrZmxvd0NvcmVTdGF0dXMnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlV29ya2Zsb3dDb3JlU3RhdHVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZmluZFRlbXBsYXRlRnJvbUxpc3QodGhpcy5jaGlsZHJlbiwgY29udHJvbFR5cGUpO1xyXG4gICAgICAgIGlmICghaXRlbSAmJiB0aGlzLnRlbXBsYXRlcykge1xyXG4gICAgICAgICAgICBpdGVtID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLnRlbXBsYXRlcywgY29udHJvbFR5cGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGaWx0ZXJzKCk6IEZpbHRlcltdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfZGVmYXVsdCkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9kZWZhdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2N1c3RvbSkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmZpbHRlcl9jdXN0b20pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfY29sdW1uKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2NvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2FkdmFuY2VTZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEdyaWRJbmZvKCkge1xyXG4gICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcclxuICAgICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlLFxyXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLmdldEZpbHRlcnMoKSxcclxuICAgICAgICAgICAgc29ydHM6IFtdXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgZ3JpZEluZm8uc29ydHMudW5zaGlmdCh7IGZpZWxkOiB0aGlzLl9ncm91cEZpZWxkLCBkaXI6IDEgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9zb3J0RmllbGQgJiYgdGhpcy5fc29ydERpciAhPT0gMCkge1xyXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy5wdXNoKHsgZmllbGQ6IHRoaXMuX3NvcnRGaWVsZCwgZGlyOiB0aGlzLl9zb3J0RGlyIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGdyaWRJbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVTZWFyY2hBZHZzKGZpbHRlcnM6IEZpbHRlcltdKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfYWR2YW5jZVNlYXJjaCA9IGZpbHRlcnM7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUluaXRBZHZhbmNlU2VhcmNoKGZpbHRlcnM6IEZpbHRlcltdKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfYWR2YW5jZVNlYXJjaCA9IGZpbHRlcnM7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICAgICAgY29uc3QgaW5mb0dldERhdGEgPSB0aGlzLmdldEdyaWRJbmZvKCk7XHJcbiAgICAgICAgdGhpcy5vblJlbG9hZC5lbWl0KGluZm9HZXREYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQoZmlsdGVyX2N1c3RvbT86IEZpbHRlcltdLCBwYWdlID0gMSkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyX2N1c3RvbSA9IGZpbHRlcl9jdXN0b207XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSBwYWdlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGQoKSB7XHJcbiAgICAgICAgdGhpcy5vbkFkZC5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgeHVhdENhY011Y0RhQ2hvbl9iYWNrdXAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdHaWFvIGRp4buHbiBoaeG7h24gdOG6oWkgY2jGsGEgaOG7lyB0cuG7oyB4deG6pXQgZXhjZWwnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGhpZGRlbkNoZWNrYm94ID0gdGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94O1xyXG4gICAgICAgIGNvbnN0IGhpZGRlbkZ1bmN0aW9uQ29sdW1uID0gdGhpcy5zZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uO1xyXG4gICAgICAgIGNvbnN0IHRhYmxlID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xyXG4gICAgICAgIGNvbnN0IHRoZWFkID0gdGFibGUucXVlcnlTZWxlY3RvcigndGhlYWQnKTtcclxuICAgICAgICBjb25zdCB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcbiAgICAgICAgY29uc3QgdGhzID0gdGhlYWQucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuICAgICAgICBjb25zdCByb3dEYXRhID0gdGJvZHkucXVlcnlTZWxlY3RvckFsbCgndHIudWktc3RhdGUtaGlnaGxpZ2h0Jyk7XHJcbiAgICAgICAgY29uc3QgZGF0YUV4cG9ydCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGhlYWQgPSBbXTtcclxuICAgICAgICBjb25zdCBjb3VudCA9ICh0aHMubGVuZ3RoIC0gKGhpZGRlbkZ1bmN0aW9uQ29sdW1uID8gMCA6IDEpKTtcclxuICAgICAgICBjb25zdCB0aEluZGV4ID0gKGhpZGRlbkNoZWNrYm94ID8gMCA6IDEpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSB0aEluZGV4OyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBoZWFkLnB1c2godGhzW2ldLmlubmVyVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFFeHBvcnQucHVzaChoZWFkKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygcm93RGF0YSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZHMgPSBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IFtdO1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9ICh0ZHMubGVuZ3RoIC0gKGhpZGRlbkZ1bmN0aW9uQ29sdW1uID8gMCA6IDEpKTtcclxuICAgICAgICAgICAgY29uc3QgdGRJbmRleCA9IChoaWRkZW5DaGVja2JveCA/IDAgOiAxKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRkSW5kZXg7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGRzW2ldLmlubmVyVGV4dCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cucHVzaCh0aGlzLmdldFZhbHVlQ2hlY2tib3hGb3JtYXQodGRzW2ldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cucHVzaCh0ZHNbaV0uaW5uZXJUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0YUV4cG9ydC5wdXNoKHJvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2Uub2JqZWN0VG9FeGNlbChkYXRhRXhwb3J0LCBgRmlsZUV4cG9ydF8ke2RhdGUuZ2V0RnVsbFllYXIoKX0ke2FkZFplcm8oZGF0ZS5nZXRNb250aCgpICsgMSl9JHthZGRaZXJvKGRhdGUuZ2V0RGF0ZSgpKX0ueGxzeGApO1xyXG4gICAgfVxyXG5cclxuICAgIHh1YXRDYWNNdWNEYUNob24oKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnNldHRpbmcuZXhwb3J0SXRlbXNNb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0SXRlbXNNb2RlLkZyb21IdG1sOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5leHBvcnRCeVJlYWRpbmdIdG1sKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBFeHBvcnRJdGVtc01vZGUuTWFudWFsR2V0RGF0YTpcclxuICAgICAgICAgICAgY2FzZSBFeHBvcnRJdGVtc01vZGUuQXV0b0dldERhdGE6XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RoZSBmdW5jdGlvbiBoYXZlblxcJ3Qgc3VwcG9ydGVkIHlldCcpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBleHBvcnRCeVJlYWRpbmdIdG1sKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQ2jGsGEgaOG7lyB0cuG7oyB4deG6pXQgY8OzIG5ow7NtIGThu68gbGnhu4d1IScpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYmxlRWxlID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0YWJsZScpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRFbGUgPSB0YWJsZUVsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgICAgIGNvbnN0IGJvZHlFbGUgPSB0YWJsZUVsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpO1xyXG5cclxuICAgICAgICAvLyBoZWFkZXIuXHJcbiAgICAgICAgY29uc3QgYXJySGVhZCA9IHRoaXMuZ2V0QXJySGVhZEJ5SHRtbChoZWFkRWxlKTtcclxuICAgICAgICBpZiAoIWFyckhlYWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYm9keS5cclxuICAgICAgICBjb25zdCBhcnJSb3dEYXRhID0gdGhpcy5nZXRBcnJSb3dEYXRhQnlIdG1sKGJvZHlFbGUsIGFyckhlYWQpO1xyXG5cclxuICAgICAgICAvLyBleHBvcnQuXHJcbiAgICAgICAgY29uc3QgZGF0YUV4cG9ydCA9IFthcnJIZWFkLm1hcChpID0+IGkudmFsdWUpLCAuLi5hcnJSb3dEYXRhXTtcclxuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGBEYW5oIHPDoWNoICR7dGhpcy5zZXR0aW5nLm9iamVjdE5hbWV9YDtcclxuICAgICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlLm9iamVjdFRvRXhjZWwoZGF0YUV4cG9ydCwgZmlsZU5hbWUpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJySGVhZEJ5SHRtbChoZWFkZXIpIHtcclxuICAgICAgICBjb25zdCBmaXJzdFJvdyA9IGhlYWRlci5xdWVyeVNlbGVjdG9yKCd0cicpO1xyXG4gICAgICAgIGlmICghZmlyc3RSb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFyclRoID0gZmlyc3RSb3cucXVlcnlTZWxlY3RvckFsbCgndGgnKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuc2V0dGluZy5oaWRkZW5DaGVja2JveCA/IDAgOiAxO1xyXG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gYXJyVGgubGVuZ3RoIC0gKHRoaXMuc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtbiA/IDAgOiAxKSAtIDE7XHJcbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiBlbmRJbmRleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFyckhlYWRlciA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFyclRoW2ldLmlubmVyVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgYXJySGVhZGVyLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBhcnJUaFtpXS5pbm5lclRleHRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXJySGVhZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcnJSb3dEYXRhQnlIdG1sKGJvZHlFbGUsIGFyckhlYWQpIHtcclxuICAgICAgICBjb25zdCBhcnJSb3cgPSBib2R5RWxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyLnVpLXN0YXRlLWhpZ2hsaWdodCcpO1xyXG4gICAgICAgIGlmICghYXJyUm93Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhcnJSb3dEYXRhID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJSb3cubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gYXJyUm93W2ldO1xyXG4gICAgICAgICAgICBjb25zdCBhcnJUZCA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCd0ZCcpO1xyXG4gICAgICAgICAgICBsZXQgY3VycmVudFRkO1xyXG4gICAgICAgICAgICBjb25zdCByb3dEYXRhID0gW107XHJcblxyXG4gICAgICAgICAgICBhcnJIZWFkLmZvckVhY2goaGVhZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VGQgPSBhcnJUZFtoZWFkLmluZGV4XTtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGQuaW5uZXJUZXh0ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGEucHVzaCh0aGlzLmdldFZhbHVlQ2hlY2tib3hGb3JtYXQoY3VycmVudFRkKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnB1c2goY3VycmVudFRkLmlubmVyVGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgYXJyUm93RGF0YS5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJSb3dEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlQ2hlY2tib3hGb3JtYXQoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrQm94ID0gZGF0YS5xdWVyeVNlbGVjdG9yKCdwLWNoZWNrYm94Jyk7XHJcbiAgICAgICAgaWYgKGNoZWNrQm94KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGF0YS5xdWVyeVNlbGVjdG9yKCdzcGFuLnBpLWNoZWNrJyk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdDw7MnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdLaMO0bmcnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdmlldyhyb3dEYXRhOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uVmlldy5lbWl0KHJvd0RhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0KHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25FZGl0LmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZShyb3dEYXRhOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uRGVsZXRlLmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZU11dGlwbGUoKSB7XHJcbiAgICAgICAgdGhpcy5vbkRlbGV0ZU11bHRpcGxlLmVtaXQodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuXHJcbiAgICB0cmluaEt5KGV2dCkge1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLnJvd0RhdGFDdXJyZW50O1xyXG4gICAgICAgIHRoaXMuc2hvd1dhaXRCb3goKTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnVzZUJhc2VUcmluaEt5KSB7XHJcbiAgICAgICAgICAgIHJvd0RhdGFbS2V5Rmxhc2hTaG93XSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdChyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByaW50UGRmKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSwgcm93RGF0YVt0aGlzLnNldHRpbmcuZW50aXR5S2V5XSwgcm93RGF0YSlcclxuICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJ1Ryw6xuaCBrw70gdGjDoG5oIGPDtG5nJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VUcmluaEt5KGVudmlyb25tZW50LCB0aGlzLnNldHRpbmcsIHJvd0RhdGEsIHJlcy5kYXRhLCB0aGlzLl9ub3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFmdGVyVHJpbmhLeS5lbWl0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVdhaXRCb3goKTtcclxuICAgICAgICAgICAgICAgIH0sIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZVdhaXRCb3goKTtcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhpZGVXYWl0Qm94KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja0hhc1Blcm1pc3Npb25Jbkxhc3RTdGF0dXMocm93RGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1c0tldFRodWMgPSB0aGlzLnNldHRpbmcud29ya2Zsb3dTZXR0aW5nLnN0YXR1c2VzLmZpbmQocSA9PiBxLnR5cGUgPT0gRW51bVdGTmhvbVRyYW5nVGhhaS5LRVRfVEhVQyk7XHJcbiAgICAgICAgaWYgKHN0YXR1c0tldFRodWMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1F1eSB0csOsbmggY2jGsGEgxJHGsOG7o2MgY+G6pXUgaMOsbmggdHLhuqFuZyB0aMOhaSBr4bq/dCB0aMO6YycpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhLmN1cnJlbnRTdGF0ZUNvZGUgIT0gc3RhdHVzS2V0VGh1Yy5tYSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEtp4buDbSB0cmEgcGVybWlzc2lvblxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlUGVybWlzc2lvbihyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93Q29udGV4dE1lbnUoZXZ0LCByb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XHJcbiAgICAgICAgdGhpcy5idXR0b25Db250ZXh0cyA9IGF3YWl0IHRoaXMubWVudUJ1dHRvbnMocm93RGF0YSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSAmJiAhcm93RGF0YS5fX2hpZGRlblRyaW5oS3kpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jaGVja1JlYWR5VG9UcmluaEt5KClcclxuICAgICAgICAgICAgICAgICYmIGF3YWl0IHRoaXMuc2V0dGluZy5jaGVja0FsbG93VHJpbmhLeShyb3dEYXRhKVxyXG4gICAgICAgICAgICAgICAgJiYgKCF0aGlzLnNldHRpbmcuY2hlY2tQZXJtaXNpb25UcmluaEt5XHJcbiAgICAgICAgICAgICAgICAgICAgfHwgYXdhaXQgdGhpcy5jaGVja0hhc1Blcm1pc3Npb25Jbkxhc3RTdGF0dXMocm93RGF0YSlcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzLnVuc2hpZnQoXHJcbiAgICAgICAgICAgICAgICAgICAgeyBsYWJlbDogdGhpcy5zZXR0aW5nLmdldExhYmVsQnV0dG9uVHJpbmhLeShyb3dEYXRhKSwgaWNvbjogJ3BpIHBpLXNlbmQnLCBjb21tYW5kOiB0aGlzLnRyaW5oS3kuYmluZCh0aGlzKSB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyBjw7MgaMOgbmggxJHhu5luZyBraOG6oyBk4bulbmcnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tBbGxfR3JvdXAgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5fY2hlY2tlZCA9IHRoaXMuY2hlY2tlZEFsbDtcclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbaXRlbVt0aGlzLl9ncm91cEZpZWxkXV0gPSB0aGlzLmNoZWNrZWRBbGw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbkNoZWNrQWxsLmVtaXQodGhpcy5jaGVja2VkQWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDaGVja1Jvd0dyb3VwID0gKHJvd0RhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cENoZWNrZWQgPSB0aGlzLnJvd0dyb3VwQ2hlY2tlZFtyb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdXSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhU291cmNlW2ldW3RoaXMuX2dyb3VwRmllbGRdID09IHJvd0RhdGFbdGhpcy5fZ3JvdXBGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXS5fY2hlY2tlZCA9IGdyb3VwQ2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChmb3VuZCkgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5kYXRhU291cmNlW2ldLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMucHVzaCh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0TGFzdEl0ZW1TZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hlY2tlZEFsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cCA9IChyb3dEYXRhLCB0ckVsZW1lbnQgPSBudWxsLCBmaXJlRXZlbnQgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHAgPT4gcC5pZCA9PSByb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgY2hlY2tHcm91cCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5wdXNoKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSA9IHJvd0RhdGE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXS5fY2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV1bdGhpcy5fZ3JvdXBGaWVsZF0gPT0gcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0dyb3VwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucm93R3JvdXBDaGVja2VkW3Jvd0RhdGFbdGhpcy5fZ3JvdXBGaWVsZF1dID0gY2hlY2tHcm91cDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICAgICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICAgICAgICBpZiAoIXRyRWxlbWVudCkgdHJFbGVtZW50ID0gdGhpcy5nZXRUckJ5Um93RGF0YShyb3dEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fZW1pdFJvd1NlbGVjdCh0ckVsZW1lbnQsIHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgaGFuZGxlQ2hlY2tBbGwgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5tb2RlbC5kYXRhU291cmNlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uX2NoZWNrZWQgPSB0aGlzLmNoZWNrZWRBbGwgPT09IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5vbkNoZWNrQWxsLmVtaXQodGhpcy5jaGVja2VkQWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDaGVja1Jvd0RhdGEgPSAocm93RGF0YSwgdHJFbGVtZW50ID0gbnVsbCwgZmlyZUV2ZW50ID0gdHJ1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghcm93RGF0YS5fY2hlY2tlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleChwID0+IHAuaWQgPT0gcm93RGF0YS5pZCk7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0TGFzdEl0ZW1TZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hlY2tlZEFsbCgpO1xyXG4gICAgICAgIGlmICghdHJFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRyRWxlbWVudCA9IHRoaXMuZ2V0VHJCeVJvd0RhdGEocm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJlRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZW1pdFJvd1NlbGVjdCh0ckVsZW1lbnQsIHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNoZWNrZWRBbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aCAmJiB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZWxlY3RSb3coZGF0YXM6IGFueVtdID0gW10pIHtcclxuICAgICAgICBpZiAoIWRhdGFzIHx8IGRhdGFzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oaWRkZW5DaGVja2JveCkge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlbSA9IGRhdGFzW2RhdGFzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICBsYXN0SXRlbS5fY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChsYXN0SXRlbSwgdGhpcy5nZXRUckJ5Um93RGF0YShsYXN0SXRlbSksIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGEobGFzdEl0ZW0sIHRoaXMuZ2V0VHJCeVJvd0RhdGEobGFzdEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YXMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIGRhdGEuX2NoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YV9Hcm91cChkYXRhLCB0aGlzLmdldFRyQnlSb3dEYXRhKGRhdGEpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhKGRhdGEsIHRoaXMuZ2V0VHJCeVJvd0RhdGEoZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU29ydChldmVudDogYW55LCBfdGFibGU6IFRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5zb3J0V2l0aEFwaShldmVudCwgX3RhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNvcnRXaXRoQXBpKGV2ZW50OiBhbnksIF90YWJsZTogVGFibGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kZWwubG9hZGluZykge1xyXG4gICAgICAgICAgICBfdGFibGUucmVzZXQoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc29ydEhpc3RvcnkubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGV2ZW50LmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zb3J0SGlzdG9yeVswXS5maWVsZCA9PSBldmVudC5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gZXZlbnQuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29ydERpciA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvcnREaXIgPSAtMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3NvcnREaXIgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuX3NvcnREaXIgPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmZpZWxkICE9IHRoaXMuc29ydEhpc3RvcnlbMF0uZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRGaWVsZCA9IGV2ZW50LmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydEhpc3RvcnkudW5zaGlmdCh7IGZpZWxkOiB0aGlzLl9zb3J0RmllbGQsIGRpcjogdGhpcy5fc29ydERpciB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc3NEYXRhU291cmNlKGRhdGFTb3VyY2UpIHtcclxuICAgICAgICB0aGlzLmNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMucm93R3JvdXBDaGVja2VkID0ge307XHJcbiAgICAgICAgaWYgKCFkYXRhU291cmNlKSByZXR1cm47XHJcbiAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKHNvdXJjZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaWQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuaWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5jb2xTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuY29sU3BhbiA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc291cmNlLnJvd1NwYW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5yb3dTcGFuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuaGlkZGVuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pc05ldykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3MuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaXNFeHBpcmluZykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3MuZXhwaXJpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuY2xhc3MpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5jbGFzcy5zcGxpdCgnICcpLmZpbHRlcihwID0+IHApLmZvckVhY2goY2xzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzc1tjbHNdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoLmZvckVhY2goX2NvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSA8Q29sdW1uU2NoZW1hQmFzZT5fY29sO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbY29sLmZpZWxkXTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5zdWJzdHJpbmcgJiYgdmFsdWUubGVuZ3RoID4gY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdjogc2hvcnQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VbYCR7Y29sLmZpZWxkfV9fc3ZgXSA9IGAke3ZhbHVlLnN1YnN0cmluZygwLCBjb2wubWF4TGVuZ3RoRGlzcGxheSl9YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5mb3JFYWNoKF9jb2wgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gPENvbHVtblNjaGVtYUJhc2U+X2NvbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU2hvcnRXb3JkID0gdGhpcy5zdWJXb3JkKHNvdXJjZVtjb2wuZmllbGRdLCBjb2wubWF4V29yZERpc3BsYXkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlU2hvcnRXb3JkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3Y6IHNob3J0IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlW2Ake2NvbC5maWVsZH1fX3N2YF0gPSBgJHt2YWx1ZVNob3J0V29yZH1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVJvd0dyb3VwTWV0YURhdGEoZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN1YldvcmQodmFsdWU6IHN0cmluZywgd29yZENvdW50OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS50cmltKSByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gLTEsIGJlZm9yZUNoYXIgPSAnYSc7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVbaV0gPT0gJycgJiYgYmVmb3JlQ2hhciAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgd29yZENvdW50LS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmVmb3JlQ2hhciA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICBpZiAod29yZENvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZCkge1xyXG4gICAgICAgIHJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddID0gIXJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtZXJnZUNsYXNzT2JqKHNvdXJjZSwgb3RoZXJPYmogPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IG9iaiA9IHNvdXJjZS5vYmpTdHlsZUNsYXNzO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG90aGVyT2JqKSB7XHJcbiAgICAgICAgICAgIG9ialtrZXldID0gb3RoZXJPYmpba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9iajtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGV4dFJvd0dyb3VwKHJvd0RhdGEpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICByb3dEYXRhLFxyXG4gICAgICAgICAgICByb3dHcm91cE1ldGFkYXRhOiB0aGlzLnJvd0dyb3VwTWV0YWRhdGEsXHJcbiAgICAgICAgICAgIGdyb3VwQ29sOiB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4sXHJcbiAgICAgICAgICAgIGdyb3VwRmllbGQ6IHRoaXMuX2dyb3VwRmllbGRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Um93R3JvdXBSb290KHJvd0RhdGEsIGV4cGFuZGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4udGhpcy5nZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSksXHJcbiAgICAgICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgICAgICBoYW5kbGVDaGVja1Jvd0dyb3VwOiB0aGlzLmhhbmRsZUNoZWNrUm93R3JvdXAsXHJcbiAgICAgICAgICAgIGdldENvbFNwYW5Hcm91cDogdGhpcy5nZXRDb2xTcGFuR3JvdXAsXHJcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxyXG4gICAgICAgICAgICBjbGFzc1Jvd0dyb3VwOiB0aGlzLl9jbGFzc1Jvd0dyb3VwLFxyXG4gICAgICAgICAgICBpY29uVG9nZ2xlUm93R3JvdXA6IHRoaXMuaWNvblRvZ2dsZVJvd0dyb3VwXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q29udGV4dENlbGwocm93RGF0YSwgcm93SW5kZXgsIGNvbCwgZXhwYW5kZWQsICR0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3J1ZExpc3Q6ICR0aGlzLFxyXG4gICAgICAgICAgICByb3dEYXRhLFxyXG4gICAgICAgICAgICByb3dJbmRleCxcclxuICAgICAgICAgICAgY29sLFxyXG4gICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICBleHBhbmRlZCxcclxuICAgICAgICAgICAgaWNvblRvZ2dsZVJvd0RhdGE6IHRoaXMuaWNvblRvZ2dsZVJvd0RhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDbGFzc1Jvd0RhdGFPZkdyb3VwKHJvd0RhdGEpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpblNlbGVjdEl0ZW0ocm93RGF0YSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgdWktc3RhdGUtaGlnaGxpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGlzLWNoaWxkLWdyb3VwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuY2xhc3MpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgJyArIHJvd0RhdGEuY2xhc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb250YWluU2VsZWN0SXRlbShpdGVtKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleCh4ID0+IHggJiYgeFt0aGlzLnNldHRpbmcuZW50aXR5S2V5XSA9PT0gaXRlbVt0aGlzLnNldHRpbmcuZW50aXR5S2V5XSkgPiAtMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9wKCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxiYXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsYmFyLnNjcm9sbFRvVG9wKDAsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsVG9Cb3R0b20oKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsVG9Cb3R0b20oMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25OZXh0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSArIDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25QcmV2KGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25PbGRlc3QoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IE1hdGguY2VpbCh0aGlzLm1vZGVsLnRvdGFsIC8gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplKTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxhdGVzdChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0VtcHR5VG9vbGJhcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IG5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLml0ZW0oaSk7XHJcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSA4ICYmIG5vZGVzLml0ZW0oaSkudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0VtcHR5RnVuY3Rpb25CdXR0b25zKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuaXRlbShpKTtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDggJiYgbm9kZXMuaXRlbShpKS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYXNUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPSB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRlbXBsYXRlKHRlbXBsYXRlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9IHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVJvd0dyb3VwTWV0YURhdGEoZGF0YVNvdXJjZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cE1ldGFkYXRhID0ge307XHJcbiAgICAgICAgbGV0IGluZGV4R3JvdXAgPSAwO1xyXG4gICAgICAgIGNvbnN0IGdyb3VwRmllbGROYW1lOiBzdHJpbmcgPSB0aGlzLl9ncm91cEZpZWxkO1xyXG4gICAgICAgIC8vIFThuqFvIGLhu6thIDEgZ3JvdXAgdmFsdWUgYmVmb3JlXHJcbiAgICAgICAgbGV0IHByZXZpb3VzR3JvdXBWYWx1ZSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgIGlmIChncm91cEZpZWxkTmFtZSAmJiBncm91cEZpZWxkTmFtZSAhPSAnJykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBkYXRhU291cmNlW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IHJvd0RhdGFbZ3JvdXBGaWVsZE5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwVmFsdWUgIT09IHByZXZpb3VzR3JvdXBWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXBNZXRhZGF0YVtncm91cFZhbHVlXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksIGluZGV4R3JvdXA6IGluZGV4R3JvdXArKywgc2l6ZTogMSwgaXRlbVJvb3Q6IHJvd0RhdGEsIGl0ZW1zOiBbcm93RGF0YV1cclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZXhwYW5kZWRSb3dLZXlzW2dyb3VwVmFsdWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0dyb3VwVmFsdWUgPSBncm91cFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gdGhpcy5yb3dHcm91cE1ldGFkYXRhW2dyb3VwVmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1Hcm91cC5zaXplKys7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUdyb3VwLml0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByb3dEYXRhLl9pbmRleCA9IHRoaXMucm93R3JvdXBNZXRhZGF0YVtncm91cFZhbHVlXS5zaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TYXZlQ29sb3JTZXR0aW5ncyhkYXRhKSB7XHJcbiAgICAgICAgaWYgKGRhdGEuY29sb3JGaWx0ZXJUYWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9uZUFyciA9IGRhdGEuY29sb3JGaWx0ZXJUYWJsZS5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY2xvbmVBcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjbG9uZUFycltpXS5maWx0ZXJWYWx1ZSA9PSAnJyB8fCBjbG9uZUFycltpXS5maWx0ZXJWYWx1ZSA9PSBudWxsIHx8IGNsb25lQXJyW2ldLmZpbHRlclZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29sb3JGaWx0ZXJUYWJsZS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZCA9IGRhdGEuY29sb3JGaWx0ZXJGaWVsZDtcclxuICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZSA9IGRhdGEuY29sb3JGaWx0ZXJUYWJsZTtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FjaGVDb2xvclNldHRpbmcoKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVTZXR0aW5ncyhldmVudCkge1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzID0gZXZlbnQuZGV0YWlscztcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkID0gZXZlbnQuc29ydEZpZWxkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXIgPSBldmVudC5zb3J0RGlyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGV2ZW50Lmdyb3VwRmllbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uID0gdGhpcy5zZXR0aW5nLmNvbHMuZmluZChwID0+IHAuZmllbGQgPT0gZXZlbnQuZ3JvdXBGaWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4uZm9yY2VHZXREYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zYXZlQ29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmV4dGVuZENvbHVtbnModGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1hdENvbHVtbnModGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGx5Q29sdW1uU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5Q29sdW1uU2V0dGluZygpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4gPSB0aGlzLnNldHRpbmcuY29scy5maW5kKHAgPT4gcC5maWVsZCA9PSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5ncm91cENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLmZvcmNlR2V0RGF0YSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5yYXdDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncm91cEZpZWxkID0gdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLnJhd0NvbHVtbi5maWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwRmllbGQgPSB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4uZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB0aGlzLl9ncm91cEZpZWxkID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VwRmllbGQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkO1xyXG4gICAgICAgIHRoaXMuX3NvcnREaXIgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tb2RlbCAmJiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcgJiYgdGhpcy5fc29ydEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydEhpc3RvcnkgPSBbeyBmaWVsZDogdGhpcy5fc29ydEZpZWxkLCBkaXI6IHRoaXMuX3NvcnREaXIgPyB0aGlzLl9zb3J0RGlyIDogMCB9XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc29ydEhpc3RvcnkgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDZWxsQ2xhc3NIZWFkZXIoY29sKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG4gICAgICAgIGlmIChjb2wuY2VsbENsYXNzKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSBjb2wuY2VsbENsYXNzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWNvbC5zb3J0KSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIE5vU29ydENvbHVtbic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2wuZmllbGQgPT0gdGhpcy5fc29ydEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIHAtc29ydGFibGUtY29sdW1uJztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnREaXIgIT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcgcC1oaWdobGlnaHQnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sdW1uU3R5bGUoY29sOiBhbnksIGZvckhlYWRlciA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc3R5bGU6IGFueSA9IHt9O1xyXG4gICAgICAgIGlmIChjb2wuZmllbGQgPT0gJ21ldGFkYXRhU3RhdHVzJykge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ2NlbnRlcic7XHJcbiAgICAgICAgICAgIHN0eWxlWyd3aWR0aCddID0gJzhlbSc7XHJcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb2wudGV4dEFsaWduID09IFRleHRBbGlnbi5MZWZ0KSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnbGVmdCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLkNlbnRlcikge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ2NlbnRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLlJpZ2h0KSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFsaWduQ2VudGVyQ29sdW1uKGNvbCkpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmFsaWduUmlnaHRDb2x1bW4oY29sKSkge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ3JpZ2h0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnbGVmdCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgc3R5bGVbJ3dpZHRoJ10gPSBjb2wud2lkdGg7XHJcblxyXG4gICAgICAgIHJldHVybiBzdHlsZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIGdldEJvb2ttYXJrQ29sb3Iocm93RGF0YSwgY29sdW1ucykge1xyXG4gICAgICAgIGNvbnN0IHI6IGFueSA9IHsgZGlzcGxheTogJ25vbmUnIH07XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkICYmIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2w7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBpbiBjb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uc1tjXS5maWVsZCA9PSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbHVtbnNbY107XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBmb3JEYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBmb3JOdW1iZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGZvckJvb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gcm93RGF0YVt0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZF07XHJcbiAgICAgICAgICAgIGlmIChjb2wpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZSB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZXRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuY29udmVydFRvRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuaW50IHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kZWNpbWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvck51bWJlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuYm9vbGVhbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKC90cnVlL2kpLnRlc3QodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvckJvb2wgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fY29sb3JGaWx0ZXJUYWJsZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2NvbG9yRmlsdGVyVGFibGVbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlVHlwZSA9IGl0ZW1bMF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IGl0ZW1bNV07XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyVmFsdWU6IGFueSA9IGl0ZW1bMV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9yRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gaXRlbVsyXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyVmFsdWUgPT0gbnVsbCkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JOdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IGl0ZW1bM107XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGZpbHRlclZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JCb29sKSBmaWx0ZXJWYWx1ZSA9IGl0ZW1bNF07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVUeXBlID09ICdyZWdleCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChmaWx0ZXJWYWx1ZSwgJ2knKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7IH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdlcXVhbHMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnbm90RXF1YWxzJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBmaWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ2NvbnRhaW5zJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoZmlsdGVyVmFsdWUsICdpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ25vdENvbnRhaW5zJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoZmlsdGVyVmFsdWUsICdpJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5tYXRjaChyZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdncmVhdGVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnbGl0dGVyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9EYXRlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSAne25vd30nKSByZXR1cm4gRGF0ZSgpO1xyXG5cclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgneycpICYmIHZhbHVlLmVuZHNXaXRoKCdkfScpKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlLnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnZH0nLCAnJykpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCd7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ2h9JykpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCdofScsICcnKSk7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoZGF0ZS5nZXRIb3VycygpICsgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgneycpICYmIHZhbHVlLmVuZHNXaXRoKCdtfScpKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlLnJlcGxhY2UoJ3snLCAnJykucmVwbGFjZSgnbX0nLCAnJykpO1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCcvJykgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUocGFydHNbMl0gKyAnLScgKyBwYXJ0c1sxXSArICctJyArIHBhcnRzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKCFpc05hTihkYXRlLmdldERhdGUoKSkpIHJldHVybiBkYXRlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICR7Y29sb3J9IDAlLCAke2NvbG9yfTRkIDM1JSwgJHtjb2xvcn0xYSA2MCUsIHRyYW5zcGFyZW50IDEwMCUpYDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduQ2VudGVyQ29sdW1uKGNvbCkge1xyXG4gICAgICAgIHJldHVybiBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZXRpbWUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmJvb2xlYW4gfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmVudW07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnblJpZ2h0Q29sdW1uKGNvbCkge1xyXG4gICAgICAgIHJldHVybiBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuaW50IHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kZWNpbWFsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb2xTcGFuR3JvdXAgPSAobnVtT2ZDb2xDdXN0b206IG51bWJlciA9IDApID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmNvbHMuZmlsdGVyKHggPT4geC52aXNpYmxlID09PSBudWxsIHx8IHgudmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IHgudmlzaWJsZSA9PT0gdHJ1ZSkubGVuZ3RoXHJcbiAgICAgICAgICAgICsgKHRoaXMuc2V0dGluZy5oaWRkZW5PcmRlckNvbHVtbiA/IDAgOiAxKVxyXG4gICAgICAgICAgICArICh0aGlzLnNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSlcclxuICAgICAgICAgICAgLSBudW1PZkNvbEN1c3RvbTtcclxuICAgIH1cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlS2V5cHJlc3NDb250cm9sKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQgJiYgdGhpcy5jb250ZXh0LnJvb3QuZGF0YS5saXN0UXVldWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RRdWV1ZSA9IHRoaXMuY29udGV4dC5yb290LmRhdGEubGlzdFF1ZXVlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0UXVldWUuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdFF1ZXVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVNdWx0aXBsZURlbGV0ZSgpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVEZWxldGUoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUVkaXQocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZUVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICYmIHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gIT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVEZWxldGUocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZURlbGV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAmJiByb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICE9ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93SGlzdG9yeShyb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnNob3dIaXN0b3J5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldHRpbmcuaGlzdG9yeSA9IHJvd0RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dMaXN0VmVyc2lvbihyb3dEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnZlcnNpb25Nb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy52ZXJzaW9uTW9kZWwuaXRlbURhdGEgPSByb3dEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0V2lkdGhGdW5jdGlvbih0YWJsZSkge1xyXG4gICAgICAgIGlmICh0aGlzLndpZHRoRnVuY3Rpb25Db2x1bW4pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHdpZHRoSW5QaXhlbCA9IHRoaXMuX2RlZmF1bHRXaXRoRnVuY3Rpb25Db2x1bW47XHJcbiAgICAgICAgY29uc3QgdGQgPSB0YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RkW2NsYXNzKj1cImNvbHVtbi1mdW5jdGlvblwiXScpO1xyXG4gICAgICAgIGlmICh0ZCkge1xyXG4gICAgICAgICAgICBjb25zdCBlbVRvUGl4Y2VsID0gdGhpcy5nZXRGb250U2l6ZUluUGl4ZWwodGQpO1xyXG4gICAgICAgICAgICBjb25zdCBidXR0b25zID0gdGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGJ1dHRvbnMubGVuZ3RoICogMi40OyAvLyBidXR0b24gd2lkdGg6IDIuNHJlbVxyXG4gICAgICAgICAgICBjb25zdCB0bXBXaWR0aEluUGl4ZWwgPSB3aWR0aCAqIGVtVG9QaXhjZWwgKyA2OyAvLyA2IGxhIHRvbmcgcGFkZGluZyBsZWZ0LCByaWdodCBjdWEgdGhcclxuICAgICAgICAgICAgaWYgKHdpZHRoSW5QaXhlbCA8IHRtcFdpZHRoSW5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGhJblBpeGVsID0gdG1wV2lkdGhJblBpeGVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0aCA9IHRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhbY2xhc3MqPVwic2V0dGluZy1jZWxsXCJdJyk7XHJcbiAgICAgICAgaWYgKHRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtVG9QaXhjZWwgPSB0aGlzLmdldEZvbnRTaXplSW5QaXhlbCh0aCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gYnV0dG9ucy5sZW5ndGggKiAyLjQgLyAwLjg1OyAvLyBidXR0b24gd2lkdGg6IDIuNHJlbSwgZm9udC1zaXplIHRoIDAuODVyZW1cclxuICAgICAgICAgICAgY29uc3QgdG1wV2lkdGhJblBpeGVsID0gd2lkdGggKiBlbVRvUGl4Y2VsICsgNjsgLy8gNiBsYSB0b25nIHBhZGRpbmcgbGVmdCwgcmlnaHQgY3VhIHRoXHJcbiAgICAgICAgICAgIGlmICh3aWR0aEluUGl4ZWwgPCB0bXBXaWR0aEluUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgIHdpZHRoSW5QaXhlbCA9IHRtcFdpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRoSW5QaXhlbH1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGb250U2l6ZUluUGl4ZWwoZWwpIHtcclxuICAgICAgICByZXR1cm4gTnVtYmVyKGdldENvbXB1dGVkU3R5bGUoZWwsICcnKS5mb250U2l6ZS5tYXRjaCgvKChcXGR8LikrKXB4LylbMV0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHByb2Nlc3NCYXNlRGF0YSgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnByZVByb2Nlc3NEYXRhKHRoaXMubW9kZWwuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBwcmVQcm9jZXNzRGF0YShkYXRhU291cmNlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBjb2xIYXNQaXBlID0gdGhpcy5zZXR0aW5nLmNvbHMuZmlsdGVyKHggPT4geC5waXBlKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xIYXNQaXBlKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybSg8UGlwZVRyYW5zZm9ybT5jb2wucGlwZSwgY29sLmFzeW5jUGlwZSwgaXRlbVtjb2wuZmllbGRdKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW2BwaXBlX18ke2NvbC5maWVsZH0gYF0gPSBycztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhc3luYyB0cmFuc2Zvcm0ocGlwZTogUGlwZVRyYW5zZm9ybSwgYXN5bmNQaXBlOiBib29sZWFuLCB2YWx1ZSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkVHJhbnNmb3Jtc1t2YWx1ZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVHJhbnNmb3Jtc1t2YWx1ZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYXN5bmNQaXBlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGF3YWl0IHBpcGUudHJhbnNmb3JtKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSA9IHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBpcGUudHJhbnNmb3JtKHZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSA9IHZhbDtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVJvd09yZGVyZWQoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vblJlb3JkZXJlZC5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTZXR0aW5nUm93Q29sb3IoKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzUm93Q29sb3IgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBidWlsZEZpbHRlckNvbHVtbihjb2xzKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVGaWx0ZXIgPSB0aGlzLnRlbXBsYXRlRmlsdGVyO1xyXG4gICAgICAgIGNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLmNvbnRyb2xUeXBlID09IENvbnRyb2xUeXBlLmRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmJhc2VTZXJ2aWNlIHx8IChjb2wuZGF0YVNvdXJjZSAmJiBjb2wuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5pbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duW2NvbC5maWVsZF0gPSBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29sLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbzogJ2JvZHknLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ0No4buNbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2FkT25Jbml0OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxvYWQ6IGNvbC5pc1NlcnZlckxvYWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZyhgQ2jGsGEgY+G6pXUgaMOsbmggYmFzZVNlcnZpY2UgaG/hurdjIGRhdGFTb3VyY2UgY2hvIGPhu5l0ICR7Y29sLmZpZWxkfTogJHtjb2wubGFiZWx9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmludCB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGVjaW1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkOiAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGUgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRhdGV0aW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jR2V0VmFsdWU6IGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYWRkRGF5KGl0ZW0sIDEsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNHZXRWYWx1ZTogaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkgKyAxLCAwLCAwLCAtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5ib29sZWFuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuY29udGFpbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGaWVsZEZpbHRlcihjb2wpIHtcclxuICAgICAgICByZXR1cm4gY29sLmZpZWxkRmlsdGVyID8gY29sLmZpZWxkRmlsdGVyIDogY29sLmZpZWxkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Q3VzdG9tRmlsdGVyKCkge1xyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25TZWFyY2ggPSAobm9kZT8pID0+IHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKTtcclxuICAgICAgICB0aGlzLmZpbHRlcl9jb2x1bW4gPSB0aGlzLl9jcnVkU2VydmljZS5nZXRGaWx0ZXJGcm9tVGVtcGxhdGUodGhpcy50ZW1wbGF0ZUZpbHRlciwgdGhpcy5nZXRNaW5pbWl6ZURhdGEodGhpcy5maWx0ZXJEYXRhKSk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TWluaW1pemVEYXRhKG1vZGVsKSB7XHJcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcclxuICAgICAgICAgICAgaWYgKG1vZGVsLl9kcm9wZG93bnZhbHVlICE9IG51bGwgJiYgbW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbbW9kZWwuX2Ryb3Bkb3dudmFsdWVdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICdfc3RhdHVzJyAmJiBrZXkgIT0gJ19lcnJvcnMnICYmIGtleSAhPSAnX3NvdXJjZScpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKG1vZGVsW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheShtb2RlbCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJyID0gW107XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5nZXRNaW5pbWl6ZURhdGEoaXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG1vZGVsICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG1vZGVsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhclNlYXJjaChub2RlLCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSAhPSBudWxsICYmIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ2xlYXJOdW1iZXJTZWFyY2gobm9kZSwgY29udHJvbCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5jbGVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBubyBuZWVkIGNsZWFyIGRhdGEgYmVjYXVzZSBpdCdzIDIgd2F5cyBiaW5kaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VhcmNoKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhckRhdGVTZWFyY2gobm9kZSwgY29udHJvbCwgZmllbGQpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wuY2xlYXIoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbmVlZCBjbGVhciBkYXRhIGJlY2F1c2Ugbm90IDIgd2F5cyBiaW5kaW5nXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNoYW5nZURhdGVUaW1lKGV2dCwgZmllbGQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdID0gZXZ0LnZhbHVlO1xyXG4gICAgICAgIHRoaXMub25TZWFyY2goKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DaGFuZ2VCb29sZWFuKGV2dCwgZmllbGQpIHtcclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJEYXRhW2ZpZWxkXS5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckRhdGFbZmllbGRdLnNwbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVGaWx0ZXJCb3hGb2N1cyhub2RlKSB7XHJcbiAgICAgICAgaWYgKG5vZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlRWw6IGFueSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluU2FtZUJveCA9IHRoaXMuY2hlY2tJbk5vZGUoYWN0aXZlRWwsIG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpblNhbWVCb3ggfHwgKGFjdGl2ZUVsICYmIGFjdGl2ZUVsLm5vZGVOYW1lICE9ICdJTlBVVCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBub2RlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSBpbnB1dC5zZWxlY3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluU2FtZUJveCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsLnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TaG93RmlsdGVyRHJvcGRvd25QYW5lbChldmVudCkge1xyXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGV2ZW50LmNvbXBvbmVudC5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGxIZWFkZXJGaWx0ZXIgPSBkcm9wZG93bi5jbG9zZXN0KCd0aCcpO1xyXG5cclxuICAgICAgICAvLyB0aGVtIGNsYXNzIGZvY3VzLXdpdGhpbiBkZSBkcm9wZG93biBpbnB1dCBsdWMgZm9jdXMga2hvbmcgYmkgZGUgYm9pIGNhYyBzdGlja3kgY29sdW1uXHJcbiAgICAgICAgY2VsbEhlYWRlckZpbHRlciAmJiBjZWxsSGVhZGVyRmlsdGVyLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzLXdpdGhpbicpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGlkZUZpbHRlckRyb3Bkb3duUGFuZWwoZXZlbnQpIHtcclxuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZHJvcGRvd24gPSBldmVudC5jb21wb25lbnQuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxsSGVhZGVyRmlsdGVyID0gZHJvcGRvd24uY2xvc2VzdCgndGgnKTtcclxuICAgICAgICBjZWxsSGVhZGVyRmlsdGVyICYmIGNlbGxIZWFkZXJGaWx0ZXIuY2xhc3NMaXN0LnJlbW92ZSgnZm9jdXMtd2l0aGluJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRGaWx0ZXJCb3hGb2N1cyhub2RlKSB7XHJcbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUub2Zmc2V0V2lkdGggPCAyNTApIHtcclxuICAgICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnc2hvcnQtZmlsdGVyLWJveCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdzaG9ydC1maWx0ZXItYm94Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja0luTm9kZShjaGlsZCwgcGFyZW50KSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gY2hpbGQ7XHJcbiAgICAgICAgd2hpbGUgKHN0YXJ0ICYmIHN0YXJ0LnBhcmVudE5vZGUgIT0gcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzdGFydCAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlUGFnZVNpemUoKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlUGFnZVNldHRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlVGFibGVSZW5kZXJlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RvcENhbGN1bGF0aW5nRnVuY3Rpb25Db2x1bW5XaWR0aCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy50YWJsZSkgdGhpcy5nZXRXaWR0aEZ1bmN0aW9uKHRoaXMudGFibGUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgJHRocyA9IHRoaXMudGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZCB0cjpub3QoOmZpcnN0LWNoaWxkKSB0aCcpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgJHRocy5sZW5ndGg7ICsraSkge1xyXG4gICAgICAgICAgICAkdGhzW2ldLnN0eWxlLnRvcCA9IGAkeyR0aHNbaV0ub2Zmc2V0VG9wfXB4YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VsZWN0IGzhuqFpIGl0ZW0gY3Xhu5FpIGPDuW5nIMSRxrDhu6NjIHNlbGVjdCB0csaw4bubYyDEkcOzXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5yZVNlbGVjdExhc3RJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0ICR0ciA9IHRoaXMuZ2V0VHJCeVJvd0RhdGEodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0KTtcclxuICAgICAgICAgICAgICAgIGlmICgkdHIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUxhc3QgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgJHRyLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblJlbG9hZGVkLmVtaXQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRUckJ5Um93RGF0YShyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFibGUpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZmluZEluZGV4KHAgPT4gcC5pZCA9PSByb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRyID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYHRib2R5IHRyW3Jvd0luZGV4PVwiJHtpbmRleH1cIl1gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgc2hvd1NldHRpbmdzUGVybWlzc2lvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5jcmVhdGluZ1NlYXJjaEluZm8pIHJldHVybjtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGNyZWF0ZVNlYXJjaFNjaGVtYSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbHMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdC4bqhbiBjaMawYSBj4bqldSBow6xuaCBj4buZdCBjaG8gZGFuaCBzw6FjaCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNyZWF0aW5nU2VhcmNoSW5mbyA9IHRydWU7XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoSW5mbyA9IG5ldyBTZWFyY2hJbmZvKCk7XHJcbiAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEgPSA8Rm9ybUNvbnRyb2xCYXNlW10+W107XHJcbiAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duID0ge307XHJcbiAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnNldHRpbmcuY29scykge1xyXG4gICAgICAgICAgICBpZiAoY29sLmFsbG93RmlsdGVyICE9IGZhbHNlICYmIGNvbC5yYXdDb2x1bW4gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5mdWxsVGV4dFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5pbmRleE9mKGNvbC5maWVsZCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQucHVzaChjb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSAnVMOsbSBraeG6v20gdGhlbyBjw6FjIHRyxrDhu51uZzonO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgKz0gYCBcIiR7Y29sLmxhYmVsID8gY29sLmxhYmVsIDogY29sLmZpZWxkfVwiLGA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGF3YWl0IHRoaXMuc2V0dGluZy5mdW5jdGlvbi5nZXRTZWFyY2hDb250cm9sKGNvbC5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaCguLi5jb250cm9sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2wuYmFzZVNlcnZpY2UgfHwgKGNvbC5kYXRhU291cmNlICYmIGNvbC5kYXRhU291cmNlLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uZmllbGREcm9wZG93bltjb2wuZmllbGRdID0gbmV3IERyb3Bkb3duQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IGNvbC5tdWx0aXBsZSA/IE9wZXJhdG9yLmluIDogT3BlcmF0b3IuZXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiBjb2wubWRXaWR0aCA/IGNvbC5tZFdpZHRoIDogMTAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkT25Jbml0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duW2NvbC5maWVsZF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdpbnQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTnVtYmVyUmFuZ2VDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1R5cGU6ICdpbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnZGVjaW1hbCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVHlwZTogJ2RlY2ltYWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnZGF0ZScgfHwgY29sLmRhdGFUeXBlID09ICdkYXRldGltZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGVja0JveExpc3RDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZTogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiB0cnVlLCBsYWJlbDogYEPDs2AgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogZmFsc2UsIGxhYmVsOiBgS2jDtG5nYCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2wuZmllbGQgIT0gY29sLmRhdGFUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0Q29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5jb250YWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZFdpZHRoOiBjb2wubWRXaWR0aCA/IGNvbC5tZFdpZHRoIDogMTBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5pbmRleE9mKGZpZWxkKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LnB1c2goZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0ID0gJ1TDrG0ga2nhur9tIHRoZW8gY8OhYyB0csaw4budbmc6JztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5zZXR0aW5nLm1vZGVsU2NoZW1hcy5maW5kKHAgPT4gcC5maWVsZCA9PSBmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgKz0gYCBcIiR7Y29sLm5hbWV9XCIsYDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0LnN1YnN0cmluZygwLCBzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0Lmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlYXJjaEluZm8gPSBzZWFyY2hJbmZvO1xyXG4gICAgICAgIHRoaXMuY3JlYXRpbmdTZWFyY2hJbmZvID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTZXR0aW5nc1dvcmtmbG93KCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdzV29ya2Zsb3dOZXcoKSB7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVXb3JrZmxvd1NldHRpbmdzKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZyA9IGV2ZW50O1xyXG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UucmVsb2FkUGFnZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2F2ZVdvcmtmbG93U2V0dGluZ3NOZXcoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy53b3JrZmxvd1NldHRpbmdNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jb21tb25TZXJ2aWNlLnJlbG9hZFBhZ2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25SZW1vdmVXb3JrZmxvd1NldHRpbmdzKGV2dCkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ29Ub1Rhc2soZXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0No4bupYyBuxINuZyB4ZW0gY2hpIHRp4bq/dCBjw7RuZyB2aeG7h2MgeOG7rSBsw70gdOG7nSB0csOsbmggxJFhbmcgxJHGsOG7o2MgaG/DoG4gdGhp4buHbi4uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsLmxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZiA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmNvbnRhaW5lclZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLW92ZXJsYXknKTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGVsZW1lbnQuY2xvc2VzdCgncC10YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVTY3JvbGxCYXJDb250ZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlU2Nyb2xsQmFyQ29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BzLWNvbnRlbnQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5vZGVTY3JvbGxCYXJDb250ZW50LnBhcmVudE5vZGUucHJlcGVuZChlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGggPSBlbGVtZW50LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcigncC10YWJsZSB0aGVhZCB0cjpmaXJzdC1jaGlsZCA+IHRoJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoU2l6ZSA9IGZpcnN0VGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nSWNvbiA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctaWNvbicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUobG9hZGluZ0ljb24pLmZvbnRTaXplKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IChmaXJzdFRoU2l6ZS5oZWlnaHQgLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IChmaXJzdFRoU2l6ZS53aWR0aCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nSWNvbi5zdHlsZS5tYXJnaW5Ub3AgPSBgJHt0b3B9cHhgO1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luTGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
2421
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wcm9qZWN0cy90bngtc2hhcmVkL3NyYy9saWIvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2NydWQvY3J1ZC1saXN0L2NydWQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUVILFNBQVMsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUM5RyxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFBcUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xHLE9BQU8sRUFDSCx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFDdEYsZUFBZSxFQUFFLFFBQVEs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TUFBTTswQkFDTixNQUFNO3lCQUNOLE1BQU07dUJBQ04sTUFBTTt5QkFDTixNQUFNO3NCQUNOLE1BQU07NEJBQ04sTUFBTTtvQkFDTixNQUFNO3FCQUNOLE1BQU07cUJBQ04sTUFBTTt1QkFDTixNQUFNOytCQUNOLE1BQU07Z0NBQ04sTUFBTTs2QkFDTixNQUFNO2dDQUNOLE1BQU07a0NBQ04sTUFBTTttQ0FDTixNQUFNO3NDQUNOLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSwgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICAgIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBQaXBlVHJhbnNmb3JtLFxyXG4gICAgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9jb250ZXh0bWVudSc7XHJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgRW51bUdldFJlZlR5cGUsIEtleUZpZWxkR2V0UmVmVHlwZSwgS2V5Rmxhc2hTaG93IH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNjaGVtYSwgaXNBcnJheSwgaXNMaXRlcmFsT2JqZWN0IH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9lbnZpcm9ubWVudC1zY2hlbWEnO1xyXG5pbXBvcnQge1xyXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSwgQ29sdW1uU2NoZW1hQmFzZSwgQ29udHJvbFR5cGUsIENydWRMaXN0Q29uZmlnLCBDcnVkTGlzdERhdGEsXHJcbiAgICBDcnVkTGlzdFNldHRpbmcsIERhdGFUeXBlLCBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSwgRGlhbG9nTW9kZWwsIERyb3Bkb3duQ29udHJvbFNjaGVtYSxcclxuICAgIEV4cG9ydEl0ZW1zTW9kZSwgRm9ybUNvbnRyb2xCYXNlLCBIZWlnaHRUeXBlLCBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEsIE9wZXJhdG9yLCBQb3B1cFNpemUsXHJcbiAgICBUZXh0QWxpZ24sIFRleHRDb250cm9sU2NoZW1hXHJcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IEFjdGlvbiwgRW51bVdGTmhvbVRyYW5nVGhhaSwgTWFuYWdlclR5cGUgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL3dvcmtmbG93LXNjaGVtYSc7XHJcbmltcG9ydCB7IEZpbHRlciwgR3JpZEluZm8sIFNvcnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21Sb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VzdG9tLXJvdXRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZW50aXR5LW1ldGFkYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXhwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNb2R1bGVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kdWxlLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IG11bHRpcGxlU29ydCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FycmF5JztcclxuaW1wb3J0IHsgYWRkWmVybyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2RhdGUnO1xyXG5pbXBvcnQgeyBTZWFyY2hJbmZvIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NlYXJjaCc7XHJcbmltcG9ydCB7IFN0YXRlTWFjaGluZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RhdGVtYWNoaW5lcy9zZXJ2aWNlcy9zdGF0ZW1hY2hpbmVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUbkN1c3RvbVNjcm9sbGJhckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RuLWN1c3RvbS1zY3JvbGxiYXIvdG4tY3VzdG9tLXNjcm9sbGJhci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBXZkl0ZW0gfSBmcm9tICcuLi8uLi93b3JrZmxvdy9tb2RlbHMvbW9kZWxzJztcclxuaW1wb3J0IHsgQ2FuQm9fSG9Tb1NlcnZpY2UgfSBmcm9tICcuLi8uLi93b3JrZmxvdy9zZXJ2aWNlcy9jYW5iby1ob3NvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvc2VydmljZXMvZW50aXR5LXdvcmtmbG93LWhpc3Rvcnkuc2VydmljZSc7XHJcbmltcG9ydCB7IGRhdGFTb3VyY2VJY29uIH0gZnJvbSAnLi4vLi4vd29ya2Zsb3cvd29ya2Zsb3ctc2V0dGluZy93b3JrZmxvdy1zZXR0aW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGJhc2VUcmluaEt5IH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2NydWQtbGlzdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1saXN0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NydWQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbRGVjaW1hbFBpcGUsIERhdGVQaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3J1ZExpc3RDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgdGFibGU6IFRhYmxlO1xyXG4gICAgQFZpZXdDaGlsZChUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pIHNldCBfdGFibGUodjogVGFibGUpIHtcclxuICAgICAgICB0aGlzLnRhYmxlID0gdjtcclxuICAgICAgICB0aGlzLnRhYmxlUmVhZHkubmV4dCh0aGlzKTtcclxuICAgIH1cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lcjogRWxlbWVudFJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvblRvZ2dsZVJvd0dyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgaWNvblRvZ2dsZVJvd0dyb3VwOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgnaWNvblRvZ2dsZVJvd0RhdGEnLCB7IHN0YXRpYzogdHJ1ZSB9KSBpY29uVG9nZ2xlUm93RGF0YTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ2VudGl0eVdvcmtmbG93U3RhdHVzJywgeyBzdGF0aWM6IHRydWUgfSkgdGVtcGxhdGVFbnRpdHlXb3JrZmxvd1N0YXR1czogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3RyYW5nVGhhaVY1JywgeyBzdGF0aWM6IHRydWUgfSkgdGVtcGxhdGVUcmFuZ1RoYWlWNTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3ZpZXdIaXN0b3J5JywgeyBzdGF0aWM6IHRydWUgfSkgdGVtcGxhdGVDb2xWaWV3SGlzdG9yeTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBWaWV3Q2hpbGQoJ3dvcmtmbG93Q29yZVN0YXR1cycsIHsgc3RhdGljOiB0cnVlIH0pIHRlbXBsYXRlV29ya2Zsb3dDb3JlU3RhdHVzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsYmFyJywgeyBzdGF0aWM6IHRydWUgfSkgc2Nyb2xsYmFyOiBUbkN1c3RvbVNjcm9sbGJhckNvbXBvbmVudDtcclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcclxuICAgIEBDb250ZW50Q2hpbGQoJ3NlYXJjaEN1c3RvbScsIHsgc3RhdGljOiB0cnVlIH0pIHNlYXJjaEN1c3RvbTogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2hlYWRlcicsIHsgc3RhdGljOiB0cnVlIH0pIGhlYWRlcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ2hlYWRlckZpbHRlcicsIHsgc3RhdGljOiB0cnVlIH0pIGhlYWRlckZpbHRlcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ3Jvd0V4cGFuc2lvbicsIHsgc3RhdGljOiB0cnVlIH0pIHJvd0V4cGFuc2lvbjogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ3N1bW1hcnknLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdW1tYXJ5OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnZm9vdGVyJywgeyBzdGF0aWM6IHRydWUgfSkgZm9vdGVyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQENvbnRlbnRDaGlsZCgnY29sZ3JvdXAnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb2xncm91cDogVGVtcGxhdGVSZWY8YW55PjtcclxuICAgIEBDb250ZW50Q2hpbGQoJ3Jvd0dyb3VwJywgeyBzdGF0aWM6IHRydWUgfSkgcm93R3JvdXA6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkKCdjb250ZW50Um93R3JvdXAnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250ZW50Um93R3JvdXA6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG5cclxuICAgIEBJbnB1dCgpIG1vZGVsOiBDcnVkTGlzdERhdGEgPSBuZXcgQ3J1ZExpc3REYXRhKCk7XHJcbiAgICBASW5wdXQoKSBzZXR0aW5nOiBDcnVkTGlzdFNldHRpbmcgPSBuZXcgQ3J1ZExpc3RTZXR0aW5nKCk7XHJcbiAgICBASW5wdXQoKSBmaWxlTmFtZSA9ICdleHBvcnQnO1xyXG4gICAgQElucHV0KCkgbGF6eSA9IHRydWU7IC8vIMSR4bq3dCBnacOhIHRy4buLIG7DoHkgYuG6sW5nIGZhbHNlIHRow6wgc+G6vSBmaWx0ZXIgxJFjIGNsaWVudFxyXG5cclxuICAgIC8vIGR1bmcgZG9uIHZpIHJlbSBkZSB3aWR0aCBraG9uZyBiaSBhbmggaHVvbmcgYm9pIGZvbnQgc2l6ZSBjdWEgdGgsIG5vIHNlIGxheSB0aGVvIGZvbnQgc2l6ZSBjdWEgdGhlIGh0bWxcclxuICAgIEBJbnB1dCgpIHdpZHRoQ2hlY2tib3ggPSAnMi41cmVtJztcclxuICAgIEBJbnB1dCgpIHdpZHRoT3JkZXJDb2x1bW4gPSAnMy41cmVtJztcclxuICAgIF9kZWZhdWx0V2l0aEZ1bmN0aW9uQ29sdW1uID0gODE7XHJcbiAgICBfd2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3RoaXMuX2RlZmF1bHRXaXRoRnVuY3Rpb25Db2x1bW59cHhgO1xyXG4gICAgQElucHV0KCkgd2lkdGhGdW5jdGlvbkNvbHVtbjogc3RyaW5nO1xyXG4gICAgX2NsYXNzUm93R3JvdXAgPSAnbm8tcGFkZGluZyc7XHJcbiAgICBASW5wdXQoKSBzZXQgY2xhc3NSb3dHcm91cCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzUm93R3JvdXAgPSBgbm8tcGFkZGluZyAke3ZhbHVlfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbGFzc1Jvd0dyb3VwID0gYG5vLXBhZGRpbmdgO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpIHNob3dTY3JvbGxCYXIgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcFRhYmxlU2Nyb2xsYWJsZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcFRhYmxlU2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBjb25maWdTY3JvbGxCYXI6IGFueTtcclxuICAgIEBJbnB1dCgpIHNob3dTY3JvbGxIb3Jpem9udGFsID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHNob3dSYWRpbyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuQWRkID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBoaWRkZW5EZWxldGUgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlbkVkaXQgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGhpZGRlblZpZXcgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGRpc2FibGVLZXlwcmVzc0NvbnRyb2wgPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBlc2NhcGUgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBDcnVkTGlzdENvbmZpZyA9IG5ldyBDcnVkTGlzdENvbmZpZygpO1xyXG4gICAgQElucHV0KCkgZW5hYmxlUmVvcmRlclJvdyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXNGcm9tUGFyZW50OiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSBjaGlsZHJlbkZyb21QYXJlbnQ6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICAgIEBJbnB1dCgpIG1lbnVCdXR0b25zOiAocm93RGF0YSkgPT4gTWVudUl0ZW1bXTtcclxuICAgIEBJbnB1dCgpIGZpZWxkT3JkZXI6IHN0cmluZyA9ICdfaW5kZXgnO1xyXG5cclxuICAgIF9zdHlsZTogYW55ID0ge307XHJcbiAgICBASW5wdXQoKSBzZXQgc3R5bGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zdHlsZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBzZXQgdGFibGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdGFibGVDbGFzcyA9IHRoaXMuX2RlZmF1bHRUYWJsZUNsYXNzO1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRyaW0oKSAhPSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzICs9IGAgJHt2YWx1ZX1gO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXR1cFRhYmxlQ2xhc3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBfZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuICAgIEBJbnB1dCgpIHNldCBkYXRhU291cmNlKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBkYXRhU291cmNlID0gW107XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGRhdGFTb3VyY2UgPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRGF0YVNvdXJjZShkYXRhU291cmNlKTtcclxuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcclxuICAgIH1cclxuICAgIC8vIGZpbHRlciBt4bq3YyDEkeG7i25oIGNobyBkZXYgY29kZVxyXG4gICAgQElucHV0KCkgZmlsdGVyX2RlZmF1bHQ6IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgQE91dHB1dCgpIG9uUm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVvcmRlcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hlY2tBbGw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWxvYWQ6IEV2ZW50RW1pdHRlcjxHcmlkSW5mbz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRJbmZvPigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVsb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkNvbnRlbnRJbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWRkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uRWRpdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblZpZXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25EZWxldGVNdWx0aXBsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkludmFsaWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblN0YXJ0ZWRXb3JrZmxvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblByb2Nlc3NlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uUm9sbGJhY2tlZFdvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlZFN0YXR1c1dvcmtmbG93OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIHByaXZhdGUgdGFibGVSZWFkeSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIHRhYmxlUmVhZHlTb3VyY2UkID0gdGhpcy50YWJsZVJlYWR5LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGNoZWNrZWRBbGwgPSBudWxsO1xyXG4gICAgcm93R3JvdXBDaGVja2VkOiBhbnkgPSB7fTtcclxuICAgIHJvd0dyb3VwTWV0YWRhdGE6IGFueSA9IHt9O1xyXG4gICAgZGF0YVNvdXJjZUludGVybmFsOiBhbnlbXTtcclxuICAgIGNsYXNzVG9vbGJhciA9ICcnO1xyXG4gICAgaXRlbVNldHRpbmdzOiBhbnkgPSB7fTtcclxuICAgIHNvcnRIaXN0b3J5OiBTb3J0W10gPSBbXTtcclxuICAgIHNvcnRDbGllbnRIaXN0b3J5OiBhbnkgPSB7fTtcclxuICAgIF9ncm91cEZpZWxkOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgZW5hYmxlZFdmMSA9IHVuZGVmaW5lZDtcclxuICAgIHNob3dpbmdBY3Rpb25Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgYnV0dG9uQ29udGV4dHM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBfZGVmYXVsdFRhYmxlQ2xhc3MgPSAnbmV3LXRhYmxlIHNjci10YWJsZSBjcnVkLWxpc3QtdGFibGUnO1xyXG4gICAgX3RhYmxlQ2xhc3MgPSAnJztcclxuICAgIF9zaG93U2V0dGluZ3NSb3dDb2xvciA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5ncyA9IGZhbHNlO1xyXG4gICAgX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICBfc2hvd1NldHRpbmdzUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgX2NvbG9yRmlsdGVyVGFibGUgPSBbXTtcclxuICAgIF9zb3J0RmllbGQgPSAnJztcclxuICAgIF9zb3J0RGlyOiAtMSB8IDAgfCAxIHwgMiA9IC0xO1xyXG5cclxuICAgIHRlbXBsYXRlOiBhbnkgPSB7fTtcclxuICAgIHRlbXBsYXRlRmlsdGVyOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgdGVtcGxhdGVIZWFkZXJDb250ZW50OiBhbnkgPSB7fTtcclxuXHJcbiAgICBjYWNoZWRUcmFuc2Zvcm1zID0ge307XHJcblxyXG4gICAgZmlsdGVyU2NoZW1hOiBhbnkgPSB7fTtcclxuICAgIGZpbHRlckRhdGE6IGFueSA9IHt9O1xyXG4gICAgc2VhcmNoSW5mbzogU2VhcmNoSW5mbyA9IG5ldyBTZWFyY2hJbmZvKCk7XHJcbiAgICBjcmVhdGluZ1NlYXJjaEluZm8gPSBmYWxzZTtcclxuXHJcbiAgICBmaWx0ZXJfY3VzdG9tOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIGPhu6dhIGFkdmFuY2Ugc2VhcmNoIHRy4bqjIHbhu4FcclxuICAgIGZpbHRlcl9hZHZhbmNlU2VhcmNoOiBGaWx0ZXJbXSA9IFtdO1xyXG4gICAgLy8gZmlsdGVyIHRoZW8gY8OhYyBmaWx0ZXIgaGnhu4NuIHRo4buLIHRyb25nIGPhu5l0IGPhu6dhIGdyaWRcclxuICAgIGZpbHRlcl9jb2x1bW46IEZpbHRlcltdID0gW107XHJcblxyXG4gICAgdGltZW91dDogYW55O1xyXG4gICAgaW50ZXJ2YWw6IGFueTtcclxuICAgIGRhdGFBZHZhbmNlOiBhbnkgPSB7fTtcclxuXHJcbiAgICBjdXJyZW50SXRlbTogYW55O1xyXG4gICAgc2hvd0Zvcm1Xb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgaGVhZGVyV29ya2Zsb3cgPSAnJztcclxuICAgIGFjdGlvbldvcmtmbG93OiBBY3Rpb247XHJcbiAgICBwb3B1cFNpemVXb3JrZmxvdzogUG9wdXBTaXplID0gbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiA5NTAsIGhlaWdodDogNTQwIH0pO1xyXG4gICAgc2hvd0hpc3RvcnlXb3JrZmxvdyA9IGZhbHNlO1xyXG5cclxuICAgIHN0YXJ0V29ya2Zsb3dNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ0No4buNbiBxdXkgdHLDrG5oIG5naGnhu4dwIHbhu6Ugc+G7rSBk4bulbmcnXHJcbiAgICB9KTtcclxuICAgIHByb2Nlc3NXb3JrZmxvd01vZGVsOiBEaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCgpO1xyXG4gICAgd29ya2Zsb3dTZXR0aW5nTW9kZWw6IERpYWxvZ01vZGVsID0gbmV3IERpYWxvZ01vZGVsKCk7XHJcbiAgICB3b3JrZmxvd0hpc3RvcnlNb2RlbDogRGlhbG9nTW9kZWwgPSBuZXcgRGlhbG9nTW9kZWwoe1xyXG4gICAgICAgIGhlYWRlcjogJ1hlbSBs4buLY2ggc+G7rSdcclxuICAgIH0pO1xyXG5cclxuICAgIGVudGl0eU1ldGFkYXRhU2VydmljZTogRW50aXR5TWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgZW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZTogRW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZTtcclxuXHJcbiAgICBzdGF0ZU1hY2hpbmVzU2VydmljZTogU3RhdGVNYWNoaW5lc1NlcnZpY2U7XHJcblxyXG4gICAgY2FuQm9fSG9Tb1NlcnZpY2U6IENhbkJvX0hvU29TZXJ2aWNlO1xyXG5cclxuICAgIHNvdXJjZUljb246IGFueSA9IHt9O1xyXG4gICAgc3RvcENhbGN1bGF0aW5nRnVuY3Rpb25Db2x1bW5XaWR0aCA9IGZhbHNlO1xyXG4gICAgc2VsZWN0ZWRJdGVtTGFzdDogYW55O1xyXG5cclxuICAgIHJvd0RhdGFDdXJyZW50OiBhbnk7XHJcbiAgICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRTY2hlbWE7XHJcblxyXG4gICAgcHVibGljIF9yb3V0ZXI6IFJvdXRlcjtcclxuICAgIHB1YmxpYyBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xyXG4gICAgcHVibGljIF9jdXN0b21Sb3V0ZXJTZXJ2aWNlOiBDdXN0b21Sb3V0ZXJTZXJ2aWNlO1xyXG4gICAgcHVibGljIF91blN1YnNjcmliZUFsbCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICAgIHB1YmxpYyBfbm90aWZpZXJTZXJ2aWNlOiBOb3RpZmllclNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX2V4cG9ydFNlcnZpY2U6IEV4cG9ydFNlcnZpY2U7XHJcbiAgICBwdWJsaWMgX2xvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgX2luamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgX3NhbnRpbGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwdWJsaWMgX2RhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgICAgICBwcml2YXRlIF9tb2R1bGVDb25maWdTZXJ2aWNlOiBNb2R1bGVDb25maWdTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoUm91dGVyKTtcclxuICAgICAgICB0aGlzLl9jdXN0b21Sb3V0ZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEN1c3RvbVJvdXRlclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChOb3RpZmllclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRXhwb3J0U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbG9nZ2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChMb2dnZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmVudGl0eVdvcmtmbG93SGlzdG9yeVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoRW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZU1hY2hpbmVzU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChTdGF0ZU1hY2hpbmVzU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jYW5Cb19Ib1NvU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChDYW5Cb19Ib1NvU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja0FsbCA9IHRoaXMuaGFuZGxlQ2hlY2tBbGwuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNoZWNrQWxsX0dyb3VwID0gdGhpcy5oYW5kbGVDaGVja0FsbF9Hcm91cC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpLmVudmlyb25tZW50O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5DT01NT04uRU5USVRZX01FVEFEQVRBX1JFTE9BREVELCBzZXJ2aWNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbnRpdHlNZXRhZGF0YVNlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZpbHRlclNjaGVtYS5kYXRlUmFuZ2UgPSBuZXcgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEoeyBhcHBlbmRUbzogJ2JvZHknIH0pO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2NoZW1hLmRyb3Bkb3duID0ge307XHJcblxyXG4gICAgICAgIGRhdGFTb3VyY2VJY29uLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VJY29uW3NvdXJjZS5pZF0gPSBzb3VyY2UudGVuO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnRlbXBsYXRlRmlsdGVyID0gW107XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fdGFibGVDbGFzcykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJsZUNsYXNzID0gdGhpcy5fZGVmYXVsdFRhYmxlQ2xhc3M7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldHVwVGFibGVDbGFzcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRDb2x1bW5TY2hlbWEodGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU2VhcmNoU2NoZW1hKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuaGlkZGVuVHJpbmhLeSAmJiAhdGhpcy5tZW51QnV0dG9ucykge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVCdXR0b25zID0gKCkgPT4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIE7hur91IG3DoCDhuqluIGFkdmFuY2VzZWFyY2ggPT4gc+G6vSBraMO0bmcgY8OzIHRyaWdnZXIgbG9hZCBkYXRhIHThu6sgYWR2YW5jZSBzZWFyY2ggPT4gcGjhuqNpIHThu7EgZ+G7jWkgZ2V0RGF0YSDhu58gT25Jbml0XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oaWRkZW5BZHZhbmNlU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29sLmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZmluZFRlbXBsYXRlKGBoZWFkZXIke2NvbC5maWVsZC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKX0ke2NvbC5maWVsZC5zdWJzdHJpbmcoMSl9YCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSGVhZGVyQ29udGVudFtjb2wuZmllbGRdID0gdGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ29udGVudEluaXQuZW1pdCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cFRhYmxlQ2xhc3MoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tdWx0aXBsZUNoZWNrV2hlbkNsaWNrUm93IHx8ICF0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIG11bHRpLWNoZWNrJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBzaW5nbGUtY2hlY2snO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zdGlja3lDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIHN0aWNreS1jb2x1bW5zLWFjdGl2ZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYmxlQ2xhc3MgKz0gJyBoaWRkZW4tY29sdW1uLWNoZWNrYm94JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuaGlkZGVuT3JkZXJDb2x1bW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFibGVDbGFzcyArPSAnIGhpZGRlbi1jb2x1bW4tb3JkZXInO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Q29sdW1uU2NoZW1hKGNvbHM6IENvbHVtblNjaGVtYUJhc2VbXSkge1xyXG4gICAgICAgIGlmIChjb2xzKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2xGdW5jdGlvbiA9IG51bGwsIGNvbEdyb3VwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5maWVsZCA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sRnVuY3Rpb24gPSBjb2w7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2wuZ3JvdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb2xHcm91cCA9IGNvbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChjb2xGdW5jdGlvbiAmJiAhY29sRnVuY3Rpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoRnVuY3Rpb25Db2x1bW4gPSBjb2xGdW5jdGlvbi53aWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldENvbG9yU2V0dGluZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbHVtblNldHRpbmcoY29sR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmdldFBhZ2VTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDb2x1bW5TZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVpbGRGaWx0ZXJDb2x1bW4odGhpcy5zZXR0aW5nLmNvbHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dGVuZENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdLCBhcHBlbmRDb2wgPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFjb2xzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZiA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCB0ZW1wOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICBjb25zdCB0bXBDb2xzID0gWy4uLmNvbHNdO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZm9yRWFjaChjb2xSZW9yZGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xzW2ldLmZpZWxkID09IGNvbFJlb3JkZXIuY29sdW1uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goY29sc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBDw7JuIGzhuqFpIG5o4buvbmcgY29kZSBtw6Aga2jDtG5nIMSRxrDhu6NjIGPhuqV1IGjDrG5oIHRow6wgZ2jDqXAgbOG6oWkgdGhlbyBpbmRleCDEkcaw4bujYyBraGFpIGLDoW9cclxuICAgICAgICAgICAgbGV0IHRlbXBDb2xzOiBDb2x1bW5TY2hlbWFCYXNlW10gPSBbXTtcclxuICAgICAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhDb2xPbGQgPSB0bXBDb2xzLmZpbmRJbmRleChwID0+IHAuZmllbGQgPT0gY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleENvbE9sZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFTDrG0gduG7iyB0csOtIGPhu6dhIGPhu5l0IHBow61hIHRyxrDhu5tjIHRyb25nIGxpc3QgcmVvcmRlciBt4bubaVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleENvbEJlZm9yZU5ldyA9IHRlbXAuZmluZEluZGV4KHAgPT4gcC5maWVsZCA9PSB0bXBDb2xzW2luZGV4Q29sT2xkIC0gMV0uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleENvbEJlZm9yZU5ldyA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ29scy5zcGxpY2UoMCwgMCwgY29sKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVMOsbSB24buLIHRyw60gY+G7p2EgY+G7mXQgdHLGsOG7m2MgY+G7mXQgxJFhbmcga2nhu4NtIHRyYSB0cm9uZyBsaXN0IGPhu5l0IGfhu5FjXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sT2xkID0gdG1wQ29scy5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sQmVmb3JlTmV3ID0gdGVtcC5maW5kSW5kZXgocCA9PiBwLmZpZWxkID09IHRtcENvbHNbaW5kZXhDb2xPbGQgLSAxXS5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vID0+IMSQ4bq/biBraGkgdGjhuqV5IHRow6wgYWRkIGPhu5l0IGhp4buHbiB04bqhaSB2w6AgbGlzdCB04bqhbSB2w6BvIHbhu4sgdHLDrSBjaMOoblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleENvbEJlZm9yZU5ldyA9PSB0ZW1wLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKGNvbCwgLi4udGVtcENvbHMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5zcGxpY2UoaW5kZXhDb2xCZWZvcmVOZXcgKyAxLCAwLCBjb2wsIC4uLnRlbXBDb2xzKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5zcGxpY2UoMCwgY29scy5sZW5ndGgpO1xyXG4gICAgICAgIGNvbHMuc3BsaWNlKDAsIDAsIC4uLnRlbXApO1xyXG5cclxuICAgICAgICBsZXQgZmlyc3RDb2xWaXNpYmxlID0gbnVsbDtcclxuICAgICAgICBsZXQgZm91bmRJdGVtU2hvd0VkaXRMaW5rID0gZmFsc2U7XHJcbiAgICAgICAgdGVtcC5zcGxpY2UoMCwgdGVtcC5sZW5ndGgpO1xyXG4gICAgICAgIGxldCB0bXBDb2w6IENvbHVtblNjaGVtYUJhc2UgPSBudWxsO1xyXG4gICAgICAgIGZvciAoY29uc3QgaW5kIGluIGNvbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbHNbaW5kXTtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmF3Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ZW1wLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSBlbGVtZW50LmZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnZpc2libGUgIT09IHVuZGVmaW5lZCAmJiBjb25maWcudmlzaWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gY29uZmlnLnZpc2libGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGVsZW1lbnQubGFiZWwpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy50ZXh0QWxpZ24gIT09IHVuZGVmaW5lZCAmJiBjb25maWcudGV4dEFsaWduICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRleHRBbGlnbiA9IGNvbmZpZy50ZXh0QWxpZ247XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLndpZHRoICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLndpZHRoICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LndpZHRoID0gY29uZmlnLndpZHRoO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kYXRhVHlwZSA9PSBudWxsIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gdW5kZWZpbmVkIHx8IGVsZW1lbnQuZGF0YVR5cGUgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YVR5cGUgPSBEYXRhVHlwZS5zdHJpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnZpc2libGVcclxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW5cclxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50LmZpZWxkID09IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5maWVsZFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmJhc2VTZXJ2aWNlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRyb2xUeXBlID0gQ29udHJvbFR5cGUuZHJvcGRvd247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmLnB1c2goZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsdWVGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZhbHVlRmllbGQgPSAnaWQnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXlGaWVsZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BsYXlGaWVsZCA9ICd0ZW4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcENvbCA9IG5ldyBDb2x1bW5TY2hlbWFCYXNlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDb2x1bW46IGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZTogQ29udHJvbFR5cGUuZHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogZWxlbWVudC5kYXRhVHlwZVJlZkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdzdHInICsgZWxlbWVudC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93RmlsdGVyOiBlbGVtZW50LmFsbG93RmlsdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdSZWZGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMuZmluZChwID0+IHAuY29sdW1uQ29kZSA9PSB0bXBDb2wuZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnUmVmRmllbGQgJiYgY29uZmlnUmVmRmllbGQudmlzaWJsZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb2wudmlzaWJsZSA9IGNvbmZpZ1JlZkZpZWxkLnZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKHRtcENvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2xWaXNpYmxlID0gdG1wQ29sO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5kYXRhU291cmNlICYmIGVsZW1lbnQuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250cm9sVHlwZSA9IENvbnRyb2xUeXBlLmRyb3Bkb3duO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5yYXdDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0tleUZpZWxkR2V0UmVmVHlwZV0gPSBFbnVtR2V0UmVmVHlwZS5MT0NBTDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sID0gbmV3IENvbHVtblNjaGVtYUJhc2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0NvbHVtbjogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUeXBlOiBDb250cm9sVHlwZS5kcm9wZG93bixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBlbGVtZW50LmRhdGFUeXBlUmVmRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlU2VydmljZTogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnc3RyJyArIGVsZW1lbnQuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0ZpbHRlcjogZWxlbWVudC5hbGxvd0ZpbHRlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZFJlZkNvbHVtbjogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUmVmRmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzLmZpbmQocCA9PiBwLmNvbHVtbkNvZGUgPT0gdG1wQ29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ1JlZkZpZWxkICYmIGNvbmZpZ1JlZkZpZWxkLnZpc2libGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wQ29sLnZpc2libGUgPSBjb25maWdSZWZGaWVsZC52aXNpYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaCh0bXBDb2wpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29sVmlzaWJsZSA9IHRtcENvbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmaXJzdENvbFZpc2libGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbFZpc2libGUgPSBlbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuZm9yY2VHZXREYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5iYXNlU2VydmljZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRbS2V5RmllbGRHZXRSZWZUeXBlXSA9IEVudW1HZXRSZWZUeXBlLlNFUlZFUjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWx1ZUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZUZpZWxkID0gJ2lkJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheUZpZWxkID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwbGF5RmllbGQgPSAndGVuJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hvd0VkaXRMaW5rKSB7XHJcbiAgICAgICAgICAgICAgICBmb3VuZEl0ZW1TaG93RWRpdExpbmsgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZm91bmRJdGVtU2hvd0VkaXRMaW5rICYmIGZpcnN0Q29sVmlzaWJsZSkge1xyXG4gICAgICAgICAgICBmaXJzdENvbFZpc2libGUuc2hvd0VkaXRMaW5rID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29scy5sZW5ndGggPSAwO1xyXG4gICAgICAgIGNvbHMucHVzaCguLi50ZW1wKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZi5zb3J0KFxyXG4gICAgICAgICAgICBtdWx0aXBsZVNvcnQoeyBuYW1lOiAnc29ydCcsIHByaW1lcjogYSA9PiBhID09IG51bGwgfSwgJ29yZGVyJylcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoID0gW107XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkSGFzTWF4aW11bVdvcmQgPSBbXTtcclxuICAgICAgICBjb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKCFjb2wudmlzaWJsZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoY29sLm1heFdvcmREaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5wdXNoKGNvbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGgucHVzaChjb2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvcm1hdENvbHVtbnMoY29sczogQ29sdW1uU2NoZW1hQmFzZVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xyXG4gICAgICAgICAgICBjb2wuZXh0ZW5kRGF0YS5zdHlsZSA9IHRoaXMuZ2V0Q29sdW1uU3R5bGUoY29sKTtcclxuICAgICAgICAgICAgY29sLmV4dGVuZERhdGEuaGVhZGVyU3R5bGUgPSB0aGlzLmdldENvbHVtblN0eWxlKGNvbCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGNvbC5leHRlbmREYXRhLmhlYWRlckNsYXNzID0gdGhpcy5nZXRDZWxsQ2xhc3NIZWFkZXIoY29sKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2x1bW5TZXR0aW5nKGNvbEdyb3VwOiBDb2x1bW5TY2hlbWFCYXNlKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uID0gY29sR3JvdXA7XHJcbiAgICAgICAgY29uc3QgZGF0YVNldHRpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xVTU5fU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhU2V0dGluZyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0dGluZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZXR0aW5nc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnRGaWVsZCA9IGVsZW1lbnQuc2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9IGVsZW1lbnQuc2V0dGluZy5zb3J0RGlyID8gZWxlbWVudC5zZXR0aW5nLnNvcnREaXIgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCA9IGVsZW1lbnQuc2V0dGluZy5ncm91cEZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuZ3JvdXBGaWVsZCAmJiBjb2xHcm91cCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R3JvdXBGaWVsZChjb2xHcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMgPSBlbGVtZW50LnNldHRpbmcuZGV0YWlscztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChjb2xHcm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEdyb3VwRmllbGQoY29sR3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldEdyb3VwRmllbGQoY29sR3JvdXApIHtcclxuICAgICAgICBpZiAoKGNvbEdyb3VwLmRhdGFTb3VyY2UgJiYgY29sR3JvdXAuZGF0YVNvdXJjZS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICB8fCBjb2xHcm91cC5iYXNlU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkID0gYHN0ciR7Y29sR3JvdXAuZmllbGR9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQgPSBjb2xHcm91cC5maWVsZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzYXZlQ29sdW1uU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBjb2x1bW5TZXR0aW5nID0gW107XHJcbiAgICAgICAgbGV0IGNoZWNrRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBkYXRhU2V0dGluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTFVNTl9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVNldHRpbmcpIHtcclxuICAgICAgICAgICAgY29sdW1uU2V0dGluZyA9IEpTT04ucGFyc2UoZGF0YVNldHRpbmcpO1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldHRpbmcuc29ydEZpZWxkID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydEZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0dGluZy5zb3J0RGlyID0gdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpcjtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldHRpbmcuZ3JvdXBGaWVsZCA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXR0aW5nLmRldGFpbHMgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5kZXRhaWxzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nLnB1c2goeyBwYXRobmFtZTogcGF0aE5hbWUsIHNldHRpbmc6IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MVU1OX1NFVFRJTkcsIEpTT04uc3RyaW5naWZ5KGNvbHVtblNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbG9yU2V0dGluZygpIHtcclxuICAgICAgICBjb25zdCBkYXRhUGFnZVNldHRpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5DT0xPUl9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVBhZ2VTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShkYXRhUGFnZVNldHRpbmcpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldHRpbmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2V0dGluZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZCA9IGVsZW1lbnQuY29sb3JGaWx0ZXJGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZSA9IGVsZW1lbnQuY29sb3JGaWx0ZXJUYWJsZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlQ29sb3JTZXR0aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWNoZUNvbG9yU2V0dGluZygpIHtcclxuICAgICAgICB0aGlzLl9jb2xvckZpbHRlclRhYmxlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZVtpXTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgICBpdGVtVmFsdWVzWzBdID0gaXRlbS5jb21wYXJlVHlwZTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1sxXSA9IGl0ZW0uZmlsdGVyVmFsdWU7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbMl0gPSB0aGlzLmNvbnZlcnRUb0RhdGUoaXRlbS5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbM10gPSBOdW1iZXIoaXRlbS5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgICAgICAgIGl0ZW1WYWx1ZXNbNF0gPSAoL3RydWUvaSkudGVzdChpdGVtLmZpbHRlclZhbHVlKTtcclxuICAgICAgICAgICAgaXRlbVZhbHVlc1s1XSA9IGl0ZW0uY29sb3I7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbG9yRmlsdGVyVGFibGUucHVzaChpdGVtVmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDb2xvclNldHRpbmcoKSB7XHJcbiAgICAgICAgbGV0IHBhdGhOYW1lID0gbG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5KSB7XHJcbiAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgY29sb3JTZXR0aW5nID0gW107XHJcbiAgICAgICAgbGV0IGNoZWNrRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBkYXRhQ29sb3JTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuQ09MT1JfU0VUVElORyk7XHJcbiAgICAgICAgaWYgKGRhdGFDb2xvclNldHRpbmcpIHtcclxuICAgICAgICAgICAgY29sb3JTZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhQ29sb3JTZXR0aW5nKTtcclxuICAgICAgICAgICAgY29sb3JTZXR0aW5nLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbG9yRmlsdGVyRmllbGQgPSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJGaWVsZDtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbG9yRmlsdGVyVGFibGUgPSB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgY29sb3JTZXR0aW5nLnB1c2goeyBwYXRobmFtZTogcGF0aE5hbWUsIGNvbG9yRmlsdGVyRmllbGQ6IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkLCBjb2xvckZpbHRlclRhYmxlOiB0aGlzLnNldHRpbmcuY29sb3JGaWx0ZXJUYWJsZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLkNPTE9SX1NFVFRJTkcsIEpTT04uc3RyaW5naWZ5KGNvbG9yU2V0dGluZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UGFnZVNldHRpbmcoKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuUEFHRV9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVBhZ2VTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgICAgIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuc2V0dGluZy5zZXR0aW5nS2V5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTZXR0aW5ncyA9IEpTT04ucGFyc2UoZGF0YVBhZ2VTZXR0aW5nKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWdlU2V0dGluZ3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwYWdlU2V0dGluZ3NbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemUgPSBlbGVtZW50LnBhZ2VTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2F2ZVBhZ2VTZXR0aW5nKCkge1xyXG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2V0dGluZ0tleSkge1xyXG4gICAgICAgICAgICBwYXRoTmFtZSArPSAnLycgKyB0aGlzLnNldHRpbmcuc2V0dGluZ0tleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHBhZ2VTZXR0aW5nID0gW107XHJcbiAgICAgICAgbGV0IGNoZWNrRXhpc3QgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBkYXRhUGFnZVNldHRpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5QQUdFX1NFVFRJTkcpO1xyXG4gICAgICAgIGlmIChkYXRhUGFnZVNldHRpbmcpIHtcclxuICAgICAgICAgICAgcGFnZVNldHRpbmcgPSBKU09OLnBhcnNlKGRhdGFQYWdlU2V0dGluZyk7XHJcbiAgICAgICAgICAgIHBhZ2VTZXR0aW5nLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5wYXRobmFtZSA9PT0gcGF0aE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnBhZ2VTaXplID0gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrRXhpc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY2hlY2tFeGlzdCkge1xyXG4gICAgICAgICAgICBwYWdlU2V0dGluZy5wdXNoKHsgcGF0aG5hbWU6IHBhdGhOYW1lLCBwYWdlU2l6ZTogdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuUEFHRV9TRVRUSU5HLCBKU09OLnN0cmluZ2lmeShwYWdlU2V0dGluZykpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVJlYWR5KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuZml4SGVpZ2h0VHlwZUluRGlhbG9nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0ICRkaWFsb2cgPSB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJy5wLWRpYWxvZycpO1xyXG4gICAgICAgICAgICBpZiAoISEkZGlhbG9nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuaGVpZ2h0VHlwZSA9IEhlaWdodFR5cGUuY3VzdG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25SZWFkeS5lbWl0KHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVNlbGVjdFJvdyA9IChldnQsIGRhdGEpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5oYXNDdXN0b21IYW5kbGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlzYWJsZVJvd1NlbGVjdFdoZW5DbGlja0FjdGlvblxyXG4gICAgICAgICAgICAmJiAoZXZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgICAgICB8fCBldnQudGFyZ2V0LmNsb3Nlc3QoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl9jbGVhclNlbGVjdGVkKGV2dCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xpY2tDaGVja0JveChldnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb2xkQ2hlY2tlZCA9IGRhdGEuX2NoZWNrZWQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcubXVsdGlwbGVDaGVja1doZW5DbGlja1Jvdykge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgocCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIHAuX2NoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhLl9jaGVja2VkID0gIW9sZENoZWNrZWQ7XHJcbiAgICAgICAgbGV0IGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuZmlyZUV2ZW50V2hlblJlU2VsZWN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbUxhc3QgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1MYXN0ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGZpcmVFdmVudCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhKGRhdGEsIGV2dC50YXJnZXQuY2xvc2VzdCgndHInKSwgZmlyZUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVTZWxlY3RSb3dHcm91cCA9IChldnQsIGRhdGEpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcuZGlzYWJsZVJvd1NlbGVjdFdoZW5DbGlja0FjdGlvblxyXG4gICAgICAgICAgICAmJiAoZXZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgICAgICB8fCBldnQudGFyZ2V0LmNsb3Nlc3QoJy5saW5rLW9yLWFjdGlvbicpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLl9jbGVhclNlbGVjdGVkKGV2dCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xpY2tDaGVja0JveChldnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcubXVsdGlwbGVDaGVja1doZW5DbGlja1Jvdykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtc01vZGlmaWVkID0gWy4uLnRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtc107XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChwLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcC5fY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCFpdGVtc01vZGlmaWVkLnNvbWUocSA9PiBxLmlkID09IGRhdGEuaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc01vZGlmaWVkLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaXRlbXNNb2RpZmllZC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGFfR3JvdXAoaXRlbSwgbnVsbCwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YS5fY2hlY2tlZCA9ICFkYXRhLl9jaGVja2VkO1xyXG5cclxuICAgICAgICBsZXQgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5maXJlRXZlbnRXaGVuUmVTZWxlY3QpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUxhc3QgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGFfR3JvdXAoZGF0YSwgZXZ0LnRhcmdldC5jbG9zZXN0KCd0cicpLCBmaXJlRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0TGFzdEl0ZW1TZWxlY3RlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1MYXN0ID0gdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zW3RoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2lzQ2xpY2tDaGVja0JveChldnQpIHtcclxuICAgICAgICByZXR1cm4gZXZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3AtY2hlY2tib3gtYm94JykgfHwgZXZ0LnRhcmdldC5jbG9zZXN0KCcucC1jaGVja2JveC1ib3gnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9lbWl0Um93U2VsZWN0KHRyRWxlbWVudCwgZGF0YSkge1xyXG4gICAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdCh7XHJcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRyRWxlbWVudCxcclxuICAgICAgICAgICAgZGF0YVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVUb2dnbGVSb3cocm93RGF0YSwgZXZ0KSB7XHJcbiAgICAgICAgdGhpcy50YWJsZS50b2dnbGVSb3cocm93RGF0YSwgZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVQZXJtaXNzaW9uKHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICBjb25zdCBpdGVtU3RhdHVzID0gdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZy5zdGF0dXNlcy5maW5kKHAgPT4gcC50cmFuZ1RoYWlDb250YWluZXIubWEgPT0gcm93RGF0YS5jdXJyZW50U3RhdGVDb2RlKTtcclxuICAgICAgICAvLyBLaeG7g20gdHJhIG5nxrDhu51pIGTDuW5nIGPDsyBxdXnhu4FuIMSR4buRaSB24bubaSB0cuG6oW5nIHRow6FpIGPhu6dhIGLhuqNuIGdoaSBraMO0bmdcclxuICAgICAgICBsZXQgaGFzUGVybWlzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHVzZXJEYXRhID0gdGhpcy5tb2RlbC5hZHZhbmNlRGF0YS51c2VyRGF0YTtcclxuICAgICAgICBpZiAoIXVzZXJEYXRhKSByZXR1cm4gaGFzUGVybWlzc2lvbjtcclxuICAgICAgICBjb25zdCB1c2VySWQgPSB1c2VyRGF0YS5pZDtcclxuICAgICAgICBjb25zdCB1c2VySWRVcHBlciA9IHVzZXJJZCA9PSBudWxsID8gbnVsbCA6IHVzZXJJZC50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHVzZXJHcm91cElkcyA9IHVzZXJEYXRhLnVzZXJHcm91cHMubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XHJcbiAgICAgICAgY29uc3QgdXNlck9yZ0lkcyA9IHVzZXJEYXRhLm9yZ2FuaXphdGlvbnMubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XHJcbiAgICAgICAgaWYgKGl0ZW1TdGF0dXMudHlwZSA9PSBFbnVtV0ZOaG9tVHJhbmdUaGFpLkJBVF9EQVUpIHtcclxuICAgICAgICAgICAgaWYgKHJvd0RhdGEuY3JlYXRlZEJ5ICYmIHJvd0RhdGEuY3JlYXRlZEJ5LnRvVXBwZXJDYXNlKCkgPT0gdXNlcklkVXBwZXIpIHtcclxuICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXRlbVN0YXR1cy51c2VySW5mby51c2VySWRzICE9IG51bGwgJiYgaXRlbVN0YXR1cy51c2VySW5mby51c2VySWRzLmluZGV4T2YodXNlcklkKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpdGVtU3RhdHVzLmdyb3VwSW5mby5ncm91cElkcyAhPSBudWxsICYmIGl0ZW1TdGF0dXMuZ3JvdXBJbmZvLmdyb3VwSWRzLnNvbWUocSA9PiB1c2VyR3JvdXBJZHMuaW5kZXhPZihxKSA+IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbVN0YXR1cy5vcmdJbmZvLm9yZ0lkcyAhPSBudWxsICYmIGl0ZW1TdGF0dXMub3JnSW5mby5vcmdJZHMuc29tZShxID0+IHVzZXJPcmdJZHMuaW5kZXhPZihxKSA+IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuYWdlclR5cGVzID0gaXRlbVN0YXR1cy51c2VySW5mby5tYW5hZ2VyVHlwZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFuYWdlclR5cGVzICE9IG51bGwgJiYgbWFuYWdlclR5cGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdXNlcklkTGFzdFVwcGVyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9uVmlJZExhc3RVcHBlciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudEl0ZW0udXNlcklkTGFzdEluV29ya2Zsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkTGFzdFVwcGVyID0gdGhpcy5jdXJyZW50SXRlbS51c2VySWRMYXN0SW5Xb3JrZmxvdy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbS5kb25WaUlkTGFzdEluV29ya2Zsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uVmlJZExhc3RVcHBlciA9IHRoaXMuY3VycmVudEl0ZW0uZG9uVmlJZExhc3RJbldvcmtmbG93LnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEzDoCBuZ8aw4budaSBjdeG7kWkgY8O5bmcgdGhhbyB0w6FjIHbhu5tpIGLhuqNuIGdoaVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VyVHlwZXMuaW5kZXhPZihNYW5hZ2VyVHlwZS5OR1VPSV9DVU9JX0NVTkcpID4gLTFcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcklkTGFzdFVwcGVyID09IHVzZXJJZFVwcGVyXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hbmFnZXJUeXBlcy5pbmRleE9mKE1hbmFnZXJUeXBlLk5HVU9JX1RBTykgPiAtMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3dEYXRhLmNyZWF0ZWRCeVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3dEYXRhLmNyZWF0ZWRCeS50b1VwcGVyQ2FzZSgpID09IHVzZXJJZFVwcGVyXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hbmFnZXJUeXBlcy5pbmRleE9mKE1hbmFnZXJUeXBlLkNBUF9UUkVOKSA+IC0xXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmN1cnJlbnRJdGVtLmRvblZpSWRMYXN0SW5Xb3JrZmxvdyA9PSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlckRhdGEudXNlckNhcER1b2lJZHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VyRGF0YS51c2VyQ2FwRHVvaUlkcy5zb21lKHEgPT4gcS50b1VwcGVyQ2FzZSgpID09IHVzZXJJZExhc3RVcHBlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghIXRoaXMuY3VycmVudEl0ZW0uZG9uVmlJZExhc3RJbldvcmtmbG93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlckRhdGEuZG9uVmlDYXBEdW9pSWRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlckRhdGEuZG9uVmlDYXBEdW9pSWRzLnNvbWUocSA9PiBxLnRvVXBwZXJDYXNlKCkgPT0gZG9uVmlJZExhc3RVcHBlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNQZXJtaXNzaW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhhc1Blcm1pc3Npb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHNob3dBY3Rpb25Xb3JrZmxvdyhldnQsIHJvd0RhdGEpIHtcclxuICAgICAgICBjb25zdCBbYnV0dG9uQ29udGV4dHMsIGhhc1Blcm1pc3Npb25dID0gYXdhaXQgdGhpcy5nZXRBY3Rpb25Xb3JrZmxvdyhyb3dEYXRhKTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYnV0dG9uQ29udGV4dHM7XHJcbiAgICAgICAgcm93RGF0YS5fX2hhc1Blcm1pc3Npb24gPSBoYXNQZXJtaXNzaW9uO1xyXG4gICAgICAgIHJvd0RhdGEuX19hY3Rpb25zID0gdGhpcy5idXR0b25Db250ZXh0cztcclxuICAgICAgICB0aGlzLl9zaG93Q29udGV4dE1lbnUoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRBY3Rpb25Xb3JrZmxvdyhyb3dEYXRhKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGVybWlzc2lvbihyb3dEYXRhKTtcclxuICAgICAgICBsZXQgYnV0dG9uQ29udGV4dHMgPSBbXTtcclxuICAgICAgICBpZiAoIWhhc1Blcm1pc3Npb24pIHtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0FjdGlvbiA9IHRoaXMuc2V0dGluZy53b3JrZmxvd1NldHRpbmcuc3RhdHVzQWN0aW9ucy5maW5kKHAgPT4gcC5zb3VyY2VTdGF0dXMgPT0gcm93RGF0YS5jdXJyZW50U3RhdGVDb2RlKTtcclxuICAgICAgICAgICAgaWYgKHN0YXR1c0FjdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBidXR0b25Db250ZXh0cyA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uczogQWN0aW9uW10gPSBzdGF0dXNBY3Rpb24uYWN0aW9ucztcclxuICAgICAgICAgICAgICAgIGJ1dHRvbkNvbnRleHRzID0gYWN0aW9ucy5tYXAoaXRlbSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGU6IGl0ZW0ubWEsXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbjogdGhpcy5zb3VyY2VJY29uW2l0ZW0uaWNvbl0sXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0udGVuLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucHJvY2Vzc1dvcmtmbG93KHJvd0RhdGEuaWQsIGl0ZW0pXHJcbiAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGEudXNlcklkTGFzdEluV29ya2Zsb3cgJiYgcm93RGF0YS51c2VySWRMYXN0SW5Xb3JrZmxvdy50b1VwcGVyQ2FzZSgpID09IHRoaXMubW9kZWwuYWR2YW5jZURhdGEudXNlckRhdGEuaWQudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICBidXR0b25Db250ZXh0cy5wdXNoKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdwaSBwaS1yZXBsYXknLFxyXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnS2jDtGkgcGjhu6VjIHRy4bqhbmcgdGjDoWkgdHLGsOG7m2MnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucm9sbGJhY2tXb3JrZmxvdyhyb3dEYXRhLmlkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBidXR0b25Db250ZXh0cy5wdXNoKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpY29uOiAncGkgcGktbGlzdCcsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1hlbSBs4buLY2ggc+G7rScsXHJcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAoKSA9PiB0aGlzLnZpZXdIaXN0b3J5V29ya2Zsb3cocm93RGF0YS5pZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgYnV0dG9uQ29udGV4dHMsIGhhc1Blcm1pc3Npb25cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3dDb250ZXh0TWVudShldnQpIHtcclxuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm9sbGJhY2tXb3JrZmxvdyhpZCkge1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGtow7RpIHBo4bulYyB0cuG6oW5nIHRow6FpIHRyxrDhu5tjIMSRw7MnKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5yb2xsYmFja1dvcmtmbG93KGlkKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJ0tow7RpIHBo4bulYyB0cuG6oW5nIHRow6FpIHRyxrDhu5tjIHRow6BuaCBjw7RuZycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZpZXdIaXN0b3J5V29ya2Zsb3coaWQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuc2hvd0hpc3RvcnlXb3JrZmxvdyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSGlkZUhpc3RvcnlXb3JrZmxvdygpIHtcclxuICAgICAgICB0aGlzLnNob3dIaXN0b3J5V29ya2Zsb3cgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzV29ya2Zsb3coaWQ6IG51bWJlciwgd29ya2Zsb3dBY3Rpb246IEFjdGlvbikge1xyXG4gICAgICAgIC8vIE7hur91IGtow7RuZyBj4bqnbiBt4bufIGRpYWxvZyBtw6AgdGjhu7FjIGhp4buHbiBhY3Rpb24gbHXDtG5cclxuICAgICAgICBpZiAod29ya2Zsb3dBY3Rpb24uYWN0aW9uT3B0aW9ucyAmJiAhd29ya2Zsb3dBY3Rpb24uYWN0aW9uT3B0aW9ucy5vcGVuRGlhbG9nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFQcm9jZXNzID0ge1xyXG4gICAgICAgICAgICAgICAgeUtpZW46ICcnLFxyXG4gICAgICAgICAgICAgICAgaGFuWHVMeTogbnVsbCxcclxuICAgICAgICAgICAgICAgIGZpbGVEaW5oS2VtOiBudWxsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlV2YgPSBhd2FpdCB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UudmFsaWRhdGVQcm9jZXNzV29ya2Zsb3codGhpcy5jdXJyZW50SXRlbS5pZCwgd29ya2Zsb3dBY3Rpb24ubWEsIGRhdGFQcm9jZXNzKTtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZSh2YWxpZGF0ZVdmLCAnJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UucHJvY2Vzc1dvcmtmbG93KHRoaXMuY3VycmVudEl0ZW0uaWQsIHdvcmtmbG93QWN0aW9uLm1hLCBkYXRhUHJvY2VzcylcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsIGAke3dvcmtmbG93QWN0aW9uLnRlbn0gdGjDoG5oIGPDtG5nYCwgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJvY2Vzc2VkV29yZmxvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBO4bq/dSBkYXRhID0gdHJ1ZSBuZ2jEqWEgbMOgIGLhu4sgbOG7l2kgKE5nxrDhu51pIGTDuW5nIHRodeG7mWMgMiDEkcahbiB24buLIG5oxrBuZyBjaMawYSBjaOG7jW4gxJHGoW4gduG7iyDEkeG7gyB0aOG7sWMgaGnhu4duIGFjdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25Xb3JrZmxvdyA9IHdvcmtmbG93QWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJXb3JrZmxvdyA9IHdvcmtmbG93QWN0aW9uLnRlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Zvcm1Xb3JrZmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0sIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkludmFsaWRXb3JrZmxvdy5lbWl0KHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aGlzLmN1cnJlbnRJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkNvZGU6IHdvcmtmbG93QWN0aW9uLm1hXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGlvbldvcmtmbG93ID0gd29ya2Zsb3dBY3Rpb247XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyV29ya2Zsb3cgPSB3b3JrZmxvd0FjdGlvbi50ZW47XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0Zvcm1Xb3JrZmxvdyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0V29ya2Zsb3cocm93RGF0YSwgd29ya2Zsb3c6IFdmSXRlbSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zdGFydFdvcmtmbG93KHJvd0RhdGEuaWQsIHdvcmtmbG93LmNvZGUpXHJcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJ0No4bqheSBxdXkgdHLDrG5oIHRow6BuaCBjw7RuZycsIGYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblN0YXJ0ZWRXb3JrZmxvdy5lbWl0KHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZWRTdGF0dXNXb3JrZmxvdy5lbWl0KHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVJbnZhbGlkV0YoZXZ0KSB7XHJcbiAgICAgICAgdGhpcy5vbkludmFsaWRXb3JrZmxvdy5lbWl0KGV2dCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUHJvY2Vzc2VkV29yZmxvdygpIHtcclxuICAgICAgICB0aGlzLnNob3dGb3JtV29ya2Zsb3cgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVQcm9jZXNzZWRXb3JrZmxvd0Jhc2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzV29ya2Zsb3dNb2RlbC5zaG93RWRpdEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9uUHJvY2Vzc2VkV29ya2Zsb3cuZW1pdCh0aGlzLmN1cnJlbnRJdGVtLmlkKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlZFN0YXR1c1dvcmtmbG93LmVtaXQodGhpcy5jdXJyZW50SXRlbS5pZCk7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbXBvbmVudEJ5VHlwZShjb250cm9sVHlwZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xUeXBlID09ICdlbnRpdHlXb3JrZmxvd1N0YXR1cycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVFbnRpdHlXb3JrZmxvd1N0YXR1cztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2xUeXBlID09ICd0cmFuZ1RoYWlWNScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVUcmFuZ1RoYWlWNTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRyb2xUeXBlID09ICdfX3ZpZXdIaXN0b3J5Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUNvbFZpZXdIaXN0b3J5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29udHJvbFR5cGUgPT0gJ3dvcmtmbG93Q29yZVN0YXR1cycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVXb3JrZmxvd0NvcmVTdGF0dXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpdGVtID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCBjb250cm9sVHlwZSk7XHJcbiAgICAgICAgaWYgKCFpdGVtICYmIHRoaXMudGVtcGxhdGVzKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMudGVtcGxhdGVzLCBjb250cm9sVHlwZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpbHRlcnMoKTogRmlsdGVyW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9kZWZhdWx0KSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2RlZmF1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWx0ZXJfY3VzdG9tKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2N1c3RvbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcl9jb2x1bW4pIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfY29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2FkdmFuY2VTZWFyY2gpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy5maWx0ZXJfYWR2YW5jZVNlYXJjaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0R3JpZEluZm8oKSB7XHJcbiAgICAgICAgY29uc3QgZ3JpZEluZm8gPSBuZXcgR3JpZEluZm8oe1xyXG4gICAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICAgICAgcGFnZTogdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UsXHJcbiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZpbHRlcnM6IHRoaXMuZ2V0RmlsdGVycygpLFxyXG4gICAgICAgICAgICBzb3J0czogW11cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy51bnNoaWZ0KHsgZmllbGQ6IHRoaXMuX2dyb3VwRmllbGQsIGRpcjogMSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvcnRGaWVsZCAmJiB0aGlzLl9zb3J0RGlyICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGdyaWRJbmZvLnNvcnRzLnB1c2goeyBmaWVsZDogdGhpcy5fc29ydEZpZWxkLCBkaXI6IHRoaXMuX3NvcnREaXIgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZ3JpZEluZm87XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZVNlYXJjaEFkdnMoZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlSW5pdEFkdmFuY2VTZWFyY2goZmlsdGVyczogRmlsdGVyW10pIHtcclxuICAgICAgICB0aGlzLmZpbHRlcl9hZHZhbmNlU2VhcmNoID0gZmlsdGVycztcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgICAgICBjb25zdCBpbmZvR2V0RGF0YSA9IHRoaXMuZ2V0R3JpZEluZm8oKTtcclxuICAgICAgICB0aGlzLm9uUmVsb2FkLmVtaXQoaW5mb0dldERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChmaWx0ZXJfY3VzdG9tPzogRmlsdGVyW10sIHBhZ2UgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfY3VzdG9tID0gZmlsdGVyX2N1c3RvbTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZCgpIHtcclxuICAgICAgICB0aGlzLm9uQWRkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB4dWF0Q2FjTXVjRGFDaG9uX2JhY2t1cCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0dpYW8gZGnhu4duIGhp4buHbiB04bqhaSBjaMawYSBo4buXIHRy4bujIHh14bqldCBleGNlbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgaGlkZGVuQ2hlY2tib3ggPSB0aGlzLnNldHRpbmcuaGlkZGVuQ2hlY2tib3g7XHJcbiAgICAgICAgY29uc3QgaGlkZGVuRnVuY3Rpb25Db2x1bW4gPSB0aGlzLnNldHRpbmcuaGlkZGVuRnVuY3Rpb25Db2x1bW47XHJcbiAgICAgICAgY29uc3QgdGFibGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XHJcbiAgICAgICAgY29uc3QgdGhlYWQgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpO1xyXG4gICAgICAgIGNvbnN0IHRib2R5ID0gdGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKTtcclxuICAgICAgICBjb25zdCB0aHMgPSB0aGVhZC5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpO1xyXG4gICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCd0ci51aS1zdGF0ZS1oaWdobGlnaHQnKTtcclxuICAgICAgICBjb25zdCBkYXRhRXhwb3J0ID0gW107XHJcbiAgICAgICAgY29uc3QgaGVhZCA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gKHRocy5sZW5ndGggLSAoaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSkpO1xyXG4gICAgICAgIGNvbnN0IHRoSW5kZXggPSAoaGlkZGVuQ2hlY2tib3ggPyAwIDogMSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoSW5kZXg7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGhlYWQucHVzaCh0aHNbaV0uaW5uZXJUZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YUV4cG9ydC5wdXNoKGhlYWQpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByb3dEYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRkcyA9IGl0ZW0ucXVlcnlTZWxlY3RvckFsbCgndGQnKTtcclxuICAgICAgICAgICAgY29uc3Qgcm93ID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gKHRkcy5sZW5ndGggLSAoaGlkZGVuRnVuY3Rpb25Db2x1bW4gPyAwIDogMSkpO1xyXG4gICAgICAgICAgICBjb25zdCB0ZEluZGV4ID0gKGhpZGRlbkNoZWNrYm94ID8gMCA6IDEpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGRJbmRleDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0ZHNbaV0uaW5uZXJUZXh0ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKHRoaXMuZ2V0VmFsdWVDaGVja2JveEZvcm1hdCh0ZHNbaV0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKHRkc1tpXS5pbm5lclRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhRXhwb3J0LnB1c2gocm93KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdGhpcy5fZXhwb3J0U2VydmljZS5vYmplY3RUb0V4Y2VsKGRhdGFFeHBvcnQsIGBGaWxlRXhwb3J0XyR7ZGF0ZS5nZXRGdWxsWWVhcigpfSR7YWRkWmVybyhkYXRlLmdldE1vbnRoKCkgKyAxKX0ke2FkZFplcm8oZGF0ZS5nZXREYXRlKCkpfS54bHN4YCk7XHJcbiAgICB9XHJcblxyXG4gICAgeHVhdENhY011Y0RhQ2hvbigpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZy5leHBvcnRJdGVtc01vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBFeHBvcnRJdGVtc01vZGUuRnJvbUh0bWw6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydEJ5UmVhZGluZ0h0bWwoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEV4cG9ydEl0ZW1zTW9kZS5NYW51YWxHZXREYXRhOlxyXG4gICAgICAgICAgICBjYXNlIEV4cG9ydEl0ZW1zTW9kZS5BdXRvR2V0RGF0YTpcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnVGhlIGZ1bmN0aW9uIGhhdmVuXFwndCBzdXBwb3J0ZWQgeWV0Jyk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGV4cG9ydEJ5UmVhZGluZ0h0bWwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdDaMawYSBo4buXIHRy4bujIHh14bqldCBjw7MgbmjDs20gZOG7ryBsaeG7h3UhJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgdGFibGVFbGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XHJcbiAgICAgICAgY29uc3QgaGVhZEVsZSA9IHRhYmxlRWxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7XHJcbiAgICAgICAgY29uc3QgYm9keUVsZSA9IHRhYmxlRWxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7XHJcblxyXG4gICAgICAgIC8vIGhlYWRlci5cclxuICAgICAgICBjb25zdCBhcnJIZWFkID0gdGhpcy5nZXRBcnJIZWFkQnlIdG1sKGhlYWRFbGUpO1xyXG4gICAgICAgIGlmICghYXJySGVhZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBib2R5LlxyXG4gICAgICAgIGNvbnN0IGFyclJvd0RhdGEgPSB0aGlzLmdldEFyclJvd0RhdGFCeUh0bWwoYm9keUVsZSwgYXJySGVhZCk7XHJcblxyXG4gICAgICAgIC8vIGV4cG9ydC5cclxuICAgICAgICBjb25zdCBkYXRhRXhwb3J0ID0gW2FyckhlYWQubWFwKGkgPT4gaS52YWx1ZSksIC4uLmFyclJvd0RhdGFdO1xyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYERhbmggc8OhY2ggJHt0aGlzLnNldHRpbmcub2JqZWN0TmFtZX1gO1xyXG4gICAgICAgIHRoaXMuX2V4cG9ydFNlcnZpY2Uub2JqZWN0VG9FeGNlbChkYXRhRXhwb3J0LCBmaWxlTmFtZSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRBcnJIZWFkQnlIdG1sKGhlYWRlcikge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0Um93ID0gaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RyJyk7XHJcbiAgICAgICAgaWYgKCFmaXJzdFJvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYXJyVGggPSBmaXJzdFJvdy5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpO1xyXG5cclxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94ID8gMCA6IDE7XHJcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBhcnJUaC5sZW5ndGggLSAodGhpcy5zZXR0aW5nLmhpZGRlbkZ1bmN0aW9uQ29sdW1uID8gMCA6IDEpIC0gMTtcclxuICAgICAgICBpZiAoc3RhcnRJbmRleCA+IGVuZEluZGV4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXJySGVhZGVyID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gZW5kSW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoYXJyVGhbaV0uaW5uZXJUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBhcnJIZWFkZXIucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFyclRoW2ldLmlubmVyVGV4dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJIZWFkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyclJvd0RhdGFCeUh0bWwoYm9keUVsZSwgYXJySGVhZCkge1xyXG4gICAgICAgIGNvbnN0IGFyclJvdyA9IGJvZHlFbGUucXVlcnlTZWxlY3RvckFsbCgndHIudWktc3RhdGUtaGlnaGxpZ2h0Jyk7XHJcbiAgICAgICAgaWYgKCFhcnJSb3cubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFyclJvd0RhdGEgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyclJvdy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByb3cgPSBhcnJSb3dbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGFyclRkID0gcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkJyk7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50VGQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGFyckhlYWQuZm9yRWFjaChoZWFkID0+IHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUZCA9IGFyclRkW2hlYWQuaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUZC5pbm5lclRleHQgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wdXNoKHRoaXMuZ2V0VmFsdWVDaGVja2JveEZvcm1hdChjdXJyZW50VGQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd0RhdGEucHVzaChjdXJyZW50VGQuaW5uZXJUZXh0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBhcnJSb3dEYXRhLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGFyclJvd0RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFsdWVDaGVja2JveEZvcm1hdChkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tCb3ggPSBkYXRhLnF1ZXJ5U2VsZWN0b3IoJ3AtY2hlY2tib3gnKTtcclxuICAgICAgICBpZiAoY2hlY2tCb3gpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4ucGktY2hlY2snKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0PDsyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0tow7RuZyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB2aWV3KHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25WaWV3LmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGVkaXQocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXQuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EZWxldGUuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGVsZXRlTXV0aXBsZSgpIHtcclxuICAgICAgICB0aGlzLm9uRGVsZXRlTXVsdGlwbGUuZW1pdCh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyaW5oS3koZXZ0KSB7XHJcbiAgICAgICAgY29uc3Qgcm93RGF0YSA9IHRoaXMucm93RGF0YUN1cnJlbnQ7XHJcbiAgICAgICAgdGhpcy5zaG93V2FpdEJveCgpO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcudXNlQmFzZVRyaW5oS3kpIHtcclxuICAgICAgICAgICAgcm93RGF0YVtLZXlGbGFzaFNob3ddID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0KHJvd0RhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJpbnRQZGYodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLCByb3dEYXRhW3RoaXMuc2V0dGluZy5lbnRpdHlLZXldLCByb3dEYXRhKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnVHLDrG5oIGvDvSB0aMOgbmggY8O0bmcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgcm93RGF0YSwgcmVzLmRhdGEsIHRoaXMuX25vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xyXG4gICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGlkZVdhaXRCb3goKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrSGFzUGVybWlzc2lvbkluTGFzdFN0YXR1cyhyb3dEYXRhKSB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzS2V0VGh1YyA9IHRoaXMuc2V0dGluZy53b3JrZmxvd1NldHRpbmcuc3RhdHVzZXMuZmluZChxID0+IHEudHlwZSA9PSBFbnVtV0ZOaG9tVHJhbmdUaGFpLktFVF9USFVDKTtcclxuICAgICAgICBpZiAoc3RhdHVzS2V0VGh1YyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnUXV5IHRyw6xuaCBjaMawYSDEkcaw4bujYyBj4bqldSBow6xuaCB0cuG6oW5nIHRow6FpIGvhur90IHRow7pjJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuY3VycmVudFN0YXRlQ29kZSAhPSBzdGF0dXNLZXRUaHVjLm1hKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gS2nhu4NtIHRyYSBwZXJtaXNzaW9uXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFsaWRhdGVQZXJtaXNzaW9uKHJvd0RhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dDb250ZXh0TWVudShldnQsIHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLnJvd0RhdGFDdXJyZW50ID0gcm93RGF0YTtcclxuICAgICAgICB0aGlzLmJ1dHRvbkNvbnRleHRzID0gYXdhaXQgdGhpcy5tZW51QnV0dG9ucyhyb3dEYXRhKTtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5oaWRkZW5UcmluaEt5ICYmICFyb3dEYXRhLl9faGlkZGVuVHJpbmhLeSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNoZWNrUmVhZHlUb1RyaW5oS3koKVxyXG4gICAgICAgICAgICAgICAgJiYgYXdhaXQgdGhpcy5zZXR0aW5nLmNoZWNrQWxsb3dUcmluaEt5KHJvd0RhdGEpXHJcbiAgICAgICAgICAgICAgICAmJiAoIXRoaXMuc2V0dGluZy5jaGVja1Blcm1pc2lvblRyaW5oS3lcclxuICAgICAgICAgICAgICAgICAgICB8fCBhd2FpdCB0aGlzLmNoZWNrSGFzUGVybWlzc2lvbkluTGFzdFN0YXR1cyhyb3dEYXRhKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMudW5zaGlmdChcclxuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiB0aGlzLnNldHRpbmcuZ2V0TGFiZWxCdXR0b25UcmluaEt5KHJvd0RhdGEpLCBpY29uOiAncGkgcGktc2VuZCcsIGNvbW1hbmQ6IHRoaXMudHJpbmhLeS5iaW5kKHRoaXMpIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uQ29udGV4dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zaG93Q29udGV4dE1lbnUoZXZ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnS2jDtG5nIGPDsyBow6BuaCDEkeG7mW5nIGto4bqjIGThu6VuZycpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVDaGVja0FsbF9Hcm91cCA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja2VkQWxsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFsuLi50aGlzLm1vZGVsLmRhdGFTb3VyY2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2V0TGFzdEl0ZW1TZWxlY3RlZCgpO1xyXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpdGVtLl9jaGVja2VkID0gdGhpcy5jaGVja2VkQWxsO1xyXG4gICAgICAgICAgICB0aGlzLnJvd0dyb3VwQ2hlY2tlZFtpdGVtW3RoaXMuX2dyb3VwRmllbGRdXSA9IHRoaXMuY2hlY2tlZEFsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ2hlY2tBbGwuZW1pdCh0aGlzLmNoZWNrZWRBbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoZWNrUm93R3JvdXAgPSAocm93RGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwQ2hlY2tlZCA9IHRoaXMucm93R3JvdXBDaGVja2VkW3Jvd0RhdGFbdGhpcy5fZ3JvdXBGaWVsZF1dID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV1bdGhpcy5fZ3JvdXBGaWVsZF0gPT0gcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2ldLl9jaGVja2VkID0gZ3JvdXBDaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGZvdW5kKSBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tb2RlbC5kYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2VbaV0uX2NoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5wdXNoKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwID0gKHJvd0RhdGEsIHRyRWxlbWVudCA9IG51bGwsIGZpcmVFdmVudCA9IHRydWUpID0+IHtcclxuICAgICAgICBpZiAoIXJvd0RhdGEuX2NoZWNrZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnJvd0dyb3VwQ2hlY2tlZFtyb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgocCA9PiBwLmlkID09IHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBjaGVja0dyb3VwID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLnB1c2gocm93RGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gcm93RGF0YTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tb2RlbC5kYXRhU291cmNlW2ldLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZGF0YVNvdXJjZVtpXVt0aGlzLl9ncm91cEZpZWxkXSA9PSByb3dEYXRhW3RoaXMuX2dyb3VwRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrR3JvdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWRbcm93RGF0YVt0aGlzLl9ncm91cEZpZWxkXV0gPSBjaGVja0dyb3VwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrZWRBbGwoKTtcclxuICAgICAgICBpZiAoZmlyZUV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdHJFbGVtZW50KSB0ckVsZW1lbnQgPSB0aGlzLmdldFRyQnlSb3dEYXRhKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbWl0Um93U2VsZWN0KHRyRWxlbWVudCwgcm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBoYW5kbGVDaGVja0FsbCA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jaGVja2VkQWxsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcyA9IFsuLi50aGlzLm1vZGVsLmRhdGFTb3VyY2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldExhc3RJdGVtU2VsZWN0ZWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgaXRlbS5fY2hlY2tlZCA9IHRoaXMuY2hlY2tlZEFsbCA9PT0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uQ2hlY2tBbGwuZW1pdCh0aGlzLmNoZWNrZWRBbGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUNoZWNrUm93RGF0YSA9IChyb3dEYXRhLCB0ckVsZW1lbnQgPSBudWxsLCBmaXJlRXZlbnQgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFyb3dEYXRhLl9jaGVja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHAgPT4gcC5pZCA9PSByb3dEYXRhLmlkKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMucHVzaChyb3dEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW0gPSByb3dEYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRMYXN0SXRlbVNlbGVjdGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja2VkQWxsKCk7XHJcbiAgICAgICAgaWYgKCF0ckVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdHJFbGVtZW50ID0gdGhpcy5nZXRUckJ5Um93RGF0YShyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9lbWl0Um93U2VsZWN0KHRyRWxlbWVudCwgcm93RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ2hlY2tlZEFsbCgpIHtcclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoICYmIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdFJvdyhkYXRhczogYW55W10gPSBbXSkge1xyXG4gICAgICAgIGlmICghZGF0YXMgfHwgZGF0YXMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmhpZGRlbkNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhc3RJdGVtID0gZGF0YXNbZGF0YXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGxhc3RJdGVtLl9jaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VwRmllbGQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwKGxhc3RJdGVtLCB0aGlzLmdldFRyQnlSb3dEYXRhKGxhc3RJdGVtKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoZWNrUm93RGF0YShsYXN0SXRlbSwgdGhpcy5nZXRUckJ5Um93RGF0YShsYXN0SXRlbSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhcy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5fY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hlY2tSb3dEYXRhX0dyb3VwKGRhdGEsIHRoaXMuZ2V0VHJCeVJvd0RhdGEoZGF0YSksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGVja1Jvd0RhdGEoZGF0YSwgdGhpcy5nZXRUckJ5Um93RGF0YShkYXRhKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Tb3J0KGV2ZW50OiBhbnksIF90YWJsZTogVGFibGUpIHtcclxuICAgICAgICB0aGlzLnNvcnRXaXRoQXBpKGV2ZW50LCBfdGFibGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc29ydFdpdGhBcGkoZXZlbnQ6IGFueSwgX3RhYmxlOiBUYWJsZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5sb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIF90YWJsZS5yZXNldCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0SGlzdG9yeS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gZXZlbnQuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvcnRIaXN0b3J5WzBdLmZpZWxkID09IGV2ZW50LmZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSBldmVudC5maWVsZDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb3J0RGlyID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydERpciA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fc29ydERpciA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5fc29ydERpciA9IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZmllbGQgIT0gdGhpcy5zb3J0SGlzdG9yeVswXS5maWVsZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydEZpZWxkID0gZXZlbnQuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0RGlyID0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeS51bnNoaWZ0KHsgZmllbGQ6IHRoaXMuX3NvcnRGaWVsZCwgZGlyOiB0aGlzLl9zb3J0RGlyIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcHJvY2Vzc0RhdGFTb3VyY2UoZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tlZEFsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5yb3dHcm91cENoZWNrZWQgPSB7fTtcclxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UpIHJldHVybjtcclxuICAgICAgICBkYXRhU291cmNlLmZvckVhY2goc291cmNlID0+IHtcclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5pZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzID0ge307XHJcbiAgICAgICAgICAgIGlmICghc291cmNlLmNvbFNwYW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5jb2xTcGFuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzb3VyY2Uucm93U3Bhbikge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLnJvd1NwYW4gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5oaWRkZW4gPSB7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc291cmNlLmlzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcy5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0V4cGlyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcy5leHBpcmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5jbGFzcykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLmNsYXNzLnNwbGl0KCcgJykuZmlsdGVyKHAgPT4gcCkuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5vYmpTdHlsZUNsYXNzW2Nsc10gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1MZW5ndGguZm9yRWFjaChfY29sID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbCA9IDxDb2x1bW5TY2hlbWFCYXNlPl9jb2w7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZVtjb2wuZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnN1YnN0cmluZyAmJiB2YWx1ZS5sZW5ndGggPiBjb2wubWF4TGVuZ3RoRGlzcGxheSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHN2OiBzaG9ydCB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVtgJHtjb2wuZmllbGR9X19zdmBdID0gYCR7dmFsdWUuc3Vic3RyaW5nKDAsIGNvbC5tYXhMZW5ndGhEaXNwbGF5KX1gO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5hZHZhbmNlRGF0YS5maWVsZEhhc01heGltdW1Xb3JkLmZvckVhY2goX2NvbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSA8Q29sdW1uU2NoZW1hQmFzZT5fY29sO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTaG9ydFdvcmQgPSB0aGlzLnN1YldvcmQoc291cmNlW2NvbC5maWVsZF0sIGNvbC5tYXhXb3JkRGlzcGxheSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVTaG9ydFdvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdjogc2hvcnQgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VbYCR7Y29sLmZpZWxkfV9fc3ZgXSA9IGAke3ZhbHVlU2hvcnRXb3JkfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMudXBkYXRlUm93R3JvdXBNZXRhRGF0YShkYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3ViV29yZCh2YWx1ZTogc3RyaW5nLCB3b3JkQ291bnQ6IG51bWJlcikge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLnRyaW0pIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcclxuICAgICAgICBsZXQgaW5kZXggPSAtMSwgYmVmb3JlQ2hhciA9ICdhJztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZVtpXSA9PSAnJyAmJiBiZWZvcmVDaGFyICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBiZWZvcmVDaGFyID0gdmFsdWVbaV07XHJcbiAgICAgICAgICAgIGlmICh3b3JkQ291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZVNob3dGdWxsKHJvd0RhdGEsIGZpZWxkKSB7XHJcbiAgICAgICAgcm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ10gPSAhcm93RGF0YVtmaWVsZCArICdfX3Nob3dGdWxsJ107XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG1lcmdlQ2xhc3NPYmooc291cmNlLCBvdGhlck9iaiA9IHt9KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gc291cmNlLm9ialN0eWxlQ2xhc3M7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3RoZXJPYmopIHtcclxuICAgICAgICAgICAgb2JqW2tleV0gPSBvdGhlck9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Um93R3JvdXAocm93RGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHJvd0RhdGEsXHJcbiAgICAgICAgICAgIHJvd0dyb3VwTWV0YWRhdGE6IHRoaXMucm93R3JvdXBNZXRhZGF0YSxcclxuICAgICAgICAgICAgZ3JvdXBDb2w6IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbixcclxuICAgICAgICAgICAgZ3JvdXBGaWVsZDogdGhpcy5fZ3JvdXBGaWVsZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRleHRSb3dHcm91cFJvb3Qocm93RGF0YSwgZXhwYW5kZWQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi50aGlzLmdldENvbnRleHRSb3dHcm91cChyb3dEYXRhKSxcclxuICAgICAgICAgICAgZXhwYW5kZWQsXHJcbiAgICAgICAgICAgIGhhbmRsZUNoZWNrUm93R3JvdXA6IHRoaXMuaGFuZGxlQ2hlY2tSb3dHcm91cCxcclxuICAgICAgICAgICAgZ2V0Q29sU3Bhbkdyb3VwOiB0aGlzLmdldENvbFNwYW5Hcm91cCxcclxuICAgICAgICAgICAgdGFibGU6IHRoaXMudGFibGUsXHJcbiAgICAgICAgICAgIGNsYXNzUm93R3JvdXA6IHRoaXMuX2NsYXNzUm93R3JvdXAsXHJcbiAgICAgICAgICAgIGljb25Ub2dnbGVSb3dHcm91cDogdGhpcy5pY29uVG9nZ2xlUm93R3JvdXBcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb250ZXh0Q2VsbChyb3dEYXRhLCByb3dJbmRleCwgY29sLCBleHBhbmRlZCwgJHRoaXMpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjcnVkTGlzdDogJHRoaXMsXHJcbiAgICAgICAgICAgIHJvd0RhdGEsXHJcbiAgICAgICAgICAgIHJvd0luZGV4LFxyXG4gICAgICAgICAgICBjb2wsXHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgIGV4cGFuZGVkLFxyXG4gICAgICAgICAgICBpY29uVG9nZ2xlUm93RGF0YTogdGhpcy5pY29uVG9nZ2xlUm93RGF0YVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENsYXNzUm93RGF0YU9mR3JvdXAocm93RGF0YSkge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcclxuICAgICAgICBpZiAodGhpcy5jb250YWluU2VsZWN0SXRlbShyb3dEYXRhKSkge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyB1aS1zdGF0ZS1oaWdobGlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fZ3JvdXBGaWVsZCAhPT0gJycpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgaXMtY2hpbGQtZ3JvdXAnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YS5jbGFzcykge1xyXG4gICAgICAgICAgICByZXN1bHQgKz0gJyAnICsgcm93RGF0YS5jbGFzcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbnRhaW5TZWxlY3RJdGVtKGl0ZW0pIHtcclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KHggPT4geCAmJiB4W3RoaXMuc2V0dGluZy5lbnRpdHlLZXldID09PSBpdGVtW3RoaXMuc2V0dGluZy5lbnRpdHlLZXldKSA+IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb3AoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsVG9Ub3AoMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYmFyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbGJhci5zY3JvbGxUb0JvdHRvbSgwLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk5leHQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlICsgMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblByZXYoZXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPiAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgLSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk9sZGVzdChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gTWF0aC5jZWlsKHRoaXMubW9kZWwudG90YWwgLyB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemUpO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF0ZXN0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRW1wdHlUb29sYmFyKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuaXRlbShpKTtcclxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDggJiYgbm9kZXMuaXRlbShpKS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGlzRW1wdHlGdW5jdGlvbkJ1dHRvbnMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBub2RlcyA9IGVsZW1lbnQuY2hpbGROb2RlcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5pdGVtKGkpO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gOCAmJiBub2Rlcy5pdGVtKGkpLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc1RlbXBsYXRlKHRlbXBsYXRlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSA9IHRoaXMuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gIT0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID0gdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlUm93R3JvdXBNZXRhRGF0YShkYXRhU291cmNlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJvd0dyb3VwTWV0YWRhdGEgPSB7fTtcclxuICAgICAgICBsZXQgaW5kZXhHcm91cCA9IDA7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBGaWVsZE5hbWU6IHN0cmluZyA9IHRoaXMuX2dyb3VwRmllbGQ7XHJcbiAgICAgICAgLy8gVOG6oW8gYuG7q2EgMSBncm91cCB2YWx1ZSBiZWZvcmVcclxuICAgICAgICBsZXQgcHJldmlvdXNHcm91cFZhbHVlID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XHJcbiAgICAgICAgaWYgKGdyb3VwRmllbGROYW1lICYmIGdyb3VwRmllbGROYW1lICE9ICcnKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IGRhdGFTb3VyY2VbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cFZhbHVlID0gcm93RGF0YVtncm91cEZpZWxkTmFtZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXBWYWx1ZSAhPT0gcHJldmlvdXNHcm91cFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dHcm91cE1ldGFkYXRhW2dyb3VwVmFsdWVdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaW5kZXhHcm91cDogaW5kZXhHcm91cCsrLCBzaXplOiAxLCBpdGVtUm9vdDogcm93RGF0YSwgaXRlbXM6IFtyb3dEYXRhXVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5leHBhbmRlZFJvd0tleXNbZ3JvdXBWYWx1ZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzR3JvdXBWYWx1ZSA9IGdyb3VwVmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtR3JvdXAgPSB0aGlzLnJvd0dyb3VwTWV0YWRhdGFbZ3JvdXBWYWx1ZV07XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbUdyb3VwLnNpemUrKztcclxuICAgICAgICAgICAgICAgICAgICBpdGVtR3JvdXAuaXRlbXMucHVzaChyb3dEYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJvd0RhdGEuX2luZGV4ID0gdGhpcy5yb3dHcm91cE1ldGFkYXRhW2dyb3VwVmFsdWVdLnNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3MgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVDb2xvclNldHRpbmdzKGRhdGEpIHtcclxuICAgICAgICBpZiAoZGF0YS5jb2xvckZpbHRlclRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lQXJyID0gZGF0YS5jb2xvckZpbHRlclRhYmxlLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBjbG9uZUFyci5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsb25lQXJyW2ldLmZpbHRlclZhbHVlID09ICcnIHx8IGNsb25lQXJyW2ldLmZpbHRlclZhbHVlID09IG51bGwgfHwgY2xvbmVBcnJbaV0uZmlsdGVyVmFsdWUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb2xvckZpbHRlclRhYmxlLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkID0gZGF0YS5jb2xvckZpbHRlckZpZWxkO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xvckZpbHRlclRhYmxlID0gZGF0YS5jb2xvckZpbHRlclRhYmxlO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1Jvd0NvbG9yID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jYWNoZUNvbG9yU2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3JTZXR0aW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU2F2ZVNldHRpbmdzKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmRldGFpbHMgPSBldmVudC5kZXRhaWxzO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgPSBldmVudC5zb3J0RmllbGQ7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHVtblNldHRpbmcuc29ydERpciA9IGV2ZW50LnNvcnREaXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RGlyID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkID0gZXZlbnQuZ3JvdXBGaWVsZDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4gPSB0aGlzLnNldHRpbmcuY29scy5maW5kKHAgPT4gcC5maWVsZCA9PSBldmVudC5ncm91cEZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4udmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5mb3JjZUdldERhdGEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNhdmVDb2x1bW5TZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0ZW5kQ29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29sdW1ucyh0aGlzLnNldHRpbmcuY29scyk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDb2x1bW5TZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3MgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlDb2x1bW5TZXR0aW5nKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5ncm91cEZpZWxkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbmQocCA9PiBwLmZpZWxkID09IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLmdyb3VwRmllbGQpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4uZm9yY2VHZXREYXRhID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmdyb3VwQ29sdW1uLnJhd0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwRmllbGQgPSB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4ucmF3Q29sdW1uLmZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5maWVsZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHRoaXMuX2dyb3VwRmllbGQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdXBGaWVsZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zb3J0RmllbGQgPSB0aGlzLnNldHRpbmcuY29sdW1uU2V0dGluZy5zb3J0RmllbGQ7XHJcbiAgICAgICAgdGhpcy5fc29ydERpciA9IHRoaXMuc2V0dGluZy5jb2x1bW5TZXR0aW5nLnNvcnREaXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsICYmIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZyAmJiB0aGlzLl9zb3J0RmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeSA9IFt7IGZpZWxkOiB0aGlzLl9zb3J0RmllbGQsIGRpcjogdGhpcy5fc29ydERpciA/IHRoaXMuX3NvcnREaXIgOiAwIH1dO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0SGlzdG9yeSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENlbGxDbGFzc0hlYWRlcihjb2wpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcbiAgICAgICAgaWYgKGNvbC5jZWxsQ2xhc3MpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9IGNvbC5jZWxsQ2xhc3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghY29sLnNvcnQpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgTm9Tb3J0Q29sdW1uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbC5maWVsZCA9PSB0aGlzLl9zb3J0RmllbGQpIHtcclxuICAgICAgICAgICAgcmVzdWx0ICs9ICcgcC1zb3J0YWJsZS1jb2x1bW4nO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc29ydERpciAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyBwLWhpZ2hsaWdodCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb2x1bW5TdHlsZShjb2w6IGFueSwgZm9ySGVhZGVyID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBzdHlsZTogYW55ID0ge307XHJcbiAgICAgICAgaWYgKGNvbC5maWVsZCA9PSAnbWV0YWRhdGFTdGF0dXMnKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICAgICAgc3R5bGVbJ3dpZHRoJ10gPSAnOGVtJztcclxuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbC50ZXh0QWxpZ24gPT0gVGV4dEFsaWduLkxlZnQpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdsZWZ0JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnRleHRBbGlnbiA9PSBUZXh0QWxpZ24uQ2VudGVyKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAnY2VudGVyJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnRleHRBbGlnbiA9PSBUZXh0QWxpZ24uUmlnaHQpIHtcclxuICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdyaWdodCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWxpZ25DZW50ZXJDb2x1bW4oY29sKSkge1xyXG4gICAgICAgICAgICBzdHlsZVsndGV4dC1hbGlnbiddID0gJ2NlbnRlcic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWxpZ25SaWdodENvbHVtbihjb2wpKSB7XHJcbiAgICAgICAgICAgIHN0eWxlWyd0ZXh0LWFsaWduJ10gPSAncmlnaHQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGZvckhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdjZW50ZXInO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVbJ3RleHQtYWxpZ24nXSA9ICdsZWZ0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzdHlsZVsnd2lkdGgnXSA9IGNvbC53aWR0aDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0Qm9va21hcmtDb2xvcihyb3dEYXRhLCBjb2x1bW5zKSB7XHJcbiAgICAgICAgY29uc3QgcjogYW55ID0geyBkaXNwbGF5OiAnbm9uZScgfTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyRmllbGQgJiYgdGhpcy5zZXR0aW5nLmNvbG9yRmlsdGVyVGFibGUpIHtcclxuICAgICAgICAgICAgbGV0IGNvbDtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjIGluIGNvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zW2NdLmZpZWxkID09IHRoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sID0gY29sdW1uc1tjXTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGZvckRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGZvck51bWJlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgZm9yQm9vbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSByb3dEYXRhW3RoaXMuc2V0dGluZy5jb2xvckZpbHRlckZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKGNvbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRlIHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRldGltZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5jb252ZXJ0VG9EYXRlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3JEYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5pbnQgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRlY2ltYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yTnVtYmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5ib29sZWFuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoL3RydWUvaSkudGVzdCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yQm9vbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9jb2xvckZpbHRlclRhYmxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fY29sb3JGaWx0ZXJUYWJsZVtpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmVUeXBlID0gaXRlbVswXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gaXRlbVs1XTtcclxuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJWYWx1ZTogYW55ID0gaXRlbVsxXTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWUgPSBpdGVtWzJdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJWYWx1ZSA9PSBudWxsKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvck51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlclZhbHVlID0gaXRlbVszXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZmlsdGVyVmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvckJvb2wpIGZpbHRlclZhbHVlID0gaXRlbVs0XTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVR5cGUgPT0gJ3JlZ2V4Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKGZpbHRlclZhbHVlLCAnaScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubWF0Y2gocmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHsgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ2VxdWFscycpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdub3RFcXVhbHMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IGZpbHRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnY29udGFpbnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChmaWx0ZXJWYWx1ZSwgJ2knKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubWF0Y2gocmUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFja2dyb3VuZCA9IHRoaXMuYnVpbGRHcmFkaWVudENvbG9yKGNvbG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wYXJlVHlwZSA9PSAnbm90Q29udGFpbnMnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChmaWx0ZXJWYWx1ZSwgJ2knKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmJhY2tncm91bmQgPSB0aGlzLmJ1aWxkR3JhZGllbnRDb2xvcihjb2xvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcGFyZVR5cGUgPT0gJ2dyZWF0ZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmVUeXBlID09ICdsaXR0ZXInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgZmlsdGVyVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgci5iYWNrZ3JvdW5kID0gdGhpcy5idWlsZEdyYWRpZW50Q29sb3IoY29sb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbnZlcnRUb0RhdGUodmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09ICd7bm93fScpIHJldHVybiBEYXRlKCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCd7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ2R9JykpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCdkfScsICcnKSk7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ3snKSAmJiB2YWx1ZS5lbmRzV2l0aCgnaH0nKSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ2h9JywgJycpKTtcclxuICAgICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRIb3VycyhkYXRlLmdldEhvdXJzKCkgKyB2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCd7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ219JykpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCdtfScsICcnKSk7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgIGRhdGUuc2V0TWludXRlcyhkYXRlLmdldE1pbnV0ZXMoKSArIHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJy8nKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShwYXJ0c1syXSArICctJyArIHBhcnRzWzFdICsgJy0nICsgcGFydHNbMF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcclxuICAgICAgICBpZiAoIWlzTmFOKGRhdGUuZ2V0RGF0ZSgpKSkgcmV0dXJuIGRhdGU7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEdyYWRpZW50Q29sb3IoY29sb3IpIHtcclxuICAgICAgICByZXR1cm4gYGxpbmVhci1ncmFkaWVudCg5MGRlZywgJHtjb2xvcn0gMCUsICR7Y29sb3J9NGQgMzUlLCAke2NvbG9yfTFhIDYwJSwgdHJhbnNwYXJlbnQgMTAwJSlgO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWxpZ25DZW50ZXJDb2x1bW4oY29sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kYXRldGltZSB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZSB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuYm9vbGVhbiB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZW51bTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFsaWduUmlnaHRDb2x1bW4oY29sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5pbnQgfHwgY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmRlY2ltYWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbFNwYW5Hcm91cCA9IChudW1PZkNvbEN1c3RvbTogbnVtYmVyID0gMCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmcuY29scy5maWx0ZXIoeCA9PiB4LnZpc2libGUgPT09IG51bGwgfHwgeC52aXNpYmxlID09PSB1bmRlZmluZWQgfHwgeC52aXNpYmxlID09PSB0cnVlKS5sZW5ndGhcclxuICAgICAgICAgICAgKyAodGhpcy5zZXR0aW5nLmhpZGRlbk9yZGVyQ29sdW1uID8gMCA6IDEpXHJcbiAgICAgICAgICAgICsgKHRoaXMuc2V0dGluZy5oaWRkZW5GdW5jdGlvbkNvbHVtbiA/IDAgOiAxKVxyXG4gICAgICAgICAgICAtIG51bU9mQ29sQ3VzdG9tO1xyXG4gICAgfVxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVLZXlwcmVzc0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCAmJiB0aGlzLmNvbnRleHQucm9vdC5kYXRhLmxpc3RRdWV1ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdFF1ZXVlID0gdGhpcy5jb250ZXh0LnJvb3QuZGF0YS5saXN0UXVldWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RRdWV1ZS5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0UXVldWUuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy50aW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZU11bHRpcGxlRGVsZXRlKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZURlbGV0ZShpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNhYmxlRWRpdChyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuX19kaXNhYmxlRWRpdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuRWRpdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gJiYgcm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAhPSAnMCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZURlbGV0ZShyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuX19kaXNhYmxlRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5oaWRkZW5EZWxldGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICYmIHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gIT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3dIaXN0b3J5KHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuc2hvd0hpc3RvcnkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5oaXN0b3J5ID0gcm93RGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd0xpc3RWZXJzaW9uKHJvd0RhdGEpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcudmVyc2lvbk1vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnZlcnNpb25Nb2RlbC5pdGVtRGF0YSA9IHJvd0RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRXaWR0aEZ1bmN0aW9uKHRhYmxlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGhGdW5jdGlvbkNvbHVtbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgd2lkdGhJblBpeGVsID0gdGhpcy5fZGVmYXVsdFdpdGhGdW5jdGlvbkNvbHVtbjtcclxuICAgICAgICBjb25zdCB0ZCA9IHRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGRbY2xhc3MqPVwiY29sdW1uLWZ1bmN0aW9uXCJdJyk7XHJcbiAgICAgICAgaWYgKHRkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVtVG9QaXhjZWwgPSB0aGlzLmdldEZvbnRTaXplSW5QaXhlbCh0ZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gYnV0dG9ucy5sZW5ndGggKiAyLjQ7IC8vIGJ1dHRvbiB3aWR0aDogMi40cmVtXHJcbiAgICAgICAgICAgIGNvbnN0IHRtcFdpZHRoSW5QaXhlbCA9IHdpZHRoICogZW1Ub1BpeGNlbCArIDY7IC8vIDYgbGEgdG9uZyBwYWRkaW5nIGxlZnQsIHJpZ2h0IGN1YSB0aFxyXG4gICAgICAgICAgICBpZiAod2lkdGhJblBpeGVsIDwgdG1wV2lkdGhJblBpeGVsKSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aEluUGl4ZWwgPSB0bXBXaWR0aEluUGl4ZWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRoID0gdGFibGUuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0aFtjbGFzcyo9XCJzZXR0aW5nLWNlbGxcIl0nKTtcclxuICAgICAgICBpZiAodGgpIHtcclxuICAgICAgICAgICAgY29uc3QgZW1Ub1BpeGNlbCA9IHRoaXMuZ2V0Rm9udFNpemVJblBpeGVsKHRoKTtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9ucyA9IHRoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKTtcclxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBidXR0b25zLmxlbmd0aCAqIDIuNCAvIDAuODU7IC8vIGJ1dHRvbiB3aWR0aDogMi40cmVtLCBmb250LXNpemUgdGggMC44NXJlbVxyXG4gICAgICAgICAgICBjb25zdCB0bXBXaWR0aEluUGl4ZWwgPSB3aWR0aCAqIGVtVG9QaXhjZWwgKyA2OyAvLyA2IGxhIHRvbmcgcGFkZGluZyBsZWZ0LCByaWdodCBjdWEgdGhcclxuICAgICAgICAgICAgaWYgKHdpZHRoSW5QaXhlbCA8IHRtcFdpZHRoSW5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGhJblBpeGVsID0gdG1wV2lkdGhJblBpeGVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl93aWR0aEZ1bmN0aW9uQ29sdW1uID0gYCR7d2lkdGhJblBpeGVsfXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZvbnRTaXplSW5QaXhlbChlbCkge1xyXG4gICAgICAgIHJldHVybiBOdW1iZXIoZ2V0Q29tcHV0ZWRTdHlsZShlbCwgJycpLmZvbnRTaXplLm1hdGNoKC8oKFxcZHwuKSspcHgvKVsxXSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzc0Jhc2VEYXRhKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucHJlUHJvY2Vzc0RhdGEodGhpcy5tb2RlbC5kYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHByZVByb2Nlc3NEYXRhKGRhdGFTb3VyY2UpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbEhhc1BpcGUgPSB0aGlzLnNldHRpbmcuY29scy5maWx0ZXIoeCA9PiB4LnBpcGUpO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbEhhc1BpcGUpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGFTb3VyY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtKDxQaXBlVHJhbnNmb3JtPmNvbC5waXBlLCBjb2wuYXN5bmNQaXBlLCBpdGVtW2NvbC5maWVsZF0pLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1bYHBpcGVfXyR7Y29sLmZpZWxkfSBgXSA9IHJzO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGFzeW5jIHRyYW5zZm9ybShwaXBlOiBQaXBlVHJhbnNmb3JtLCBhc3luY1BpcGU6IGJvb2xlYW4sIHZhbHVlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhc3luY1BpcGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlUm93T3JkZXJlZChldnQpIHtcclxuICAgICAgICB0aGlzLm9uUmVvcmRlcmVkLmVtaXQoZXZ0KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdSb3dDb2xvcigpIHtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NSb3dDb2xvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJ1aWxkRmlsdGVyQ29sdW1uKGNvbHMpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZUZpbHRlciA9IHRoaXMudGVtcGxhdGVGaWx0ZXI7XHJcbiAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2wuY29udHJvbFR5cGUgPT0gQ29udHJvbFR5cGUuZHJvcGRvd24pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2wuYmFzZVNlcnZpY2UgfHwgKGNvbC5kYXRhU291cmNlICYmIGNvbC5kYXRhU291cmNlLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJTY2hlbWEuZHJvcGRvd25bY29sLmZpZWxkXSA9IG5ldyBEcm9wZG93bkNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jb2wsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnQ2jhu41uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPbkluaXQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyTG9hZDogY29sLmlzU2VydmVyTG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKGBDaMawYSBj4bqldSBow6xuaCBiYXNlU2VydmljZSBob+G6t2MgZGF0YVNvdXJjZSBjaG8gY+G7mXQgJHtjb2wuZmllbGR9OiAke2NvbC5sYWJlbH1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuaW50IHx8IGNvbC5kYXRhVHlwZSA9PSBEYXRhVHlwZS5kZWNpbWFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVGaWx0ZXIucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRmllbGQ6IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5sb3dlclRoYW5FcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZDogMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZSB8fCBjb2wuZGF0YVR5cGUgPT0gRGF0YVR5cGUuZGF0ZXRpbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuZ3JlYXRlclRoYW5FcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJGaWVsZDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNHZXRWYWx1ZTogaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBhZGREYXkoaXRlbSwgMSwgLTEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogdGhpcy5nZXRGaWVsZEZpbHRlcihjb2wpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmxvd2VyVGhhbkVxdWFsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkZpZWxkOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY0dldFZhbHVlOiBpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSArIDEsIDAsIDAsIC0xKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09IERhdGFUeXBlLmJvb2xlYW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUZpbHRlci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB0aGlzLmdldEZpZWxkRmlsdGVyKGNvbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWVsZDogY29sLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlRmlsdGVyLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHRoaXMuZ2V0RmllbGRGaWx0ZXIoY29sKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5jb250YWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmllbGQ6IGNvbC5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEZpZWxkRmlsdGVyKGNvbCkge1xyXG4gICAgICAgIHJldHVybiBjb2wuZmllbGRGaWx0ZXIgPyBjb2wuZmllbGRGaWx0ZXIgOiBjb2wuZmllbGQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRleHRDdXN0b21GaWx0ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNlYXJjaCA9IChub2RlPykgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyX2NvbHVtbiA9IHRoaXMuX2NydWRTZXJ2aWNlLmdldEZpbHRlckZyb21UZW1wbGF0ZSh0aGlzLnRlbXBsYXRlRmlsdGVyLCB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLmZpbHRlckRhdGEpKTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcclxuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBpZiAobW9kZWwuX2Ryb3Bkb3dudmFsdWUgIT0gbnVsbCAmJiBtb2RlbC5fZHJvcGRvd252YWx1ZSAhPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7fTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRNaW5pbWl6ZURhdGEobW9kZWxba2V5XSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIGRhdGFba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xyXG4gICAgICAgICAgICBjb25zdCBhcnIgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmdldE1pbmltaXplRGF0YShpdGVtKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsZWFyU2VhcmNoKG5vZGUsIGZpZWxkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRhdGFbZmllbGRdICE9IG51bGwgJiYgdGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSAhPT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEYXRhW2ZpZWxkXSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25DbGVhck51bWJlclNlYXJjaChub2RlLCBjb250cm9sKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLmNsZWFyKCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgY2xlYXIgZGF0YSBiZWNhdXNlIGl0J3MgMiB3YXlzIGJpbmRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMub25TZWFyY2gobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNsZWFyRGF0ZVNlYXJjaChub2RlLCBjb250cm9sLCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgICAgICAgICBpZiAoY29udHJvbC5jbGVhcigpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBuZWVkIGNsZWFyIGRhdGEgYmVjYXVzZSBub3QgMiB3YXlzIGJpbmRpbmdcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblNlYXJjaChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRmlsdGVyQm94Rm9jdXMobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ2hhbmdlRGF0ZVRpbWUoZXZ0LCBmaWVsZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0gPSBldnQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5vblNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNoYW5nZUJvb2xlYW4oZXZ0LCBmaWVsZCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckRhdGFbZmllbGRdLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRGF0YVtmaWVsZF0uc3BsaWNlKDAsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uU2VhcmNoKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUZpbHRlckJveEZvY3VzKG5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVFbDogYW55ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5TYW1lQm94ID0gdGhpcy5jaGVja0luTm9kZShhY3RpdmVFbCwgbm9kZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWluU2FtZUJveCB8fCAoYWN0aXZlRWwgJiYgYWN0aXZlRWwubm9kZU5hbWUgIT0gJ0lOUFVUJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5vZGUucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIGlucHV0LnNlbGVjdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5TYW1lQm94KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlRWwuc2VsZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNob3dGaWx0ZXJEcm9wZG93blBhbmVsKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3Bkb3duID0gZXZlbnQuY29tcG9uZW50LmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2VsbEhlYWRlckZpbHRlciA9IGRyb3Bkb3duLmNsb3Nlc3QoJ3RoJyk7XHJcblxyXG4gICAgICAgIC8vIHRoZW0gY2xhc3MgZm9jdXMtd2l0aGluIGRlIGRyb3Bkb3duIGlucHV0IGx1YyBmb2N1cyBraG9uZyBiaSBkZSBib2kgY2FjIHN0aWNreSBjb2x1bW5cclxuICAgICAgICBjZWxsSGVhZGVyRmlsdGVyICYmIGNlbGxIZWFkZXJGaWx0ZXIuY2xhc3NMaXN0LmFkZCgnZm9jdXMtd2l0aGluJyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25IaWRlRmlsdGVyRHJvcGRvd25QYW5lbChldmVudCkge1xyXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wZG93biA9IGV2ZW50LmNvbXBvbmVudC5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGNlbGxIZWFkZXJGaWx0ZXIgPSBkcm9wZG93bi5jbG9zZXN0KCd0aCcpO1xyXG4gICAgICAgIGNlbGxIZWFkZXJGaWx0ZXIgJiYgY2VsbEhlYWRlckZpbHRlci5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cy13aXRoaW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdEZpbHRlckJveEZvY3VzKG5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZSAmJiBub2RlLnBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZS5vZmZzZXRXaWR0aCA8IDI1MCkge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdzaG9ydC1maWx0ZXItYm94Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3J0LWZpbHRlci1ib3gnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSW5Ob2RlKGNoaWxkLCBwYXJlbnQpIHtcclxuICAgICAgICBsZXQgc3RhcnQgPSBjaGlsZDtcclxuICAgICAgICB3aGlsZSAoc3RhcnQgJiYgc3RhcnQucGFyZW50Tm9kZSAhPSBwYXJlbnQpIHtcclxuICAgICAgICAgICAgc3RhcnQgPSBzdGFydC5wYXJlbnROb2RlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICE9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNhdmVQYWdlU2l6ZSgpIHtcclxuICAgICAgICB0aGlzLnNhdmVQYWdlU2V0dGluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVUYWJsZVJlbmRlcmVkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zdG9wQ2FsY3VsYXRpbmdGdW5jdGlvbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlKSB0aGlzLmdldFdpZHRoRnVuY3Rpb24odGhpcy50YWJsZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b3BDYWxjdWxhdGluZ0Z1bmN0aW9uQ29sdW1uV2lkdGggPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCAkdGhzID0gdGhpcy50YWJsZS5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoZWFkIHRyOm5vdCg6Zmlyc3QtY2hpbGQpIHRoJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkdGhzLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgICAgICAgICR0aHNbaV0uc3R5bGUudG9wID0gYCR7JHRoc1tpXS5vZmZzZXRUb3B9cHhgO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZWxlY3QgbOG6oWkgaXRlbSBjdeG7kWkgY8O5bmcgxJHGsOG7o2Mgc2VsZWN0IHRyxrDhu5tjIMSRw7NcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnJlU2VsZWN0TGFzdEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgJHRyID0gdGhpcy5nZXRUckJ5Um93RGF0YSh0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbUxhc3QpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCR0cikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtTGFzdCA9IHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtTGFzdDtcclxuICAgICAgICAgICAgICAgICAgICAkdHIuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uUmVsb2FkZWQuZW1pdCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyQnlSb3dEYXRhKHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy50YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5maW5kSW5kZXgocCA9PiBwLmlkID09IHJvd0RhdGEuaWQpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRhYmxlLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgdGJvZHkgdHJbcm93SW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3luYyBzaG93U2V0dGluZ3NQZXJtaXNzaW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNyZWF0aW5nU2VhcmNoSW5mbykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1Blcm1pc3Npb24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgY3JlYXRlU2VhcmNoU2NoZW1hKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29scyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0LhuqFuIGNoxrBhIGPhuqV1IGjDrG5oIGPhu5l0IGNobyBkYW5oIHPDoWNoJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3JlYXRpbmdTZWFyY2hJbmZvID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBzZWFyY2hJbmZvID0gbmV3IFNlYXJjaEluZm8oKTtcclxuICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYSA9IDxGb3JtQ29udHJvbEJhc2VbXT5bXTtcclxuICAgICAgICBzZWFyY2hJbmZvLmZpZWxkRHJvcGRvd24gPSB7fTtcclxuICAgICAgICBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dCA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuc2V0dGluZy5jb2xzKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2wuYWxsb3dGaWx0ZXIgIT0gZmFsc2UgJiYgY29sLnJhd0NvbHVtbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sLmZ1bGxUZXh0U2VhcmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LmluZGV4T2YoY29sLmZpZWxkKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dC5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCA9ICdUw6xtIGtp4bq/bSB0aGVvIGPDoWMgdHLGsOG7nW5nOic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCArPSBgIFwiJHtjb2wubGFiZWwgPyBjb2wubGFiZWwgOiBjb2wuZmllbGR9XCIsYDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gYXdhaXQgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLmdldFNlYXJjaENvbnRyb2woY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKC4uLmNvbnRyb2wpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5iYXNlU2VydmljZSB8fCAoY29sLmRhdGFTb3VyY2UgJiYgY29sLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZERyb3Bkb3duW2NvbC5maWVsZF0gPSBuZXcgRHJvcGRvd25Db250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogY29sLm11bHRpcGxlID8gT3BlcmF0b3IuaW4gOiBPcGVyYXRvci5lcXVhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRPbkluaXQ6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLmZpZWxkRHJvcGRvd25bY29sLmZpZWxkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2wuZGF0YVR5cGUgPT0gJ2ludCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5zY2hlbWEucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdW1iZXJSYW5nZUNvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrVHlwZTogJ2ludCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sLmxhYmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tUeXBlOiAnZGVjaW1hbCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdkYXRlJyB8fCBjb2wuZGF0YVR5cGUgPT0gJ2RhdGV0aW1lJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lUmFuZ2VDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2wubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmdyZWF0ZXJUaGFuRXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLmRhdGFUeXBlID09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmZvLnNjaGVtYS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWEoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2wuZmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6IHRydWUsIGxhYmVsOiBgQ8OzYCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiBmYWxzZSwgbGFiZWw6IGBLaMO0bmdgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IuZXF1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRXaWR0aDogY29sLm1kV2lkdGggPyBjb2wubWRXaWR0aCA6IDEwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5maWVsZCAhPSBjb2wuZGF0YVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8uc2NoZW1hLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRleHRDb250cm9sU2NoZW1hKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGNvbC5maWVsZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbC5sYWJlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yLmNvbnRhaW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kV2lkdGg6IGNvbC5tZFdpZHRoID8gY29sLm1kV2lkdGggOiAxMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBzZWFyY2hJbmZvLmZpZWxkU2VhcmNoVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlYXJjaEluZm8uZmllbGRTZWFyY2hUZXh0LmluZGV4T2YoZmllbGQpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby5maWVsZFNlYXJjaFRleHQucHVzaChmaWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWFyY2hJbmZvLnRvb2x0aXBTZWFyY2hUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQgPSAnVMOsbSBraeG6v20gdGhlbyBjw6FjIHRyxrDhu51uZzonO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSB0aGlzLnNldHRpbmcubW9kZWxTY2hlbWFzLmZpbmQocCA9PiBwLmZpZWxkID09IGZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCArPSBgIFwiJHtjb2wubmFtZX1cIixgO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgc2VhcmNoSW5mby50b29sdGlwU2VhcmNoVGV4dCA9IHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQuc3Vic3RyaW5nKDAsIHNlYXJjaEluZm8udG9vbHRpcFNlYXJjaFRleHQubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VhcmNoSW5mbyA9IHNlYXJjaEluZm87XHJcbiAgICAgICAgdGhpcy5jcmVhdGluZ1NlYXJjaEluZm8gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2hvd1NldHRpbmdzV29ya2Zsb3coKSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd1NldHRpbmdzV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNhdmVXb3JrZmxvd1NldHRpbmdzKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLndvcmtmbG93U2V0dGluZyA9IGV2ZW50O1xyXG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UucmVsb2FkUGFnZSgpO1xyXG4gICAgICAgIHRoaXMuX3Nob3dTZXR0aW5nc1dvcmtmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uUmVtb3ZlV29ya2Zsb3dTZXR0aW5ncyhldnQpIHtcclxuICAgICAgICB0aGlzLl9zaG93U2V0dGluZ3NXb3JrZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdvVG9UYXNrKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdDaOG7qWMgbsSDbmcgeGVtIGNoaSB0aeG6v3QgY8O0bmcgdmnhu4djIHjhu60gbMO9IHThu50gdHLDrG5oIMSRYW5nIMSRxrDhu6NjIGhvw6BuIHRoaeG7h24uLi4nKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tb2RlbC5sb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKGYgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy50YWJsZS5jb250YWluZXJWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucC1kYXRhdGFibGUtbG9hZGluZy1vdmVybGF5Jyk7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LmNsb3Nlc3QoJ3AtdGFibGUnKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlU2Nyb2xsQmFyQ29udGVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZVNjcm9sbEJhckNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcy1jb250ZW50JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBub2RlU2Nyb2xsQmFyQ29udGVudC5wYXJlbnROb2RlLnByZXBlbmQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoID0gZWxlbWVudC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ3AtdGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgPiB0aCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0VGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRoU2l6ZSA9IGZpcnN0VGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZ0ljb24gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGF0YWJsZS1sb2FkaW5nLWljb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShsb2FkaW5nSWNvbikuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IChmaXJzdFRoU2l6ZS5oZWlnaHQgLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSAoZmlyc3RUaFNpemUud2lkdGggLSBmb250U2l6ZSkgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJY29uLnN0eWxlLm1hcmdpblRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0ljb24uc3R5bGUubWFyZ2luTGVmdCA9IGAke2xlZnR9cHhgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RQb3NpdGlvbkxvYWRpbmdNYXNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyMCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|