@myrtex-org/form 1.1.81 → 1.1.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/modules/object-form/components/elements/input/date/input-date.component.mjs +10 -2
- package/esm2022/lib/modules/object-form/components/elements/input/table/components/input-table-modal/input-table-modal.component.mjs +33 -8
- package/esm2022/lib/modules/object-form/components/elements/input/table/input-table.component.mjs +37 -2
- package/fesm2022/myrtex-org-form.mjs +78 -9
- package/fesm2022/myrtex-org-form.mjs.map +1 -1
- package/lib/modules/object-form/components/elements/input/table/input-table.component.d.ts +1 -1
- package/package.json +1 -1
package/esm2022/lib/modules/object-form/components/elements/input/table/input-table.component.mjs
CHANGED
|
@@ -81,6 +81,8 @@ export class InputTableComponent {
|
|
|
81
81
|
this._subscriptions$.forEach((subscription) => subscription.unsubscribe());
|
|
82
82
|
}
|
|
83
83
|
createRow() {
|
|
84
|
+
const initialRowModel = getRowModel(this.settings);
|
|
85
|
+
console.log('[Table -> Create Row] Исходная модель для новой строки:', structuredClone(initialRowModel));
|
|
84
86
|
this._modalService.open(InputTableModalComponent, {
|
|
85
87
|
title: 'Создание строки',
|
|
86
88
|
okText: 'Создать',
|
|
@@ -88,6 +90,7 @@ export class InputTableComponent {
|
|
|
88
90
|
rowModel: getRowModel(this.settings),
|
|
89
91
|
isCheckRequired: this._isCheckRequired
|
|
90
92
|
}).afterClosed().subscribe(resolve => {
|
|
93
|
+
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
91
94
|
if (resolve.result) {
|
|
92
95
|
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
93
96
|
this._initDataSource(this._rows);
|
|
@@ -108,13 +111,18 @@ export class InputTableComponent {
|
|
|
108
111
|
}
|
|
109
112
|
editRow(event) {
|
|
110
113
|
const findRow = this._rows.find(item => item.id === event.row.data.id);
|
|
114
|
+
console.log('[Table -> Edit Row] Данные строки из клика (event.row.data):', event.row.data);
|
|
115
|
+
console.log('[Table -> Edit Row] Найдено в локальном rows:', structuredClone(findRow));
|
|
116
|
+
// const findRow: TableRowModel | undefined = this._rows.find(item => item.id === event.row.data.id);
|
|
111
117
|
if (findRow) {
|
|
118
|
+
const rowModelClone = structuredClone(findRow);
|
|
112
119
|
this._modalService.open(InputTableModalComponent, {
|
|
113
120
|
title: 'Редактирование строки',
|
|
114
121
|
okText: 'Сохранить',
|
|
115
122
|
settings: this.settings,
|
|
116
|
-
rowModel:
|
|
123
|
+
rowModel: rowModelClone
|
|
117
124
|
}).afterClosed().subscribe(resolve => {
|
|
125
|
+
console.log('[Table <- Modal Closed (Edit)] Результат из модалки:', structuredClone(resolve));
|
|
118
126
|
if (resolve.result) {
|
|
119
127
|
const cloneRows = structuredClone(this._rows);
|
|
120
128
|
const editableRow = cloneRows.find(row => row.id === resolve.rowModel.id);
|
|
@@ -171,6 +179,7 @@ export class InputTableComponent {
|
|
|
171
179
|
this._rows = [];
|
|
172
180
|
}
|
|
173
181
|
_initDataSource(data) {
|
|
182
|
+
console.log('[Table -> _initDataSource] Преобразование rows в dataSource таблицы. Исходный rows:', structuredClone(data));
|
|
174
183
|
this.dataSource = data.map((item) => {
|
|
175
184
|
const newDataItem = {};
|
|
176
185
|
for (let i in item.data) {
|
|
@@ -179,6 +188,7 @@ export class InputTableComponent {
|
|
|
179
188
|
newDataItem.id = item.id;
|
|
180
189
|
return newDataItem;
|
|
181
190
|
});
|
|
191
|
+
console.log('[Table -> _initDataSource] Итоговый dataSource для DevExtreme:', structuredClone(this.dataSource));
|
|
182
192
|
this._detector.detectChanges();
|
|
183
193
|
if (this.dataGrid?.instance) {
|
|
184
194
|
this.dataGrid.instance.refresh();
|
|
@@ -219,6 +229,31 @@ export class InputTableComponent {
|
|
|
219
229
|
format: this.getFormat(component),
|
|
220
230
|
minWidth: 160
|
|
221
231
|
};
|
|
232
|
+
if (component.type === ComponentType.InputDate && component.options.range) {
|
|
233
|
+
column.calculateCellValue = (rowData) => {
|
|
234
|
+
const dateRange = rowData[component.sysName];
|
|
235
|
+
if (Array.isArray(dateRange) && dateRange.length === 2) {
|
|
236
|
+
const formatDate = (dateStr) => {
|
|
237
|
+
if (!dateStr)
|
|
238
|
+
return '';
|
|
239
|
+
const d = new Date(dateStr);
|
|
240
|
+
if (isNaN(d.getTime()))
|
|
241
|
+
return '';
|
|
242
|
+
const day = String(d.getDate()).padStart(2, '0');
|
|
243
|
+
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
244
|
+
const year = d.getFullYear();
|
|
245
|
+
return `${day}.${month}.${year}`;
|
|
246
|
+
};
|
|
247
|
+
const startFormatted = formatDate(dateRange[0]);
|
|
248
|
+
const endFormatted = formatDate(dateRange[1]);
|
|
249
|
+
if (startFormatted && endFormatted) {
|
|
250
|
+
return `${startFormatted} — ${endFormatted}`;
|
|
251
|
+
}
|
|
252
|
+
return startFormatted || endFormatted || '';
|
|
253
|
+
}
|
|
254
|
+
return dateRange || '';
|
|
255
|
+
};
|
|
256
|
+
}
|
|
222
257
|
if (dataType === 'boolean') {
|
|
223
258
|
column.calculateCellValue = (rowData) => {
|
|
224
259
|
const value = rowData[component.sysName];
|
|
@@ -420,4 +455,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
420
455
|
}], changed: [{
|
|
421
456
|
type: Output
|
|
422
457
|
}] } });
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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c0JBQS9DLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFDTSxZQUFZO3NCQUF2RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBRXpCLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSwgRGF0ZVR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkLWZvcm0vZW51bXMnO1xyXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50TW9kZWxCYXNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmVkLWZvcm0vbW9kZWxzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHhEYXRhR3JpZENvbXBvbmVudCB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50VmFsdWVNb2RlbCxcclxuICBTZWN0aW9uVmFsdWVNb2RlbCxcclxuICBUYWJsZUdyb3VwTW9kZWwsXHJcbiAgVGFibGVJdGVtLFxyXG4gIFRhYmxlSXRlbVR5cGUsXHJcbiAgVGFibGVSb3dNb2RlbCxcclxuICBUYWJsZVZhbHVlTW9kZWxcclxufSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJbnB1dERhdGVNb2RlbCwgSW5wdXROdW1iZXJNb2RlbCwgSW5wdXRTZWxlY3RNb2RlbCwgSW5wdXRUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2VsZW1ldHMvaW5wdXRzJztcclxuaW1wb3J0IHsgb2JqZWN0Rm9ybUFjdGlvbnMsIG9iamVjdEZvcm1TZWxlY3RvcnMgfSBmcm9tICcuLi8uLi8uLi8uLi9zdG9yZSc7XHJcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJ0BteXJ0ZXgtb3JnL3VpJztcclxuaW1wb3J0IHsgSW5wdXRUYWJsZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzJztcclxuaW1wb3J0IHsgZ2V0Um93TW9kZWwgfSBmcm9tICcuL2hlbHBlcnMvZ2V0LXJvdy1tb2RlbC5oZWxwZXInO1xyXG5pbXBvcnQgeyBDb2x1bW5Nb2RlbCB9IGZyb20gJy4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IFJlZmVyZW5jZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9yZWZlcmVuY2Uuc2VydmljZSc7XHJcbmltcG9ydCBDdXN0b21TdG9yZSBmcm9tICdkZXZleHRyZW1lL2RhdGEvY3VzdG9tX3N0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWlucHV0LXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2lucHV0LXRhYmxlLmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgdHlwZSA9IENvbXBvbmVudFR5cGUuSW5wdXRUYWJsZTtcclxuXHJcbiAgcHJpdmF0ZSBfcmVmZXJlbmNlU2VydmljZTogUmVmZXJlbmNlU2VydmljZSA9IGluamVjdChSZWZlcmVuY2VTZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSBfbG9va3Vwc0NhY2hlOiBNYXA8c3RyaW5nLCBhbnlbXT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX3N0b3JlOiBTdG9yZSA9IGluamVjdChTdG9yZSk7XHJcbiAgcHJpdmF0ZSBfZGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICBwcml2YXRlIF9tb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9jaGFuZ2VTdWJqZWN0JDogU3ViamVjdDxUYWJsZVZhbHVlTW9kZWw+ID0gbmV3IFN1YmplY3Q8VGFibGVWYWx1ZU1vZGVsPigpO1xyXG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMkOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9pc0NoZWNrUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9jYW5FZGl0T2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcm93czogVGFibGVSb3dNb2RlbFtdID0gW107XHJcblxyXG4gIHB1YmxpYyBtb2RlbCE6IFRhYmxlVmFsdWVNb2RlbDtcclxuICBwdWJsaWMgc2V0dGluZ3MhOiBJbnB1dFRhYmxlTW9kZWw7XHJcbiAgcHVibGljIGRhdGFTb3VyY2U6IHsgW2tleTogc3RyaW5nXTogYW55IH1bXSA9IFtdO1xyXG4gIHB1YmxpYyBjb2x1bW5zOiBDb2x1bW5Nb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHZhbHVlczogU2VjdGlvblZhbHVlTW9kZWxbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0YShzZXR0aW5nczogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3MgYXMgSW5wdXRUYWJsZU1vZGVsO1xyXG5cclxuICAgIHRoaXMubW9kZWwgPSB7c3lzTmFtZTogc2V0dGluZ3Muc3lzTmFtZSwgdHlwZTogc2V0dGluZ3MudHlwZSwgZGF0YTogW10sIHRvdGFsczogW119O1xyXG4gICAgdGhpcy5fcm93cyA9IFtdO1xyXG5cclxuICAgIHRoaXMuX2RldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLl9pbml0Q29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZGF0YUdyaWQnLCB7c3RhdGljOiBmYWxzZX0pIGRhdGFHcmlkITogRHhEYXRhR3JpZENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCdlZGl0VGVtcGxhdGUnLCB7c3RhdGljOiBmYWxzZX0pIGVkaXRUZW1wbGF0ZSE6IGFueTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q29tcG9uZW50VmFsdWVNb2RlbCB8IENvbXBvbmVudFZhbHVlTW9kZWxbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBvbmVudFZhbHVlTW9kZWwgfCBDb21wb25lbnRWYWx1ZU1vZGVsW10+KCk7XHJcblxyXG4gIHB1YmxpYyBnZXQgcm93c0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcm93cy5sZW5ndGggfHwgMDtcclxuICB9XHJcblxyXG4gIGdldCBoYXNBbnlUb3RhbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMuc29tZShjID0+XHJcbiAgICAgIHRoaXMuc2hvd1RvdGFsKGMpIHx8IGMuY29tcG9uZW50cz8uc29tZShpbm5lciA9PiB0aGlzLnNob3dUb3RhbChpbm5lcikpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzUmVkTm9EYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzQ2hlY2tSZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faW5pdE1vZGVsKCk7XHJcblxyXG4gICAgdGhpcy5fY2hhbmdlU3ViamVjdCQucGlwZShcclxuICAgICAgZGVib3VuY2VUaW1lKDcwMCksXHJcbiAgICApLnN1YnNjcmliZShtb2RlbCA9PiB7XHJcbiAgICAgIHRoaXMuX3N0b3JlLmRpc3BhdGNoKG9iamVjdEZvcm1BY3Rpb25zLnVwZGF0ZVZhbHVlcyh7dmFsdWU6IG1vZGVsfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaCh0aGlzLl9zdG9yZS5zZWxlY3Qob2JqZWN0Rm9ybVNlbGVjdG9ycy5zZWxlY3RJc0NoZWNrUmVxdWlyZWQpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICB0aGlzLl9pc0NoZWNrUmVxdWlyZWQgPSByZXN1bHQ7XHJcbiAgICAgIHRoaXMuX2RldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdENhbkVkaXRPYmplY3QpXHJcbiAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICB0aGlzLl9jYW5FZGl0T2JqZWN0ID0gcmVzdWx0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncz8uY29tcG9uZW50cykge1xyXG4gICAgICAgICAgdGhpcy5faW5pdENvbHVtbnModGhpcy5zZXR0aW5ncy5jb21wb25lbnRzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2RldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0VmFsdWVNb2RlbCh0aGlzLnNldHRpbmdzKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBDb21wb25lbnRWYWx1ZU1vZGVsIHwgbnVsbCB8IChDb21wb25lbnRWYWx1ZU1vZGVsIHwgbnVsbClbXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNsb25lUmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlc3VsdCBhcyBUYWJsZVZhbHVlTW9kZWwgfCBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKGNsb25lUmVzdWx0ICYmICFBcnJheS5pc0FycmF5KGNsb25lUmVzdWx0KSAmJiB0aGlzLm1vZGVsLmRhdGEgIT09IGNsb25lUmVzdWx0LmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWwgPSBzdHJ1Y3R1cmVkQ2xvbmUoY2xvbmVSZXN1bHQpO1xyXG4gICAgICAgICAgdGhpcy5fcm93cyA9IHRoaXMuX2V4dHJhY3RSb3dzKHRoaXMubW9kZWwuZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2hhbmdlU3ViamVjdCQudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVJvdygpIHtcclxuICAgIHRoaXMuX21vZGFsU2VydmljZS5vcGVuKElucHV0VGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICB0aXRsZTogJ9Ch0L7Qt9C00LDQvdC40LUg0YHRgtGA0L7QutC4JyxcclxuICAgICAgb2tUZXh0OiAn0KHQvtC30LTQsNGC0YwnLFxyXG4gICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcclxuICAgICAgcm93TW9kZWw6IGdldFJvd01vZGVsKHRoaXMuc2V0dGluZ3MpLFxyXG4gICAgICBpc0NoZWNrUmVxdWlyZWQ6IHRoaXMuX2lzQ2hlY2tSZXF1aXJlZFxyXG4gICAgfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzb2x2ZSA9PiB7XHJcbiAgICAgIGlmIChyZXNvbHZlLnJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuX3Jvd3MgPSBbLi4uc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpLCByZXNvbHZlLnJvd01vZGVsXTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLm5leHQodGhpcy5fYnVpbGRUYWJsZVZhbHVlTW9kZWwoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVJvdyhldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmaW5kUm93ID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgIGlmIChmaW5kUm93KSB7XHJcbiAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9yb3dzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuXHJcbiAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5fY2FuRWRpdE9iamVjdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0Um93KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbmRSb3c6IFRhYmxlUm93TW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgaWYgKGZpbmRSb3cpIHtcclxuICAgICAgdGhpcy5fbW9kYWxTZXJ2aWNlLm9wZW4oSW5wdXRUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgICAgdGl0bGU6ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1INGB0YLRgNC+0LrQuCcsXHJcbiAgICAgICAgb2tUZXh0OiAn0KHQvtGF0YDQsNC90LjRgtGMJyxcclxuICAgICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcclxuICAgICAgICByb3dNb2RlbDogZmluZFJvd1xyXG4gICAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXNvbHZlID0+IHtcclxuICAgICAgICBpZiAocmVzb2x2ZS5yZXN1bHQpIHtcclxuICAgICAgICAgIGNvbnN0IGNsb25lUm93cyA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUm93ID0gY2xvbmVSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PT0gcmVzb2x2ZS5yb3dNb2RlbC5pZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGVkaXRhYmxlUm93KSB7XHJcbiAgICAgICAgICAgIGVkaXRhYmxlUm93LmRhdGEgPSByZXNvbHZlLnJvd01vZGVsLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvd3MgPSBjbG9uZVJvd3M7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dERhdGU6XHJcbiAgICAgICAgc3dpdGNoICgoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnZpZXdUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIERhdGVUeXBlRW51bS5EYXRlVGltZTpcclxuICAgICAgICAgICAgcmV0dXJuICdkZC5NTS55eXl5IGhoOm1tJztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiAnZGQuTU0ueXl5eSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhVHlwZShjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXREYXRlOlxyXG4gICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dFN3aXRjaDpcclxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb3RhbChjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0TnVtYmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IElucHV0TnVtYmVyTW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbDtcclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50Lm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVG90YWxDb2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpLm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TW9kZWwoKSB7XHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogW10sXHJcbiAgICAgIHRvdGFsczogW11cclxuICAgIH07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RGF0YVNvdXJjZShkYXRhOiBUYWJsZVJvd01vZGVsW10pIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGEubWFwKChpdGVtOiBUYWJsZVJvd01vZGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGFJdGVtOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgaW4gaXRlbS5kYXRhKSB7XHJcbiAgICAgICAgbmV3RGF0YUl0ZW1baXRlbS5kYXRhW2ldLnN5c05hbWVdID0gaXRlbS5kYXRhW2ldLnZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXdEYXRhSXRlbS5pZCA9IGl0ZW0uaWQ7XHJcblxyXG4gICAgICByZXR1cm4gbmV3RGF0YUl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pIHtcclxuICAgIHRoaXMuY29sdW1ucyA9IGNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpO1xyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgY2FwdGlvbjogJycsXHJcbiAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICBjc3NDbGFzczogJ2N1c3RvbS1jZWxsLWNvbnRyb2xzJyxcclxuICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZWRpdEJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnLFxyXG4gICAgICAgICAgICBoaW50OiAn0KPQtNCw0LvQuNGC0YwnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5yZXBhaW50KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cmFuc2Zvcm1Db2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBDb2x1bW5Nb2RlbCB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW46IENvbHVtbk1vZGVsID0ge1xyXG4gICAgICBjYXB0aW9uOiBjb21wb25lbnQub3B0aW9ucy5sYWJlbCB8fCAnJyxcclxuICAgICAgY29sdW1uczogY29tcG9uZW50LmNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpLFxyXG4gICAgICBkYXRhRmllbGQ6IGNvbXBvbmVudC5zeXNOYW1lLFxyXG4gICAgICBkYXRhVHlwZTogdGhpcy5nZXREYXRhVHlwZShjb21wb25lbnQpLFxyXG4gICAgICBmb3JtYXQ6IHRoaXMuZ2V0Rm9ybWF0KGNvbXBvbmVudCksXHJcbiAgICAgIG1pbldpZHRoOiAxNjBcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb2x1bW4uY2FsY3VsYXRlQ2VsbFZhbHVlID0gKHJvd0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgLy8g0JXRgdC70LggdHJ1ZSDigJQg0JTQsCwg0LXRgdC70LggZmFsc2UsIFwiXCIg0LjQu9C4IG51bGwg4oCUINCd0LXRglxyXG4gICAgICAgIHJldHVybiAhIXZhbHVlOyBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogW1xyXG4gICAgICAgICAgeyB2YWx1ZTogdHJ1ZSwgZGlzcGxheVZhbHVlOiAn0JTQsCcgfSxcclxuICAgICAgICAgIHsgdmFsdWU6IGZhbHNlLCBkaXNwbGF5VmFsdWU6ICfQndC10YInIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ2Rpc3BsYXlWYWx1ZSdcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXRTZWxlY3QpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0TW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXRTZWxlY3RNb2RlbDtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RNb2RlbC5vcHRpb25zLm1hbnVhbCkge1xyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZWxlY3RNb2RlbC5vcHRpb25zLml0ZW1zLFxyXG4gICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0J1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3Rvcnk/LlswXSkge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeU5hbWUgPSBzZWxlY3RNb2RlbC5vcHRpb25zLmRpcmVjdG9yeVswXTtcclxuXHJcbiAgICAgICAgY29sdW1uLmxvb2t1cCA9IHtcclxuICAgICAgICAgIC8vINCe0LHQvtGA0LDRh9C40LLQsNC10Lwg0LIgQ3VzdG9tU3RvcmUg0LTQu9GPINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDRgtC40L/QsNC8IERldkV4dHJlbWVcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBDdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgbG9hZDogKCkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLFxyXG4gICAgICAgICAgICBieUtleTogKGtleSkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLnRoZW4oaXRlbXMgPT4gaXRlbXMuZmluZChpID0+IGkudmFsdWUgPT09IGtleSkpXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5ncm91cHMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbmRJZHggPSB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmZpbmRJbmRleCh4ID0+IHggPT09IGNvbXBvbmVudC5zeXNOYW1lKTtcclxuXHJcbiAgICAgIGlmIChmaW5kSWR4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbHVtbi5ncm91cEluZGV4ID0gZmluZElkeFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQutGN0YhcclxuICAgIGlmICh0aGlzLl9sb29rdXBzQ2FjaGUuaGFzKGRpcmVjdG9yeU5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbG9va3Vwc0NhY2hlLmdldChkaXJlY3RvcnlOYW1lKSEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vINCX0LDQv9GA0LDRiNC40LLQsNC10Lwg0LTQsNC90L3Ri9C1ICjQuNGB0L/QvtC70YzQt9GD0LXQvCDRgtC+0YIg0LbQtSBvYmplY3RJZCwg0YfRgtC+INC4INCyINC80L7QtNCw0LvQutC1KVxyXG4gICAgLy8g0KPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4gb2JqZWN0SWQg0LTQvtGB0YLRg9C/0LXQvSDQsiDRjdGC0L7QvCDQutC+0LzQv9C+0L3QtdC90YLQtVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlZmVyZW5jZVNlcnZpY2UuZ2V0UmVmZXJlbmNlcyhkaXJlY3RvcnlOYW1lLCAodGhpcyBhcyBhbnkpLm9iamVjdElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gKHJlc3VsdD8ucm93cyB8fCBbXSkubWFwKChyb3c6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IHJvdy5hLFxyXG4gICAgICAgICAgICB0ZXh0OiByb3cuYlxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5fbG9va3Vwc0NhY2hlLnNldChkaXJlY3RvcnlOYW1lLCBpdGVtcyk7XHJcbiAgICAgICAgICByZXNvbHZlKGl0ZW1zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiByZXNvbHZlKFtdKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYnVpbGRUYWJsZVZhbHVlTW9kZWwoKTogVGFibGVWYWx1ZU1vZGVsIHtcclxuICAgIGNvbnN0IGdyb3VwZWREYXRhID0gdGhpcy5fYnVpbGRHcm91cGVkSXRlbXModGhpcy5fcm93cywgdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3VwcyB8fCBbXSwgMCk7XHJcbiAgICBjb25zdCB0b3RhbHMgPSB0aGlzLl9jYWxjdWxhdGVUb3RhbHModGhpcy5fcm93cyk7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtcclxuICAgICAgc3lzTmFtZTogdGhpcy5zZXR0aW5ncy5zeXNOYW1lLFxyXG4gICAgICB0eXBlOiB0aGlzLnNldHRpbmdzLnR5cGUsXHJcbiAgICAgIGRhdGE6IGdyb3VwZWREYXRhLFxyXG4gICAgICB0b3RhbHNcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLm1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkR3JvdXBlZEl0ZW1zKHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBGaWVsZHM6IHN0cmluZ1tdLCBsZXZlbDogbnVtYmVyKTogVGFibGVJdGVtW10ge1xyXG4gICAgaWYgKCFncm91cEZpZWxkcy5sZW5ndGggfHwgbGV2ZWwgPj0gZ3JvdXBGaWVsZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiByb3dzLm1hcChyb3cgPT4gKHsgLi4ucm93LCBpdGVtVHlwZTogcm93Lml0ZW1UeXBlID8/IFRhYmxlSXRlbVR5cGUuUm93IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cEZpZWxkID0gZ3JvdXBGaWVsZHNbbGV2ZWxdO1xyXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cFZhbHVlU3lzTmFtZTogc3RyaW5nIH0+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93LmRhdGEuZmluZCh4ID0+IHguc3lzTmFtZSA9PT0gZ3JvdXBGaWVsZCk/LnZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUpO1xyXG4gICAgICBjb25zdCBleGlzdGluZyA9IGdyb3Vwcy5nZXQoa2V5KSA/PyB7XHJcbiAgICAgICAgcm93czogW10sXHJcbiAgICAgICAgZ3JvdXBWYWx1ZVN5c05hbWU6IHRoaXMuX2dldEdyb3VwVmFsdWVTeXNOYW1lKGZpZWxkVmFsdWUsIGdyb3VwRmllbGQpXHJcbiAgICAgIH07XHJcbiAgICAgIGV4aXN0aW5nLnJvd3MucHVzaChyb3cpO1xyXG4gICAgICBncm91cHMuc2V0KGtleSwgZXhpc3RpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogVGFibGVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwSXRlbSBvZiBncm91cHMudmFsdWVzKCkpIHtcclxuICAgICAgY29uc3QgbmVzdGVkRGF0YSA9IHRoaXMuX2J1aWxkR3JvdXBlZEl0ZW1zKGdyb3VwSXRlbS5yb3dzLCBncm91cEZpZWxkcywgbGV2ZWwgKyAxKTtcclxuICAgICAgY29uc3QgZ3JvdXBNb2RlbDogVGFibGVHcm91cE1vZGVsID0ge1xyXG4gICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLkdyb3VwLFxyXG4gICAgICAgIGRhdGE6IG5lc3RlZERhdGEsXHJcbiAgICAgICAgdG90YWxzOiB0aGlzLl9jYWxjdWxhdGVUb3RhbHMoZ3JvdXBJdGVtLnJvd3MsIGdyb3VwSXRlbS5ncm91cFZhbHVlU3lzTmFtZSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlc3VsdC5wdXNoKGdyb3VwTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVUb3RhbHMocm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IENvbXBvbmVudFZhbHVlTW9kZWxbXSB7XHJcbiAgICBjb25zdCB0b3RhbENvbHVtbnMgPSB0aGlzLl9nZXRUb3RhbENvbHVtbnModGhpcy5zZXR0aW5ncy5jb21wb25lbnRzKTtcclxuXHJcbiAgICByZXR1cm4gdG90YWxDb2x1bW5zLm1hcChjb21wb25lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdW0gPSByb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy5kYXRhLmZpbmQoeCA9PiB4LnN5c05hbWUgPT09IGNvbXBvbmVudC5zeXNOYW1lKT8udmFsdWU7XHJcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1lcmljVmFsdWUpID8gYWNjICsgbnVtZXJpY1ZhbHVlIDogYWNjO1xyXG4gICAgICB9LCAwKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3lzTmFtZTogdGhpcy5fZ2V0VG90YWxTeXNOYW1lKGNvbXBvbmVudC5zeXNOYW1lLCBncm91cEZpZWxkU3lzTmFtZSksXHJcbiAgICAgICAgdHlwZTogY29tcG9uZW50LnR5cGUsXHJcbiAgICAgICAgdmFsdWVUeXBlOiBjb21wb25lbnQudmFsdWVUeXBlLFxyXG4gICAgICAgIHZhbHVlOiBzdW1cclxuICAgICAgfSBhcyBDb21wb25lbnRWYWx1ZU1vZGVsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbFN5c05hbWUoY29sdW1uU3lzTmFtZTogc3RyaW5nLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoZ3JvdXBGaWVsZFN5c05hbWUpIHtcclxuICAgICAgcmV0dXJuIGAke2NvbHVtblN5c05hbWV9XyR7Z3JvdXBGaWVsZFN5c05hbWV9X3RvdGFsYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7Y29sdW1uU3lzTmFtZX1fdG90YWxgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0R3JvdXBWYWx1ZVN5c05hbWUoZmllbGRWYWx1ZTogYW55LCBmYWxsYmFja1N5c05hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gZmllbGRWYWx1ZVswXTtcclxuICAgICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpcnN0VmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmlyc3RWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmllbGRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS5zeXNOYW1lID09PSAnc3RyaW5nJyAmJiBmaWVsZFZhbHVlLnN5c05hbWUpIHtcclxuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS5zeXNOYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKGZpZWxkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxsYmFja1N5c05hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pOiBJbnB1dE51bWJlck1vZGVsW10ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBJbnB1dE51bWJlck1vZGVsW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnB1dE51bWJlciAmJiB0aGlzLnNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2dldFRvdGFsQ29sdW1ucyhjb21wb25lbnQuY29tcG9uZW50cykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RSb3dzKGl0ZW1zOiBUYWJsZUl0ZW1bXSA9IFtdKTogVGFibGVSb3dNb2RlbFtdIHtcclxuICAgIGNvbnN0IHJvd3M6IFRhYmxlUm93TW9kZWxbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAodGhpcy5faXNSb3coaXRlbSkpIHtcclxuICAgICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLlJvd1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbSBhcyBUYWJsZUdyb3VwTW9kZWw7XHJcbiAgICAgICAgaWYgKGdyb3VwLmRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cy5wdXNoKC4uLnRoaXMuX2V4dHJhY3RSb3dzKGdyb3VwLmRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUm93KGl0ZW06IFRhYmxlSXRlbSk6IGl0ZW0gaXMgVGFibGVSb3dNb2RlbCB7XHJcbiAgICBjb25zdCBtYXliZVJvdyA9IGl0ZW0gYXMgVGFibGVSb3dNb2RlbDtcclxuICAgIHJldHVybiB0eXBlb2YgbWF5YmVSb3cuaWQgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobWF5YmVSb3cuZGF0YSk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoc2V0dGluZ3MpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGFibGUtY29udGVudCB3LTEwMFwiPlxyXG4gICAgQGlmIChzZXR0aW5ncy5vcHRpb25zLmxhYmVsKSB7XHJcbiAgICAgIDxtcngtbGFiZWxcclxuICAgICAgICBbcmVxdWlyZWRdPVwic2V0dGluZ3Mub3B0aW9ucy5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3Rvb2x0aXBdPVwic2V0dGluZ3Mub3B0aW9ucy50b29sdGlwIHx8ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHNldHRpbmdzLm9wdGlvbnMubGFiZWwgfX1cclxuICAgICAgPC9tcngtbGFiZWw+XHJcbiAgICB9XHJcblxyXG4gICAgPGR4LWRhdGEtZ3JpZFxyXG4gICAgICAjZGF0YUdyaWRcclxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBub0RhdGFUZXh0PVwi0J3QtdGCINC00LDQvdC90YvRhVwiXHJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxyXG4gICAgICBbd29yZFdyYXBFbmFibGVkXT1cInRydWVcIlxyXG4gICAgICBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIlxyXG4gICAgICBbY2xhc3Mubm9EYXRhXT1cImlzUmVkTm9EYXRhXCJcclxuICAgID5cclxuICAgICAgQGlmKCFkaXNhYmxlZCkge1xyXG4gICAgICAgIDxkeG8tdG9vbGJhcj5cclxuICAgICAgICAgIDxkeGktaXRlbSBsb2NhdGlvbj1cImFmdGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGUgY2xhc3M9XCJhZGQtcm93XCI+XHJcbiAgICAgICAgICAgICAgPG1yeC1idXR0b25cclxuICAgICAgICAgICAgICAgIFtzaXplXT1cIidtZWRpdW0nXCJcclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIidzZWNvbmRhcnknXCJcclxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc2VzXT1cIidtYi0zJ1wiXHJcbiAgICAgICAgICAgICAgICAobXJ4Q2xpY2spPVwiY3JlYXRlUm93KClcIlxyXG4gICAgICAgICAgICAgID57e3NldHRpbmdzLm9wdGlvbnMuYWRkQnRuVGl0bGV9fVxyXG4gICAgICAgICAgICAgIDwvbXJ4LWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2R4aS1pdGVtPlxyXG4gICAgICAgIDwvZHhvLXRvb2xiYXI+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZWRpdEJ1dHRvblRlbXBsYXRlJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1lZGl0IGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJlZGl0Um93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAoZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICA8ZHhvLXN1bW1hcnk+XHJcbiAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2Ygc2V0dGluZ3MuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcclxuICAgICAgICAgICAgQGlmICghZmlyc3QpIHtcclxuICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZHhpLXRvdGFsLWl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInswfVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgID48L2R4aS10b3RhbC1pdGVtPlxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICBAaWYgKGhhc0FueVRvdGFsKSB7IFxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nzc0NsYXNzXT1cIid0ZXh0LWJvbGQnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJzaG93VG90YWwoY29tcG9uZW50KSA/ICd7MH0nIDogJ9CY0KLQntCT0J4nXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3VtbWFyeVR5cGVdPVwic2hvd1RvdGFsKGNvbXBvbmVudCkgPyAnc3VtJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2R4by1zdW1tYXJ5PlxyXG4gICAgICB9XHJcbiAgICA8L2R4LWRhdGEtZ3JpZD5cclxuXHJcbiAgICBAaWYoISFzZXR0aW5ncy5vcHRpb25zLm1heFJvd3MpIHtcclxuICAgICAgPG1yeC1oaW50LWVycm9yLW1lc3NhZ2VcclxuICAgICAgICBtZXNzYWdlPVwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0YLRgNC+0Lo6IHt7IHNldHRpbmdzLm9wdGlvbnMubWF4Um93cyB9fVwiXHJcbiAgICAgICAgW21heFZhbHVlXT1cInNldHRpbmdzLm9wdGlvbnMubWF4Um93c1wiXHJcbiAgICAgICAgW3ZhbHVlXT1cInJvd3NDb3VudFwiXHJcbiAgICAgID48L21yeC1oaW50LWVycm9yLW1lc3NhZ2U+XHJcbiAgICB9XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNlZGl0VGVtcGxhdGUgbGV0LWNlbGxJbmZvPVwiY2VsbEluZm9cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA0cHhcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZWRpdCBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZWRpdFJvdyhjZWxsSW5mbylcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGNlbGxJbmZvKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG59XHJcblxyXG5cclxuIl19
|
|
458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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U0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUV6QixPQUFPO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLCBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFR5cGUsIERhdGVUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC1mb3JtL2VudW1zJztcclxuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudE1vZGVsQmFzZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlZC1mb3JtL21vZGVscyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudFZhbHVlTW9kZWwsXHJcbiAgU2VjdGlvblZhbHVlTW9kZWwsXHJcbiAgVGFibGVHcm91cE1vZGVsLFxyXG4gIFRhYmxlSXRlbSxcclxuICBUYWJsZUl0ZW1UeXBlLFxyXG4gIFRhYmxlUm93TW9kZWwsXHJcbiAgVGFibGVWYWx1ZU1vZGVsXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgSW5wdXREYXRlTW9kZWwsIElucHV0TnVtYmVyTW9kZWwsIElucHV0U2VsZWN0TW9kZWwsIElucHV0VGFibGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9lbGVtZXRzL2lucHV0cyc7XHJcbmltcG9ydCB7IG9iamVjdEZvcm1BY3Rpb25zLCBvYmplY3RGb3JtU2VsZWN0b3JzIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3RvcmUnO1xyXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICdAbXlydGV4LW9yZy91aSc7XHJcbmltcG9ydCB7IElucHV0VGFibGVNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IGdldFJvd01vZGVsIH0gZnJvbSAnLi9oZWxwZXJzL2dldC1yb3ctbW9kZWwuaGVscGVyJztcclxuaW1wb3J0IHsgQ29sdW1uTW9kZWwgfSBmcm9tICcuL21vZGVscy9jb2x1bW4ubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWZlcmVuY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvcmVmZXJlbmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgQ3VzdG9tU3RvcmUgZnJvbSAnZGV2ZXh0cmVtZS9kYXRhL2N1c3RvbV9zdG9yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1pbnB1dC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbnB1dC10YWJsZS5jb21wb25lbnQubGVzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbnB1dFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHR5cGUgPSBDb21wb25lbnRUeXBlLklucHV0VGFibGU7XHJcblxyXG4gIHByaXZhdGUgX3JlZmVyZW5jZVNlcnZpY2U6IFJlZmVyZW5jZVNlcnZpY2UgPSBpbmplY3QoUmVmZXJlbmNlU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX2xvb2t1cHNDYWNoZTogTWFwPHN0cmluZywgYW55W10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwcml2YXRlIF9zdG9yZTogU3RvcmUgPSBpbmplY3QoU3RvcmUpO1xyXG4gIHByaXZhdGUgX2RldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UgPSBpbmplY3QoTW9kYWxTZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2hhbmdlU3ViamVjdCQ6IFN1YmplY3Q8VGFibGVWYWx1ZU1vZGVsPiA9IG5ldyBTdWJqZWN0PFRhYmxlVmFsdWVNb2RlbD4oKTtcclxuICBwcml2YXRlIF9zdWJzY3JpcHRpb25zJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNDaGVja1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2FuRWRpdE9iamVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3Jvd3M6IFRhYmxlUm93TW9kZWxbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgbW9kZWwhOiBUYWJsZVZhbHVlTW9kZWw7XHJcbiAgcHVibGljIHNldHRpbmdzITogSW5wdXRUYWJsZU1vZGVsO1xyXG4gIHB1YmxpYyBkYXRhU291cmNlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9W10gPSBbXTtcclxuICBwdWJsaWMgY29sdW1uczogQ29sdW1uTW9kZWxbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSB2YWx1ZXM6IFNlY3Rpb25WYWx1ZU1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGEoc2V0dGluZ3M6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzIGFzIElucHV0VGFibGVNb2RlbDtcclxuXHJcbiAgICB0aGlzLm1vZGVsID0ge3N5c05hbWU6IHNldHRpbmdzLnN5c05hbWUsIHR5cGU6IHNldHRpbmdzLnR5cGUsIGRhdGE6IFtdLCB0b3RhbHM6IFtdfTtcclxuICAgIHRoaXMuX3Jvd3MgPSBbXTtcclxuXHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgdGhpcy5faW5pdENvbHVtbnModGhpcy5zZXR0aW5ncy5jb21wb25lbnRzKTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RhdGFHcmlkJywge3N0YXRpYzogZmFsc2V9KSBkYXRhR3JpZCE6IER4RGF0YUdyaWRDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgnZWRpdFRlbXBsYXRlJywge3N0YXRpYzogZmFsc2V9KSBlZGl0VGVtcGxhdGUhOiBhbnk7XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlZDogRXZlbnRFbWl0dGVyPENvbXBvbmVudFZhbHVlTW9kZWwgfCBDb21wb25lbnRWYWx1ZU1vZGVsW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wb25lbnRWYWx1ZU1vZGVsIHwgQ29tcG9uZW50VmFsdWVNb2RlbFtdPigpO1xyXG5cclxuICBwdWJsaWMgZ2V0IHJvd3NDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jvd3MubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzQW55VG90YWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5jb21wb25lbnRzLnNvbWUoYyA9PlxyXG4gICAgICB0aGlzLnNob3dUb3RhbChjKSB8fCBjLmNvbXBvbmVudHM/LnNvbWUoaW5uZXIgPT4gdGhpcy5zaG93VG90YWwoaW5uZXIpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1JlZE5vRGF0YSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0NoZWNrUmVxdWlyZWQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2luaXRNb2RlbCgpO1xyXG5cclxuICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLnBpcGUoXHJcbiAgICAgIGRlYm91bmNlVGltZSg3MDApLFxyXG4gICAgKS5zdWJzY3JpYmUobW9kZWwgPT4ge1xyXG4gICAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChvYmplY3RGb3JtQWN0aW9ucy51cGRhdGVWYWx1ZXMoe3ZhbHVlOiBtb2RlbH0pKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0SXNDaGVja1JlcXVpcmVkKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgdGhpcy5faXNDaGVja1JlcXVpcmVkID0gcmVzdWx0O1xyXG4gICAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaCh0aGlzLl9zdG9yZS5zZWxlY3Qob2JqZWN0Rm9ybVNlbGVjdG9ycy5zZWxlY3RDYW5FZGl0T2JqZWN0KVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgdGhpcy5fY2FuRWRpdE9iamVjdCA9IHJlc3VsdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3M/LmNvbXBvbmVudHMpIHtcclxuICAgICAgICAgIHRoaXMuX2luaXRDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdFZhbHVlTW9kZWwodGhpcy5zZXR0aW5ncykpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogQ29tcG9uZW50VmFsdWVNb2RlbCB8IG51bGwgfCAoQ29tcG9uZW50VmFsdWVNb2RlbCB8IG51bGwpW10pID0+IHtcclxuICAgICAgICBjb25zdCBjbG9uZVJlc3VsdCA9IHN0cnVjdHVyZWRDbG9uZShyZXN1bHQgYXMgVGFibGVWYWx1ZU1vZGVsIHwgbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChjbG9uZVJlc3VsdCAmJiAhQXJyYXkuaXNBcnJheShjbG9uZVJlc3VsdCkgJiYgdGhpcy5tb2RlbC5kYXRhICE9PSBjbG9uZVJlc3VsdC5kYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLm1vZGVsID0gc3RydWN0dXJlZENsb25lKGNsb25lUmVzdWx0KTtcclxuICAgICAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9leHRyYWN0Um93cyh0aGlzLm1vZGVsLmRhdGEpO1xyXG4gICAgICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVSb3coKSB7XHJcbiAgICBjb25zdCBpbml0aWFsUm93TW9kZWwgPSBnZXRSb3dNb2RlbCh0aGlzLnNldHRpbmdzKTtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gQ3JlYXRlIFJvd10g0JjRgdGF0L7QtNC90LDRjyDQvNC+0LTQtdC70Ywg0LTQu9GPINC90L7QstC+0Lkg0YHRgtGA0L7QutC4OicsIHN0cnVjdHVyZWRDbG9uZShpbml0aWFsUm93TW9kZWwpKTtcclxuXHJcbiAgICB0aGlzLl9tb2RhbFNlcnZpY2Uub3BlbihJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQsIHtcclxuICAgICAgdGl0bGU6ICfQodC+0LfQtNCw0L3QuNC1INGB0YLRgNC+0LrQuCcsXHJcbiAgICAgIG9rVGV4dDogJ9Ch0L7Qt9C00LDRgtGMJyxcclxuICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXHJcbiAgICAgIHJvd01vZGVsOiBnZXRSb3dNb2RlbCh0aGlzLnNldHRpbmdzKSxcclxuICAgICAgaXNDaGVja1JlcXVpcmVkOiB0aGlzLl9pc0NoZWNrUmVxdWlyZWRcclxuICAgIH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc29sdmUgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnW1RhYmxlIDwtIE1vZGFsIENsb3NlZCAoQ3JlYXRlKV0g0KDQtdC30YPQu9GM0YLQsNGCINC40Lcg0LzQvtC00LDQu9C60Lg6Jywgc3RydWN0dXJlZENsb25lKHJlc29sdmUpKTtcclxuXHJcbiAgICAgIGlmIChyZXNvbHZlLnJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuX3Jvd3MgPSBbLi4uc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpLCByZXNvbHZlLnJvd01vZGVsXTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLm5leHQodGhpcy5fYnVpbGRUYWJsZVZhbHVlTW9kZWwoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVJvdyhldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmaW5kUm93ID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgIGlmIChmaW5kUm93KSB7XHJcbiAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9yb3dzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuXHJcbiAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5fY2FuRWRpdE9iamVjdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0Um93KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbmRSb3cgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IEVkaXQgUm93XSDQlNCw0L3QvdGL0LUg0YHRgtGA0L7QutC4INC40Lcg0LrQu9C40LrQsCAoZXZlbnQucm93LmRhdGEpOicsIGV2ZW50LnJvdy5kYXRhKTtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gRWRpdCBSb3ddINCd0LDQudC00LXQvdC+INCyINC70L7QutCw0LvRjNC90L7QvCByb3dzOicsIHN0cnVjdHVyZWRDbG9uZShmaW5kUm93KSk7XHJcbiAgICAvLyBjb25zdCBmaW5kUm93OiBUYWJsZVJvd01vZGVsIHwgdW5kZWZpbmVkID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgIGlmIChmaW5kUm93KSB7XHJcbiAgICAgIGNvbnN0IHJvd01vZGVsQ2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUoZmluZFJvdyk7XHJcblxyXG4gICAgICB0aGlzLl9tb2RhbFNlcnZpY2Uub3BlbihJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQsIHtcclxuICAgICAgICB0aXRsZTogJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUg0YHRgtGA0L7QutC4JyxcclxuICAgICAgICBva1RleHQ6ICfQodC+0YXRgNCw0L3QuNGC0YwnLFxyXG4gICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxyXG4gICAgICAgIHJvd01vZGVsOiByb3dNb2RlbENsb25lXHJcbiAgICAgIH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVGFibGUgPC0gTW9kYWwgQ2xvc2VkIChFZGl0KV0g0KDQtdC30YPQu9GM0YLQsNGCINC40Lcg0LzQvtC00LDQu9C60Lg6Jywgc3RydWN0dXJlZENsb25lKHJlc29sdmUpKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc29sdmUucmVzdWx0KSB7XHJcbiAgICAgICAgICBjb25zdCBjbG9uZVJvd3MgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fcm93cyk7XHJcbiAgICAgICAgICBjb25zdCBlZGl0YWJsZVJvdyA9IGNsb25lUm93cy5maW5kKHJvdyA9PiByb3cuaWQgPT09IHJlc29sdmUucm93TW9kZWwuaWQpO1xyXG5cclxuICAgICAgICAgIGlmIChlZGl0YWJsZVJvdykge1xyXG4gICAgICAgICAgICBlZGl0YWJsZVJvdy5kYXRhID0gcmVzb2x2ZS5yb3dNb2RlbC5kYXRhO1xyXG4gICAgICAgICAgICB0aGlzLl9yb3dzID0gY2xvbmVSb3dzO1xyXG4gICAgICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEZvcm1hdChjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXREYXRlOlxyXG4gICAgICAgIHN3aXRjaCAoKGNvbXBvbmVudCBhcyBJbnB1dERhdGVNb2RlbCkub3B0aW9ucy52aWV3VHlwZSkge1xyXG4gICAgICAgICAgY2FzZSBEYXRlVHlwZUVudW0uRGF0ZVRpbWU6XHJcbiAgICAgICAgICAgIHJldHVybiAnZGQuTU0ueXl5eSBoaDptbSc7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gJ2RkLk1NLnl5eXknO1xyXG4gICAgICAgIH1cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RGF0YVR5cGUoY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSBDb21wb25lbnRUeXBlLklucHV0RGF0ZTpcclxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXRTd2l0Y2g6XHJcbiAgICAgICAgcmV0dXJuICdib29sZWFuJ1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93VG90YWwoY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBib29sZWFuIHtcclxuICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnB1dE51bWJlcikge1xyXG4gICAgICBjb25zdCBlbGVtZW50OiBJbnB1dE51bWJlck1vZGVsID0gY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWw7XHJcblxyXG4gICAgICByZXR1cm4gZWxlbWVudC5vcHRpb25zLmluVG90YWxzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1RvdGFsQ29sdW1uKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBJbnB1dE51bWJlck1vZGVsKS5vcHRpb25zLmluVG90YWxzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdE1vZGVsKCkge1xyXG4gICAgdGhpcy5tb2RlbCA9IHtcclxuICAgICAgc3lzTmFtZTogdGhpcy5zZXR0aW5ncy5zeXNOYW1lLFxyXG4gICAgICB0eXBlOiB0aGlzLnNldHRpbmdzLnR5cGUsXHJcbiAgICAgIGRhdGE6IFtdLFxyXG4gICAgICB0b3RhbHM6IFtdXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fcm93cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdERhdGFTb3VyY2UoZGF0YTogVGFibGVSb3dNb2RlbFtdKSB7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9pbml0RGF0YVNvdXJjZV0g0J/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSByb3dzINCyIGRhdGFTb3VyY2Ug0YLQsNCx0LvQuNGG0YsuINCY0YHRhdC+0LTQvdGL0Lkgcm93czonLCBzdHJ1Y3R1cmVkQ2xvbmUoZGF0YSkpO1xyXG5cclxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGEubWFwKChpdGVtOiBUYWJsZVJvd01vZGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0RhdGFJdGVtOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgIGZvciAobGV0IGkgaW4gaXRlbS5kYXRhKSB7XHJcbiAgICAgICAgbmV3RGF0YUl0ZW1baXRlbS5kYXRhW2ldLnN5c05hbWVdID0gaXRlbS5kYXRhW2ldLnZhbHVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXdEYXRhSXRlbS5pZCA9IGl0ZW0uaWQ7XHJcblxyXG4gICAgICByZXR1cm4gbmV3RGF0YUl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9pbml0RGF0YVNvdXJjZV0g0JjRgtC+0LPQvtCy0YvQuSBkYXRhU291cmNlINC00LvRjyBEZXZFeHRyZW1lOicsIHN0cnVjdHVyZWRDbG9uZSh0aGlzLmRhdGFTb3VyY2UpKTtcclxuXHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pIHtcclxuICAgIHRoaXMuY29sdW1ucyA9IGNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpO1xyXG5cclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgY2FwdGlvbjogJycsXHJcbiAgICAgICAgdHlwZTogJ2J1dHRvbnMnLFxyXG4gICAgICAgIHdpZHRoOiA4MCxcclxuICAgICAgICBjc3NDbGFzczogJ2N1c3RvbS1jZWxsLWNvbnRyb2xzJyxcclxuICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZWRpdEJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnLFxyXG4gICAgICAgICAgICBoaW50OiAn0KPQtNCw0LvQuNGC0YwnLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy5kYXRhR3JpZC5pbnN0YW5jZS5yZXBhaW50KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9kZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cmFuc2Zvcm1Db2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBDb2x1bW5Nb2RlbCB7XHJcbiAgICBjb25zdCBkYXRhVHlwZSA9IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KTtcclxuXHJcbiAgICBjb25zdCBjb2x1bW46IENvbHVtbk1vZGVsID0ge1xyXG4gICAgICBjYXB0aW9uOiBjb21wb25lbnQub3B0aW9ucy5sYWJlbCB8fCAnJyxcclxuICAgICAgY29sdW1uczogY29tcG9uZW50LmNvbXBvbmVudHMubWFwKGMgPT4gdGhpcy5fdHJhbnNmb3JtQ29sdW1uKHN0cnVjdHVyZWRDbG9uZShjKSkpLFxyXG4gICAgICBkYXRhRmllbGQ6IGNvbXBvbmVudC5zeXNOYW1lLFxyXG4gICAgICBkYXRhVHlwZTogdGhpcy5nZXREYXRhVHlwZShjb21wb25lbnQpLFxyXG4gICAgICBmb3JtYXQ6IHRoaXMuZ2V0Rm9ybWF0KGNvbXBvbmVudCksXHJcbiAgICAgIG1pbldpZHRoOiAxNjBcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXREYXRlICYmIChjb21wb25lbnQgYXMgSW5wdXREYXRlTW9kZWwpLm9wdGlvbnMucmFuZ2UpIHtcclxuICAgICAgY29sdW1uLmNhbGN1bGF0ZUNlbGxWYWx1ZSA9IChyb3dEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSByb3dEYXRhW2NvbXBvbmVudC5zeXNOYW1lXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRlUmFuZ2UpICYmIGRhdGVSYW5nZS5sZW5ndGggPT09IDIpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZVN0cjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICcnO1xyXG4gICAgICAgICAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XHJcbiAgICAgICAgICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHJldHVybiAnJztcclxuICAgICAgICAgICAgY29uc3QgZGF5ID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCBtb250aCA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7ZGF5fS4ke21vbnRofS4ke3llYXJ9YDtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29uc3Qgc3RhcnRGb3JtYXR0ZWQgPSBmb3JtYXREYXRlKGRhdGVSYW5nZVswXSk7XHJcbiAgICAgICAgICBjb25zdCBlbmRGb3JtYXR0ZWQgPSBmb3JtYXREYXRlKGRhdGVSYW5nZVsxXSk7XHJcblxyXG4gICAgICAgICAgaWYgKHN0YXJ0Rm9ybWF0dGVkICYmIGVuZEZvcm1hdHRlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYCR7c3RhcnRGb3JtYXR0ZWR9IOKAlCAke2VuZEZvcm1hdHRlZH1gO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHN0YXJ0Rm9ybWF0dGVkIHx8IGVuZEZvcm1hdHRlZCB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGRhdGVSYW5nZSB8fCAnJztcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YVR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICBjb2x1bW4uY2FsY3VsYXRlQ2VsbFZhbHVlID0gKHJvd0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgLy8g0JXRgdC70LggdHJ1ZSDigJQg0JTQsCwg0LXRgdC70LggZmFsc2UsIFwiXCIg0LjQu9C4IG51bGwg4oCUINCd0LXRglxyXG4gICAgICAgIHJldHVybiAhIXZhbHVlOyBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgZGF0YVNvdXJjZTogW1xyXG4gICAgICAgICAgeyB2YWx1ZTogdHJ1ZSwgZGlzcGxheVZhbHVlOiAn0JTQsCcgfSxcclxuICAgICAgICAgIHsgdmFsdWU6IGZhbHNlLCBkaXNwbGF5VmFsdWU6ICfQndC10YInIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICBkaXNwbGF5RXhwcjogJ2Rpc3BsYXlWYWx1ZSdcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXRTZWxlY3QpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0TW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXRTZWxlY3RNb2RlbDtcclxuXHJcbiAgICAgIGlmIChzZWxlY3RNb2RlbC5vcHRpb25zLm1hbnVhbCkge1xyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICBkYXRhU291cmNlOiBzZWxlY3RNb2RlbC5vcHRpb25zLml0ZW1zLFxyXG4gICAgICAgICAgdmFsdWVFeHByOiAndmFsdWUnLFxyXG4gICAgICAgICAgZGlzcGxheUV4cHI6ICd0ZXh0J1xyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3Rvcnk/LlswXSkge1xyXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yeU5hbWUgPSBzZWxlY3RNb2RlbC5vcHRpb25zLmRpcmVjdG9yeVswXTtcclxuXHJcbiAgICAgICAgY29sdW1uLmxvb2t1cCA9IHtcclxuICAgICAgICAgIC8vINCe0LHQvtGA0LDRh9C40LLQsNC10Lwg0LIgQ3VzdG9tU3RvcmUg0LTQu9GPINGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDRgtC40L/QsNC8IERldkV4dHJlbWVcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IG5ldyBDdXN0b21TdG9yZSh7XHJcbiAgICAgICAgICAgIGtleTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgbG9hZDogKCkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLFxyXG4gICAgICAgICAgICBieUtleTogKGtleSkgPT4gdGhpcy5nZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWUpLnRoZW4oaXRlbXMgPT4gaXRlbXMuZmluZChpID0+IGkudmFsdWUgPT09IGtleSkpXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5ncm91cHMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGZpbmRJZHggPSB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmZpbmRJbmRleCh4ID0+IHggPT09IGNvbXBvbmVudC5zeXNOYW1lKTtcclxuXHJcbiAgICAgIGlmIChmaW5kSWR4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbHVtbi5ncm91cEluZGV4ID0gZmluZElkeFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMb29rdXBEYXRhKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCDQutGN0YhcclxuICAgIGlmICh0aGlzLl9sb29rdXBzQ2FjaGUuaGFzKGRpcmVjdG9yeU5hbWUpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbG9va3Vwc0NhY2hlLmdldChkaXJlY3RvcnlOYW1lKSEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vINCX0LDQv9GA0LDRiNC40LLQsNC10Lwg0LTQsNC90L3Ri9C1ICjQuNGB0L/QvtC70YzQt9GD0LXQvCDRgtC+0YIg0LbQtSBvYmplY3RJZCwg0YfRgtC+INC4INCyINC80L7QtNCw0LvQutC1KVxyXG4gICAgLy8g0KPQsdC10LTQuNGC0LXRgdGMLCDRh9GC0L4gb2JqZWN0SWQg0LTQvtGB0YLRg9C/0LXQvSDQsiDRjdGC0L7QvCDQutC+0LzQv9C+0L3QtdC90YLQtVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIHRoaXMuX3JlZmVyZW5jZVNlcnZpY2UuZ2V0UmVmZXJlbmNlcyhkaXJlY3RvcnlOYW1lLCAodGhpcyBhcyBhbnkpLm9iamVjdElkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gKHJlc3VsdD8ucm93cyB8fCBbXSkubWFwKChyb3c6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgdmFsdWU6IHJvdy5hLFxyXG4gICAgICAgICAgICB0ZXh0OiByb3cuYlxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgdGhpcy5fbG9va3Vwc0NhY2hlLnNldChkaXJlY3RvcnlOYW1lLCBpdGVtcyk7XHJcbiAgICAgICAgICByZXNvbHZlKGl0ZW1zKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiByZXNvbHZlKFtdKVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYnVpbGRUYWJsZVZhbHVlTW9kZWwoKTogVGFibGVWYWx1ZU1vZGVsIHtcclxuICAgIGNvbnN0IGdyb3VwZWREYXRhID0gdGhpcy5fYnVpbGRHcm91cGVkSXRlbXModGhpcy5fcm93cywgdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3VwcyB8fCBbXSwgMCk7XHJcbiAgICBjb25zdCB0b3RhbHMgPSB0aGlzLl9jYWxjdWxhdGVUb3RhbHModGhpcy5fcm93cyk7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtcclxuICAgICAgc3lzTmFtZTogdGhpcy5zZXR0aW5ncy5zeXNOYW1lLFxyXG4gICAgICB0eXBlOiB0aGlzLnNldHRpbmdzLnR5cGUsXHJcbiAgICAgIGRhdGE6IGdyb3VwZWREYXRhLFxyXG4gICAgICB0b3RhbHNcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLm1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkR3JvdXBlZEl0ZW1zKHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBGaWVsZHM6IHN0cmluZ1tdLCBsZXZlbDogbnVtYmVyKTogVGFibGVJdGVtW10ge1xyXG4gICAgaWYgKCFncm91cEZpZWxkcy5sZW5ndGggfHwgbGV2ZWwgPj0gZ3JvdXBGaWVsZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiByb3dzLm1hcChyb3cgPT4gKHsgLi4ucm93LCBpdGVtVHlwZTogcm93Lml0ZW1UeXBlID8/IFRhYmxlSXRlbVR5cGUuUm93IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cEZpZWxkID0gZ3JvdXBGaWVsZHNbbGV2ZWxdO1xyXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cFZhbHVlU3lzTmFtZTogc3RyaW5nIH0+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93LmRhdGEuZmluZCh4ID0+IHguc3lzTmFtZSA9PT0gZ3JvdXBGaWVsZCk/LnZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUpO1xyXG4gICAgICBjb25zdCBleGlzdGluZyA9IGdyb3Vwcy5nZXQoa2V5KSA/PyB7XHJcbiAgICAgICAgcm93czogW10sXHJcbiAgICAgICAgZ3JvdXBWYWx1ZVN5c05hbWU6IHRoaXMuX2dldEdyb3VwVmFsdWVTeXNOYW1lKGZpZWxkVmFsdWUsIGdyb3VwRmllbGQpXHJcbiAgICAgIH07XHJcbiAgICAgIGV4aXN0aW5nLnJvd3MucHVzaChyb3cpO1xyXG4gICAgICBncm91cHMuc2V0KGtleSwgZXhpc3RpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogVGFibGVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwSXRlbSBvZiBncm91cHMudmFsdWVzKCkpIHtcclxuICAgICAgY29uc3QgbmVzdGVkRGF0YSA9IHRoaXMuX2J1aWxkR3JvdXBlZEl0ZW1zKGdyb3VwSXRlbS5yb3dzLCBncm91cEZpZWxkcywgbGV2ZWwgKyAxKTtcclxuICAgICAgY29uc3QgZ3JvdXBNb2RlbDogVGFibGVHcm91cE1vZGVsID0ge1xyXG4gICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLkdyb3VwLFxyXG4gICAgICAgIGRhdGE6IG5lc3RlZERhdGEsXHJcbiAgICAgICAgdG90YWxzOiB0aGlzLl9jYWxjdWxhdGVUb3RhbHMoZ3JvdXBJdGVtLnJvd3MsIGdyb3VwSXRlbS5ncm91cFZhbHVlU3lzTmFtZSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlc3VsdC5wdXNoKGdyb3VwTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVUb3RhbHMocm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IENvbXBvbmVudFZhbHVlTW9kZWxbXSB7XHJcbiAgICBjb25zdCB0b3RhbENvbHVtbnMgPSB0aGlzLl9nZXRUb3RhbENvbHVtbnModGhpcy5zZXR0aW5ncy5jb21wb25lbnRzKTtcclxuXHJcbiAgICByZXR1cm4gdG90YWxDb2x1bW5zLm1hcChjb21wb25lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdW0gPSByb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy5kYXRhLmZpbmQoeCA9PiB4LnN5c05hbWUgPT09IGNvbXBvbmVudC5zeXNOYW1lKT8udmFsdWU7XHJcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1lcmljVmFsdWUpID8gYWNjICsgbnVtZXJpY1ZhbHVlIDogYWNjO1xyXG4gICAgICB9LCAwKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3lzTmFtZTogdGhpcy5fZ2V0VG90YWxTeXNOYW1lKGNvbXBvbmVudC5zeXNOYW1lLCBncm91cEZpZWxkU3lzTmFtZSksXHJcbiAgICAgICAgdHlwZTogY29tcG9uZW50LnR5cGUsXHJcbiAgICAgICAgdmFsdWVUeXBlOiBjb21wb25lbnQudmFsdWVUeXBlLFxyXG4gICAgICAgIHZhbHVlOiBzdW1cclxuICAgICAgfSBhcyBDb21wb25lbnRWYWx1ZU1vZGVsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbFN5c05hbWUoY29sdW1uU3lzTmFtZTogc3RyaW5nLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoZ3JvdXBGaWVsZFN5c05hbWUpIHtcclxuICAgICAgcmV0dXJuIGAke2NvbHVtblN5c05hbWV9XyR7Z3JvdXBGaWVsZFN5c05hbWV9X3RvdGFsYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7Y29sdW1uU3lzTmFtZX1fdG90YWxgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0R3JvdXBWYWx1ZVN5c05hbWUoZmllbGRWYWx1ZTogYW55LCBmYWxsYmFja1N5c05hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gZmllbGRWYWx1ZVswXTtcclxuICAgICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpcnN0VmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmlyc3RWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmllbGRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS5zeXNOYW1lID09PSAnc3RyaW5nJyAmJiBmaWVsZFZhbHVlLnN5c05hbWUpIHtcclxuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS5zeXNOYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKGZpZWxkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxsYmFja1N5c05hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pOiBJbnB1dE51bWJlck1vZGVsW10ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBJbnB1dE51bWJlck1vZGVsW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnB1dE51bWJlciAmJiB0aGlzLnNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2dldFRvdGFsQ29sdW1ucyhjb21wb25lbnQuY29tcG9uZW50cykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RSb3dzKGl0ZW1zOiBUYWJsZUl0ZW1bXSA9IFtdKTogVGFibGVSb3dNb2RlbFtdIHtcclxuICAgIGNvbnN0IHJvd3M6IFRhYmxlUm93TW9kZWxbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAodGhpcy5faXNSb3coaXRlbSkpIHtcclxuICAgICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLlJvd1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbSBhcyBUYWJsZUdyb3VwTW9kZWw7XHJcbiAgICAgICAgaWYgKGdyb3VwLmRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cy5wdXNoKC4uLnRoaXMuX2V4dHJhY3RSb3dzKGdyb3VwLmRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUm93KGl0ZW06IFRhYmxlSXRlbSk6IGl0ZW0gaXMgVGFibGVSb3dNb2RlbCB7XHJcbiAgICBjb25zdCBtYXliZVJvdyA9IGl0ZW0gYXMgVGFibGVSb3dNb2RlbDtcclxuICAgIHJldHVybiB0eXBlb2YgbWF5YmVSb3cuaWQgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobWF5YmVSb3cuZGF0YSk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoc2V0dGluZ3MpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGFibGUtY29udGVudCB3LTEwMFwiPlxyXG4gICAgQGlmIChzZXR0aW5ncy5vcHRpb25zLmxhYmVsKSB7XHJcbiAgICAgIDxtcngtbGFiZWxcclxuICAgICAgICBbcmVxdWlyZWRdPVwic2V0dGluZ3Mub3B0aW9ucy5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3Rvb2x0aXBdPVwic2V0dGluZ3Mub3B0aW9ucy50b29sdGlwIHx8ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHNldHRpbmdzLm9wdGlvbnMubGFiZWwgfX1cclxuICAgICAgPC9tcngtbGFiZWw+XHJcbiAgICB9XHJcblxyXG4gICAgPGR4LWRhdGEtZ3JpZFxyXG4gICAgICAjZGF0YUdyaWRcclxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBub0RhdGFUZXh0PVwi0J3QtdGCINC00LDQvdC90YvRhVwiXHJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxyXG4gICAgICBbd29yZFdyYXBFbmFibGVkXT1cInRydWVcIlxyXG4gICAgICBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIlxyXG4gICAgICBbY2xhc3Mubm9EYXRhXT1cImlzUmVkTm9EYXRhXCJcclxuICAgID5cclxuICAgICAgQGlmKCFkaXNhYmxlZCkge1xyXG4gICAgICAgIDxkeG8tdG9vbGJhcj5cclxuICAgICAgICAgIDxkeGktaXRlbSBsb2NhdGlvbj1cImFmdGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGUgY2xhc3M9XCJhZGQtcm93XCI+XHJcbiAgICAgICAgICAgICAgPG1yeC1idXR0b25cclxuICAgICAgICAgICAgICAgIFtzaXplXT1cIidtZWRpdW0nXCJcclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIidzZWNvbmRhcnknXCJcclxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc2VzXT1cIidtYi0zJ1wiXHJcbiAgICAgICAgICAgICAgICAobXJ4Q2xpY2spPVwiY3JlYXRlUm93KClcIlxyXG4gICAgICAgICAgICAgID57e3NldHRpbmdzLm9wdGlvbnMuYWRkQnRuVGl0bGV9fVxyXG4gICAgICAgICAgICAgIDwvbXJ4LWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2R4aS1pdGVtPlxyXG4gICAgICAgIDwvZHhvLXRvb2xiYXI+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZWRpdEJ1dHRvblRlbXBsYXRlJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1lZGl0IGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJlZGl0Um93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAoZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICA8ZHhvLXN1bW1hcnk+XHJcbiAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2Ygc2V0dGluZ3MuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcclxuICAgICAgICAgICAgQGlmICghZmlyc3QpIHtcclxuICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZHhpLXRvdGFsLWl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInswfVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgID48L2R4aS10b3RhbC1pdGVtPlxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICBAaWYgKGhhc0FueVRvdGFsKSB7IFxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nzc0NsYXNzXT1cIid0ZXh0LWJvbGQnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJzaG93VG90YWwoY29tcG9uZW50KSA/ICd7MH0nIDogJ9CY0KLQntCT0J4nXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3VtbWFyeVR5cGVdPVwic2hvd1RvdGFsKGNvbXBvbmVudCkgPyAnc3VtJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2R4by1zdW1tYXJ5PlxyXG4gICAgICB9XHJcbiAgICA8L2R4LWRhdGEtZ3JpZD5cclxuXHJcbiAgICBAaWYoISFzZXR0aW5ncy5vcHRpb25zLm1heFJvd3MpIHtcclxuICAgICAgPG1yeC1oaW50LWVycm9yLW1lc3NhZ2VcclxuICAgICAgICBtZXNzYWdlPVwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0YLRgNC+0Lo6IHt7IHNldHRpbmdzLm9wdGlvbnMubWF4Um93cyB9fVwiXHJcbiAgICAgICAgW21heFZhbHVlXT1cInNldHRpbmdzLm9wdGlvbnMubWF4Um93c1wiXHJcbiAgICAgICAgW3ZhbHVlXT1cInJvd3NDb3VudFwiXHJcbiAgICAgID48L21yeC1oaW50LWVycm9yLW1lc3NhZ2U+XHJcbiAgICB9XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNlZGl0VGVtcGxhdGUgbGV0LWNlbGxJbmZvPVwiY2VsbEluZm9cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA0cHhcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZWRpdCBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZWRpdFJvdyhjZWxsSW5mbylcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGNlbGxJbmZvKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG59XHJcblxyXG5cclxuIl19
|
|
@@ -17,7 +17,7 @@ import { AutoSaveStore, ToasterType, LabelModule, ModalServiceComponent, MODAL_D
|
|
|
17
17
|
import { HttpHeaders, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
18
18
|
import * as i2$1 from '@myrtex-org/templates';
|
|
19
19
|
import { FormHeaderModule, MenuAdminModule } from '@myrtex-org/templates';
|
|
20
|
-
import { cloneDeep
|
|
20
|
+
import { cloneDeep } from 'lodash-es';
|
|
21
21
|
import * as i2$2 from '@angular/forms';
|
|
22
22
|
import { FormsModule } from '@angular/forms';
|
|
23
23
|
import { provideNgxMask } from 'ngx-mask';
|
|
@@ -1731,6 +1731,7 @@ class InputDateComponent extends BaseFieldComponent {
|
|
|
1731
1731
|
return this.settings.options.viewType === DateTypeEnum.DateTime;
|
|
1732
1732
|
}
|
|
1733
1733
|
updateValue(event) {
|
|
1734
|
+
console.log(`[DateComponent -> updateValue] [sysName: ${this.settings.sysName}] Событие от UI элемента:`, event);
|
|
1734
1735
|
if (this._isInit) {
|
|
1735
1736
|
this._isUpdatingInternal = true; // Блокируем внешние обновления на время ввода
|
|
1736
1737
|
if (this.settings.options.range) {
|
|
@@ -1752,6 +1753,7 @@ class InputDateComponent extends BaseFieldComponent {
|
|
|
1752
1753
|
this.dateModel = event.value;
|
|
1753
1754
|
this.model.value = event.value;
|
|
1754
1755
|
}
|
|
1756
|
+
console.log(`[DateComponent -> updateValue] Сформирован вызов dispatchModify. Отправляемое значение:`, this._transformOutputValue());
|
|
1755
1757
|
this.dispatchModify(event);
|
|
1756
1758
|
// Снимаем блокировку чуть позже, когда Store переварит изменения
|
|
1757
1759
|
setTimeout(() => this._isUpdatingInternal = false, 600);
|
|
@@ -1789,8 +1791,12 @@ class InputDateComponent extends BaseFieldComponent {
|
|
|
1789
1791
|
_initSubscriptionForValue() {
|
|
1790
1792
|
this._subscriptions$.push(this._store.select(selectValueModel(this.settings))
|
|
1791
1793
|
.subscribe((result) => {
|
|
1792
|
-
|
|
1794
|
+
console.log(`[DateComponent -> Store Subscription] [sysName: ${this.settings.sysName}] Получено из Store:`, structuredClone(result));
|
|
1795
|
+
if (!result || this._isUpdatingInternal) {
|
|
1796
|
+
if (this._isUpdatingInternal)
|
|
1797
|
+
console.log(`[DateComponent] Пропущено обновление из Store, так как _isUpdatingInternal = true`);
|
|
1793
1798
|
return;
|
|
1799
|
+
}
|
|
1794
1800
|
// Если компонент уже инициализирован, проверяем, нужно ли обновляться.
|
|
1795
1801
|
// Мы НЕ обновляемся, если данные в Store идентичны тем, что мы уже держим в памяти.
|
|
1796
1802
|
if (this._isInit) {
|
|
@@ -1816,6 +1822,7 @@ class InputDateComponent extends BaseFieldComponent {
|
|
|
1816
1822
|
}));
|
|
1817
1823
|
}
|
|
1818
1824
|
_customInit() {
|
|
1825
|
+
console.log(`[DateComponent -> _customInit] [sysName: ${this.settings.sysName}] Настройка локальных моделей. Текущее состояние range:`, this.settings.options.range);
|
|
1819
1826
|
if (this.settings.options.range) {
|
|
1820
1827
|
if (!this.modelStart) {
|
|
1821
1828
|
this.modelStart = defaultValueModel(this.settings);
|
|
@@ -1841,6 +1848,7 @@ class InputDateComponent extends BaseFieldComponent {
|
|
|
1841
1848
|
else {
|
|
1842
1849
|
this.dateModel = this.model.value;
|
|
1843
1850
|
}
|
|
1851
|
+
console.log(`[DateComponent -> _customInit] Результат инициализации: dateModel =`, this.dateModel, 'modelCounter =', this.modelCounter);
|
|
1844
1852
|
this._isInit = true;
|
|
1845
1853
|
this._detector.markForCheck();
|
|
1846
1854
|
}
|
|
@@ -2194,22 +2202,43 @@ class InputTableModalComponent extends ModalServiceComponent {
|
|
|
2194
2202
|
this.settings = data.settings;
|
|
2195
2203
|
this.rowModel = data.rowModel;
|
|
2196
2204
|
this.isCheckRequired = data.isCheckRequired;
|
|
2205
|
+
console.log('[Modal -> Constructor] Данные, пришедшие в модалку:', {
|
|
2206
|
+
title: data.title,
|
|
2207
|
+
rowModel: structuredClone(data.rowModel)
|
|
2208
|
+
});
|
|
2197
2209
|
this.result = { result: false, rowModel: this.rowModel };
|
|
2198
2210
|
}
|
|
2199
2211
|
componentValueChanged(valueModel) {
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2212
|
+
console.log('[Modal -> componentValueChanged] Изменение компонента. Пришло значение:', structuredClone(valueModel));
|
|
2213
|
+
if (Array.isArray(valueModel) && valueModel.length > 0) {
|
|
2214
|
+
// Проверяем, это элементы диапазона дат (одинаковый sysName) или это разные компоненты
|
|
2215
|
+
const firstSysName = valueModel[0].sysName;
|
|
2216
|
+
const isRangeDate = valueModel.every(m => m.sysName === firstSysName && m.type === ComponentType.InputDate);
|
|
2217
|
+
if (isRangeDate) {
|
|
2218
|
+
// Собираем чистый массив значений дат [string | null, string | null]
|
|
2219
|
+
const rangeValues = valueModel.map(m => m.value);
|
|
2220
|
+
// Создаем синтетическую модель, где value — это массив дат
|
|
2221
|
+
const rangePayload = {
|
|
2222
|
+
...valueModel[0],
|
|
2223
|
+
value: rangeValues
|
|
2224
|
+
};
|
|
2225
|
+
this._transformValues(rangePayload);
|
|
2226
|
+
}
|
|
2227
|
+
else {
|
|
2228
|
+
// Если это массив от разных компонентов (стандартная логика dispenser)
|
|
2229
|
+
valueModel.forEach(model => this._transformValues(model));
|
|
2230
|
+
}
|
|
2204
2231
|
}
|
|
2205
|
-
else {
|
|
2232
|
+
else if (valueModel && !Array.isArray(valueModel)) {
|
|
2206
2233
|
this._transformValues(valueModel);
|
|
2207
2234
|
}
|
|
2208
2235
|
this._recalculateFormulaFields();
|
|
2209
2236
|
this.emptyRow = this.rowModel.data.every(x => this.isEmpty(x.value, x.valueType));
|
|
2210
2237
|
}
|
|
2211
2238
|
ok() {
|
|
2239
|
+
console.log('[Modal -> OK] Попытка сохранения. Текущая модель перед закрытием:', structuredClone(this.rowModel));
|
|
2212
2240
|
if (!this._isValid()) {
|
|
2241
|
+
console.warn('[Modal -> OK] Форма не валидна!');
|
|
2213
2242
|
// включаем подсветку полей
|
|
2214
2243
|
this.store.dispatch(updateCheckRequired({ isCheckRequired: true }));
|
|
2215
2244
|
return;
|
|
@@ -2228,10 +2257,15 @@ class InputTableModalComponent extends ModalServiceComponent {
|
|
|
2228
2257
|
_transformValues(value) {
|
|
2229
2258
|
const cloneRowModel = structuredClone(this.rowModel);
|
|
2230
2259
|
const findValue = cloneRowModel.data.find((c) => c.sysName === value.sysName);
|
|
2260
|
+
console.log(`[Modal -> _transformValues] Пытаемся обновить поле "${value.sysName}". Новое записываемое значение:`, value.value);
|
|
2231
2261
|
if (findValue) {
|
|
2232
|
-
findValue.value = value.value;
|
|
2262
|
+
findValue.value = value.value; // Теперь сюда запишется массив ['2026-05-05', '2026-05-07']
|
|
2263
|
+
}
|
|
2264
|
+
else {
|
|
2265
|
+
console.warn(`[Modal -> _transformValues] Поле с sysName "${value.sysName}" не найдено в rowModel.data`);
|
|
2233
2266
|
}
|
|
2234
2267
|
this.rowModel = cloneRowModel;
|
|
2268
|
+
console.log('[Modal -> _transformValues] Состояние rowModel.data после обновления:', structuredClone(this.rowModel.data));
|
|
2235
2269
|
}
|
|
2236
2270
|
_recalculateFormulaFields() {
|
|
2237
2271
|
const formulaComponents = this._getFormulaNumberComponents(this.settings.components);
|
|
@@ -2409,6 +2443,8 @@ class InputTableComponent {
|
|
|
2409
2443
|
this._subscriptions$.forEach((subscription) => subscription.unsubscribe());
|
|
2410
2444
|
}
|
|
2411
2445
|
createRow() {
|
|
2446
|
+
const initialRowModel = getRowModel(this.settings);
|
|
2447
|
+
console.log('[Table -> Create Row] Исходная модель для новой строки:', structuredClone(initialRowModel));
|
|
2412
2448
|
this._modalService.open(InputTableModalComponent, {
|
|
2413
2449
|
title: 'Создание строки',
|
|
2414
2450
|
okText: 'Создать',
|
|
@@ -2416,6 +2452,7 @@ class InputTableComponent {
|
|
|
2416
2452
|
rowModel: getRowModel(this.settings),
|
|
2417
2453
|
isCheckRequired: this._isCheckRequired
|
|
2418
2454
|
}).afterClosed().subscribe(resolve => {
|
|
2455
|
+
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
2419
2456
|
if (resolve.result) {
|
|
2420
2457
|
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
2421
2458
|
this._initDataSource(this._rows);
|
|
@@ -2436,13 +2473,18 @@ class InputTableComponent {
|
|
|
2436
2473
|
}
|
|
2437
2474
|
editRow(event) {
|
|
2438
2475
|
const findRow = this._rows.find(item => item.id === event.row.data.id);
|
|
2476
|
+
console.log('[Table -> Edit Row] Данные строки из клика (event.row.data):', event.row.data);
|
|
2477
|
+
console.log('[Table -> Edit Row] Найдено в локальном rows:', structuredClone(findRow));
|
|
2478
|
+
// const findRow: TableRowModel | undefined = this._rows.find(item => item.id === event.row.data.id);
|
|
2439
2479
|
if (findRow) {
|
|
2480
|
+
const rowModelClone = structuredClone(findRow);
|
|
2440
2481
|
this._modalService.open(InputTableModalComponent, {
|
|
2441
2482
|
title: 'Редактирование строки',
|
|
2442
2483
|
okText: 'Сохранить',
|
|
2443
2484
|
settings: this.settings,
|
|
2444
|
-
rowModel:
|
|
2485
|
+
rowModel: rowModelClone
|
|
2445
2486
|
}).afterClosed().subscribe(resolve => {
|
|
2487
|
+
console.log('[Table <- Modal Closed (Edit)] Результат из модалки:', structuredClone(resolve));
|
|
2446
2488
|
if (resolve.result) {
|
|
2447
2489
|
const cloneRows = structuredClone(this._rows);
|
|
2448
2490
|
const editableRow = cloneRows.find(row => row.id === resolve.rowModel.id);
|
|
@@ -2499,6 +2541,7 @@ class InputTableComponent {
|
|
|
2499
2541
|
this._rows = [];
|
|
2500
2542
|
}
|
|
2501
2543
|
_initDataSource(data) {
|
|
2544
|
+
console.log('[Table -> _initDataSource] Преобразование rows в dataSource таблицы. Исходный rows:', structuredClone(data));
|
|
2502
2545
|
this.dataSource = data.map((item) => {
|
|
2503
2546
|
const newDataItem = {};
|
|
2504
2547
|
for (let i in item.data) {
|
|
@@ -2507,6 +2550,7 @@ class InputTableComponent {
|
|
|
2507
2550
|
newDataItem.id = item.id;
|
|
2508
2551
|
return newDataItem;
|
|
2509
2552
|
});
|
|
2553
|
+
console.log('[Table -> _initDataSource] Итоговый dataSource для DevExtreme:', structuredClone(this.dataSource));
|
|
2510
2554
|
this._detector.detectChanges();
|
|
2511
2555
|
if (this.dataGrid?.instance) {
|
|
2512
2556
|
this.dataGrid.instance.refresh();
|
|
@@ -2547,6 +2591,31 @@ class InputTableComponent {
|
|
|
2547
2591
|
format: this.getFormat(component),
|
|
2548
2592
|
minWidth: 160
|
|
2549
2593
|
};
|
|
2594
|
+
if (component.type === ComponentType.InputDate && component.options.range) {
|
|
2595
|
+
column.calculateCellValue = (rowData) => {
|
|
2596
|
+
const dateRange = rowData[component.sysName];
|
|
2597
|
+
if (Array.isArray(dateRange) && dateRange.length === 2) {
|
|
2598
|
+
const formatDate = (dateStr) => {
|
|
2599
|
+
if (!dateStr)
|
|
2600
|
+
return '';
|
|
2601
|
+
const d = new Date(dateStr);
|
|
2602
|
+
if (isNaN(d.getTime()))
|
|
2603
|
+
return '';
|
|
2604
|
+
const day = String(d.getDate()).padStart(2, '0');
|
|
2605
|
+
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
2606
|
+
const year = d.getFullYear();
|
|
2607
|
+
return `${day}.${month}.${year}`;
|
|
2608
|
+
};
|
|
2609
|
+
const startFormatted = formatDate(dateRange[0]);
|
|
2610
|
+
const endFormatted = formatDate(dateRange[1]);
|
|
2611
|
+
if (startFormatted && endFormatted) {
|
|
2612
|
+
return `${startFormatted} — ${endFormatted}`;
|
|
2613
|
+
}
|
|
2614
|
+
return startFormatted || endFormatted || '';
|
|
2615
|
+
}
|
|
2616
|
+
return dateRange || '';
|
|
2617
|
+
};
|
|
2618
|
+
}
|
|
2550
2619
|
if (dataType === 'boolean') {
|
|
2551
2620
|
column.calculateCellValue = (rowData) => {
|
|
2552
2621
|
const value = rowData[component.sysName];
|