verben-ng-ui 0.9.4 → 0.9.6

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.
@@ -46,8 +46,19 @@ export class DataTableComponent {
46
46
  });
47
47
  this.tableData = computed(() => {
48
48
  return this.data().map((item, index) => {
49
- const key = this._getRowIdByDataKey(item) ?? index;
50
- return { ...item, _key: key };
49
+ let key;
50
+ const dataKey = this._getRowIdByDataKey(item);
51
+ if (dataKey) {
52
+ key = dataKey;
53
+ }
54
+ else {
55
+ key = index;
56
+ }
57
+ return {
58
+ originalData: item,
59
+ _key: key,
60
+ _key_prop: this.dataKey() ?? '_index',
61
+ };
51
62
  });
52
63
  });
53
64
  }
@@ -79,7 +90,7 @@ export class DataTableComponent {
79
90
  const groups = new Map();
80
91
  this.tableData().forEach((row) => {
81
92
  if (getGroupValue !== undefined) {
82
- const groupValue = getGroupValue(row);
93
+ const groupValue = getGroupValue(row.originalData);
83
94
  const existingGroup = groups.get(groupValue) || [];
84
95
  groups.set(groupValue, [...existingGroup, row]);
85
96
  }
@@ -111,13 +122,9 @@ export class DataTableComponent {
111
122
  }
112
123
  return column.accessorFn ? column.accessorFn(row) : undefined;
113
124
  };
114
- isRowEditing = (row) => {
115
- return this.editingRowsSignal().has(row._key);
125
+ isRowEditing = (rowKey) => {
126
+ return this.editingRowsSignal().has(rowKey);
116
127
  };
117
- /**
118
- * Only exists because some boys started using the method externally
119
- * and the signature changed. It hurts. Always use 'private', kids.
120
- * */
121
128
  toggleRowEdit = (rowId) => {
122
129
  let data = undefined;
123
130
  let index = -1;
@@ -149,7 +156,7 @@ export class DataTableComponent {
149
156
  const rowId = row._key;
150
157
  this.unEditedDataSignal.update((map) => {
151
158
  const newMap = new Map(map);
152
- newMap.set(rowId, { ...row });
159
+ newMap.set(rowId, { ...row.originalData });
153
160
  return newMap;
154
161
  });
155
162
  const formGroupConfig = this.formGroupConfig();
@@ -236,14 +243,14 @@ export class DataTableComponent {
236
243
  this.selectedRowsSignal.set(new Set());
237
244
  }
238
245
  else {
239
- const nonGroupRows = this.tableData().filter((row) => !this.isGroupRow(row));
246
+ const nonGroupRows = this.tableData().filter((row) => !this.isGroupRow(row.originalData));
240
247
  this.selectedRowsSignal.set(new Set(nonGroupRows.map((row) => row._key)));
241
248
  }
242
249
  this.emitSelectionChange();
243
250
  };
244
251
  emitSelectionChange() {
245
252
  const selectedRows = this.tableData().filter((row) => this.selectedRowsSignal().has(row._key));
246
- this.selectionChange.emit(selectedRows);
253
+ this.selectionChange.emit(selectedRows.map(({ originalData }) => originalData));
247
254
  }
248
255
  getHeaderContext(column) {
249
256
  return {
@@ -309,7 +316,7 @@ export class DataTableComponent {
309
316
  }
310
317
  getCellContext(row, column, rowIndex) {
311
318
  const rowId = row._key;
312
- const isEditing = this.isRowEditing(row);
319
+ const isEditing = this.isRowEditing(row._key);
313
320
  // const editedData = this.editedDataSignal().get(rowId);
314
321
  const editedForm = this.formGroupsSignal().get(rowId);
315
322
  const formControl = editedForm?.get(column.formControlName || '');
@@ -330,14 +337,15 @@ export class DataTableComponent {
330
337
  // value = this.getCellValue(row, column);
331
338
  // }
332
339
  // }
340
+ value = this.getCellValue(row.originalData, column);
333
341
  }
334
342
  else {
335
- value = this.getCellValue(row, column);
343
+ value = this.getCellValue(row.originalData, column);
336
344
  }
337
345
  return {
338
346
  $implicit: value,
339
347
  value,
340
- row,
348
+ row: row.originalData,
341
349
  column,
342
350
  rowIndex,
343
351
  rowId,
@@ -356,7 +364,7 @@ export class DataTableComponent {
356
364
  deleteRow = (rowId) => {
357
365
  const rowToDelete = this.tableData().find((row) => row._key === rowId);
358
366
  if (rowToDelete) {
359
- this.rowDelete.emit(rowToDelete);
367
+ this.rowDelete.emit(rowToDelete.originalData);
360
368
  }
361
369
  };
362
370
  getFooterContext(column) {
@@ -445,11 +453,11 @@ export class DataTableComponent {
445
453
  return cellStyle;
446
454
  }
447
455
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
448
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowRevert: "rowRevert", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, isSignal: true }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
456
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowRevert: "rowRevert", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, isSignal: true }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n </tr> -->\n\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row.originalData)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row.originalData, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row._key) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row.originalData, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
449
457
  }
450
458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataTableComponent, decorators: [{
451
459
  type: Component,
452
- args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
460
+ args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n </tr> -->\n\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row.originalData)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row.originalData, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row._key) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row.originalData, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
453
461
  }], ctorParameters: () => [], propDecorators: { styleConfig: [{
454
462
  type: Input
455
463
  }], rowEdit: [{
@@ -505,4 +513,4 @@ const defaultTableStyles = {
505
513
  borderTop: '2px solid #e0e0e0',
506
514
  },
507
515
  };
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUVmLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFHTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBbUIsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVE1RCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLHdDQUF3QztJQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBTyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF5QixDQUFDO0lBQ2xELE9BQU8sR0FBRyxLQUFLLEVBQVcsQ0FBQyxDQUFDLDJDQUEyQztJQUN2RSxlQUFlLEdBQUcsS0FBSyxFQUlwQixDQUFDO0lBRUosT0FBTyxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUV0QyxXQUFXLEdBQWdCLGtCQUFrQixDQUFDO0lBRXZELGVBQWUsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7SUFDaEMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUloQyxDQUFDO0lBQ0ssU0FBUyxHQUFHLElBQUksWUFBWSxFQUls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QVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkcmVuLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaWduYWwsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgRWRpdGVkRGF0YSxcbiAgRm9ybUdyb3VwQ29uZmlnLFxuICBHcm91cGVkRGF0YVJvdyxcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLnR5cGVzJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBCYXNlU3R5bGVzLCBUYWJsZVN0eWxlcyB9IGZyb20gJy4vc3R5bGUudHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudDxUPiB7XG4gIC8vIE1vZGlmeSBkYXRhIGlucHV0IHRvIHVzZSBncm91cGVkIGRhdGFcbiAgZGF0YSA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcbiAgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPENvbHVtbkRlZmluaXRpb248VD5bXT4oKTtcbiAgZGF0YUtleSA9IGlucHV0PGtleW9mIFQ+KCk7IC8vIE5ldyByZXF1aXJlZCBpbnB1dCBmb3IgdW5pcXVlIGlkZW50aWZpZXJcbiAgZm9ybUdyb3VwQ29uZmlnID0gaW5wdXQ8XG4gICAgRm9ybUdyb3VwQ29uZmlnPHtcbiAgICAgIFtLIGluIGtleW9mIFRdOiBBYnN0cmFjdENvbnRyb2w7XG4gICAgfT5cbiAgPigpO1xuXG4gIGdyb3VwQnkgPSBpbnB1dDxrZXlvZiBUIHwgKChyb3c6IFQpID0+IGFueSk+KCk7XG5cbiAgQElucHV0KCkgc3R5bGVDb25maWc6IFRhYmxlU3R5bGVzID0gZGVmYXVsdFRhYmxlU3R5bGVzO1xuXG4gIGNvbHVtblRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbihDb2x1bW5EaXJlY3RpdmUpO1xuXG4gIEBPdXRwdXQoKSByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcm93U2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAga2V5OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgZGF0YTogUGFydGlhbDxUPjtcbiAgfT4oKTtcbiAgQE91dHB1dCgpIHJvd1JldmVydCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAga2V5OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgZGF0YTogVDtcbiAgfT4oKTtcbiAgQE91dHB1dCgpIHJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gIC8qKiBJbnRlcm5hbGx5IG1haW50YWluZWQgZGF0YSwgd2l0aCBndWFyYW50ZWVkIHVuaXF1ZW5lc3MgZHVlIHRvIGtleSBwcm9wZXJ0eSAqL1xuICB0YWJsZURhdGE6IFNpZ25hbDxEYXRhV2l0aEtleTxUPltdPjtcblxuICBwcml2YXRlIGVkaXRpbmdSb3dzU2lnbmFsID0gc2lnbmFsPFNldDxzdHJpbmcgfCBudW1iZXI+PihuZXcgU2V0KCkpO1xuICBwcml2YXRlIHNlbGVjdGVkUm93c1NpZ25hbCA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcbiAgLy8gcHJpdmF0ZSBlZGl0ZWREYXRhU2lnbmFsID0gc2lnbmFsPE1hcDxzdHJpbmcgfCBudW1iZXIsIEVkaXRlZERhdGE8VD4+PihcbiAgLy8gICBuZXcgTWFwKClcbiAgLy8gKTtcbiAgcHJpdmF0ZSB1bkVkaXRlZERhdGFTaWduYWwgPSBzaWduYWw8TWFwPHN0cmluZyB8IG51bWJlciwgVD4+KG5ldyBNYXAoKSk7XG4gIHByaXZhdGUgZm9ybUdyb3Vwc1NpZ25hbCA9IHNpZ25hbDxNYXA8c3RyaW5nIHwgbnVtYmVyLCBGb3JtR3JvdXA+PihuZXcgTWFwKCkpO1xuXG4gIGNvbHVtbnNTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnMoKSk7XG5cbiAgZGlzcGxheUNvbHVtbnM6IFNpZ25hbDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGlzcGxheUNvbHVtbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jb2x1bW5zU2lnbmFsKCkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IHRoaXMuY29sdW1uVGVtcGxhdGVzKCkuZmluZChcbiAgICAgICAgICAodCkgPT4gdC5jb2x1bW5JZCA9PT0gY29sdW1uLmlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsVGVtcGxhdGUsXG4gICAgICAgICAgICBjZWxsRWRpdFRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmNlbGxFZGl0VGVtcGxhdGUsXG4gICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5oZWFkZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIGZvb3RlclRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmZvb3RlclRlbXBsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy50YWJsZURhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhKCkubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPVxuICAgICAgICAgIHRoaXMuX2dldFJvd0lkQnlEYXRhS2V5KGl0ZW0pID8/IChpbmRleCBhcyBEYXRhV2l0aEtleTxUPlsnX2tleSddKTtcbiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgX2tleToga2V5IH07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhc0Zvb3RlciA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5kaXNwbGF5Q29sdW1ucygpLnNvbWUoKGNvbCkgPT4gY29sLmZvb3RlclRlbXBsYXRlICE9PSB1bmRlZmluZWQpXG4gICk7XG5cbiAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcm93XG4gIHByaXZhdGUgX2dldFJvd0lkQnlEYXRhS2V5KHJvdzogVCk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5kYXRhS2V5KCk7XG4gICAgaWYgKGtleSkge1xuICAgICAgY29uc3QgdmFsdWUgPSByb3dba2V5XTtcblxuICAgICAgLy8gQ29udmVydCB0byBzdHJpbmcgb3IgbnVtYmVyIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugc3RyaW5naWZ5XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFR5cGUgZ3VhcmQgbWV0aG9kIHRvIGNoZWNrIGZvciBncm91cCByb3dzXG4gIGlzR3JvdXBSb3cocm93OiBUKTogcm93IGlzIFQgJiB7IGlzR3JvdXBSb3c6IHRydWU7IGdyb3VwVGl0bGU6IGFueSB9IHtcbiAgICByZXR1cm4gISEocm93IGFzIGFueSkuaXNHcm91cFJvdztcbiAgfVxuXG4gIC8vIENvbXB1dGVkIHByb3BlcnR5IGZvciBncm91cGVkIGRhdGFcblxuICBncm91cGVkRGF0YSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBpZiAoIXRoaXMuZ3JvdXBCeSgpKSByZXR1cm4gdGhpcy50YWJsZURhdGEoKSBhcyBHcm91cGVkRGF0YVJvdzxUPltdO1xuXG4gICAgY29uc3QgZ2V0R3JvdXBWYWx1ZSA9XG4gICAgICB0eXBlb2YgdGhpcy5ncm91cEJ5KCkgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyAodGhpcy5ncm91cEJ5KCkgYXMgKHJvdzogVCkgPT4gYW55KVxuICAgICAgICA6IChyb3c6IFQpID0+IHJvd1t0aGlzLmdyb3VwQnkoKSBhcyBrZXlvZiBUXTtcblxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8YW55LCBUW10+KCk7XG5cbiAgICB0aGlzLnRhYmxlRGF0YSgpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgaWYgKGdldEdyb3VwVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ2V0R3JvdXBWYWx1ZShyb3cpO1xuICAgICAgICBjb25zdCBleGlzdGluZ0dyb3VwID0gZ3JvdXBzLmdldChncm91cFZhbHVlKSB8fCBbXTtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cFZhbHVlLCBbLi4uZXhpc3RpbmdHcm91cCwgcm93XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBncm91cGVkRGF0YUFycmF5OiBHcm91cGVkRGF0YVJvdzxUPltdID0gW107XG5cbiAgICBncm91cHMuZm9yRWFjaCgoZ3JvdXBSb3dzLCBncm91cFZhbHVlKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgZ3JvdXAgaGVhZGVyIHJvd1xuICAgICAgY29uc3QgZ3JvdXBSb3c6IEdyb3VwZWREYXRhUm93PFQ+ID0ge1xuICAgICAgICAuLi4oe30gYXMgVCksIC8vIENyZWF0ZSBlbXB0eSBvYmplY3Qgb2YgdHlwZSBUIGFzIGJhc2VcbiAgICAgICAgX2tleTogYGdyb3VwLSR7Z3JvdXBWYWx1ZX1gLFxuICAgICAgICBpc0dyb3VwUm93OiB0cnVlLFxuICAgICAgICBncm91cFZhbHVlLFxuICAgICAgICBncm91cFRpdGxlOiBncm91cFZhbHVlLFxuICAgICAgfTtcblxuICAgICAgZ3JvdXBlZERhdGFBcnJheS5wdXNoKGdyb3VwUm93KTtcbiAgICAgIC8vIEFkZCByZWd1bGFyIHJvd3Mgd2l0aCB0aGUgb3B0aW9uYWwgaXNHcm91cFJvdyBwcm9wZXJ0eSAodW5kZWZpbmVkIGJ5IGRlZmF1bHQpXG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goLi4uKGdyb3VwUm93cyBhcyBHcm91cGVkRGF0YVJvdzxUPltdKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBlZERhdGFBcnJheTtcbiAgfSk7XG5cbiAgZ2V0Q2VsbFZhbHVlID0gKHJvdzogVCwgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogYW55ID0+IHtcbiAgICAvLyBGb3IgZ3JvdXAgcm93cywgcmV0dXJuIHRoZSBncm91cCB0aXRsZSBpZiBpdCBleGlzdHNcbiAgICBpZiAodGhpcy5pc0dyb3VwUm93KHJvdykpIHtcbiAgICAgIHJldHVybiAocm93IGFzIGFueSkuZ3JvdXBUaXRsZTtcbiAgICB9XG5cbiAgICAvLyBFeGlzdGluZyBsb2dpYyBmb3Igbm9ybWFsIHJvd3NcbiAgICBpZiAoY29sdW1uLmFjY2Vzc29yS2V5KSB7XG4gICAgICByZXR1cm4gcm93W2NvbHVtbi5hY2Nlc3NvcktleV07XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW4uYWNjZXNzb3JGbiA/IGNvbHVtbi5hY2Nlc3NvckZuKHJvdykgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgaXNSb3dFZGl0aW5nID0gKHJvdzogRGF0YVdpdGhLZXk8VD4pOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nUm93c1NpZ25hbCgpLmhhcyhyb3cuX2tleSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE9ubHkgZXhpc3RzIGJlY2F1c2Ugc29tZSBib3lzIHN0YXJ0ZWQgdXNpbmcgdGhlIG1ldGhvZCBleHRlcm5hbGx5XG4gICAqIGFuZCB0aGUgc2lnbmF0dXJlIGNoYW5nZWQuIEl0IGh1cnRzLiBBbHdheXMgdXNlICdwcml2YXRlJywga2lkcy5cbiAgICogKi9cbiAgdG9nZ2xlUm93RWRpdCA9IChyb3dJZDogRGF0YVdpdGhLZXk8VD5bJ19rZXknXSkgPT4ge1xuICAgIGxldCBkYXRhOiBEYXRhV2l0aEtleTxUPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgdGhpcy50YWJsZURhdGEoKS5mb3JFYWNoKChkYXR1bSwgaSkgPT4ge1xuICAgICAgaWYgKGRhdHVtLl9rZXkgPT09IHJvd0lkKSB7XG4gICAgICAgIGRhdGEgPSBkYXR1bTtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRJbnRlcm5hbChkYXRhLCBpbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgdG9nZ2xlUm93RWRpdEludGVybmFsID0gKHJvdzogRGF0YVdpdGhLZXk8VD4sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICB0aGlzLmVkaXRpbmdSb3dzU2lnbmFsLnVwZGF0ZSgoc2V0KSA9PiB7XG4gICAgICBjb25zdCBuZXdTZXQgPSBuZXcgU2V0KHNldCk7XG4gICAgICBpZiAobmV3U2V0Lmhhcyhyb3cuX2tleSkpIHtcbiAgICAgICAgbmV3U2V0LmRlbGV0ZShyb3cuX2tleSk7XG4gICAgICAgIHRoaXMuc2F2ZVJvdyhyb3cuX2tleSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2V0LmFkZChyb3cuX2tleSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRlZERhdGEocm93KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTZXQ7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRWRpdGVkRGF0YShyb3c6IERhdGFXaXRoS2V5PFQ+KSB7XG4gICAgY29uc3Qgcm93SWQgPSByb3cuX2tleTtcbiAgICB0aGlzLnVuRWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3cgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICAgIGNvbnN0IGZvcm1Hcm91cENvbmZpZyA9IHRoaXMuZm9ybUdyb3VwQ29uZmlnKCk7XG4gICAgaWYgKGZvcm1Hcm91cENvbmZpZykge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChcbiAgICAgICAgZm9ybUdyb3VwQ29uZmlnLmNvbnRyb2xzLFxuICAgICAgICBmb3JtR3JvdXBDb25maWcudmFsaWRhdG9yT3JPcHRzLFxuICAgICAgICBmb3JtR3JvdXBDb25maWcuYXN5bmNWYWxpZGF0b3JcbiAgICAgICk7XG4gICAgICBmb3JtR3JvdXAucGF0Y2hWYWx1ZShyb3cgYXMgYW55KTtcbiAgICAgIHRoaXMuZm9ybUdyb3Vwc1NpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICAgIG5ld01hcC5zZXQocm93SWQsIGZvcm1Hcm91cCk7XG4gICAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVSb3cocm93SWQ6IHN0cmluZyB8IG51bWJlciwgcm93SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGVkaXRlZEZvcm0gPSB0aGlzLmZvcm1Hcm91cHNTaWduYWwoKS5nZXQocm93SWQpO1xuICAgIGNvbnN0IHVuRWRpdGVkRGF0YSA9IHRoaXMudW5FZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcblxuICAgIC8vIGlmIChlZGl0ZWREYXRhKSB7XG4gICAgLy8gICBjb25zdCBvcmlnaW5hbFJvdyA9IHRoaXMudGFibGVEYXRhKCkuZmluZCgocm93KSA9PiByb3cuX2tleSA9PT0gcm93SWQpO1xuICAgIC8vICAgaWYgKG9yaWdpbmFsUm93KSB7XG4gICAgLy8gICAgIGNvbnN0IHVwZGF0ZWRSb3cgPSB7IC4uLm9yaWdpbmFsUm93LCAuLi5lZGl0ZWREYXRhIH07XG4gICAgLy8gICAgIHRoaXMucm93U2F2ZS5lbWl0KHVwZGF0ZWRSb3cpO1xuICAgIC8vICAgICB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAvLyAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgLy8gICAgICAgbmV3TWFwLmRlbGV0ZShyb3dJZCk7XG4gICAgLy8gICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgaWYgKGVkaXRlZEZvcm0pIHtcbiAgICAgIGVkaXRlZEZvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIGVkaXRlZEZvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICB0aGlzLmZvcm1Hcm91cHNTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgICBuZXdNYXAuZGVsZXRlKHJvd0lkKTtcbiAgICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb3dTYXZlLmVtaXQoe1xuICAgICAgICBpbmRleDogcm93SW5kZXgsXG4gICAgICAgIGtleTogcm93SWQsXG4gICAgICAgIGRhdGE6IGVkaXRlZEZvcm0udmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodW5FZGl0ZWREYXRhKSB7XG4gICAgICB0aGlzLnVuRWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICAgIG5ld01hcC5kZWxldGUocm93SWQpO1xuICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJvd1JldmVydC5lbWl0KHtcbiAgICAgICAgaW5kZXg6IHJvd0luZGV4LFxuICAgICAgICBrZXk6IHJvd0lkLFxuICAgICAgICBkYXRhOiB1bkVkaXRlZERhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5oYXMocm93SWQpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd1NlbGVjdGlvbiA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIGFsbFJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBub25Hcm91cFJvd3MgPSB0aGlzLmRhdGEoKS5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNHcm91cFJvdyhyb3cpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbm9uR3JvdXBSb3dzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA9PT0gbm9uR3JvdXBSb3dzLmxlbmd0aFxuICAgICk7XG4gIH07XG5cbiAgc29tZVJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBub25Hcm91cFJvd3MgPSB0aGlzLmRhdGEoKS5maWx0ZXIoKHJvdykgPT4gIXRoaXMuaXNHcm91cFJvdyhyb3cpKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID4gMCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplIDwgbm9uR3JvdXBSb3dzLmxlbmd0aFxuICAgICk7XG4gIH07XG5cbiAgdG9nZ2xlQWxsUm93cyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5hbGxSb3dzU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwuc2V0KG5ldyBTZXQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMudGFibGVEYXRhKCkuZmlsdGVyKFxuICAgICAgICAocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdylcbiAgICAgICk7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC5zZXQobmV3IFNldChub25Hcm91cFJvd3MubWFwKChyb3cpID0+IHJvdy5fa2V5KSkpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfTtcblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy50YWJsZURhdGEoKS5maWx0ZXIoKHJvdykgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuaGFzKHJvdy5fa2V5KVxuICAgICk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ29udGV4dChjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXG4gICAgICBjb2x1bW4sXG4gICAgICBhbGxSb3dzU2VsZWN0ZWQ6IHRoaXMuYWxsUm93c1NlbGVjdGVkLFxuICAgICAgc29tZVJvd3NTZWxlY3RlZDogdGhpcy5zb21lUm93c1NlbGVjdGVkLFxuICAgICAgdG9nZ2xlQWxsUm93czogdGhpcy50b2dnbGVBbGxSb3dzLFxuICAgIH07XG4gIH1cblxuICB1cGRhdGVFZGl0ZWRWYWx1ZShcbiAgICByb3dJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPixcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIC8vIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgIC8vICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIC8vICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAvLyAgIGlmIChjb2x1bW4uYWNjZXNzb3JLZXkpIHtcbiAgICAvLyAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCBbY29sdW1uLmFjY2Vzc29yS2V5XTogdmFsdWUgfSk7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjb25zb2xlLndhcm4oXG4gICAgLy8gICAgICAgJ0Nhbm5vdCB1cGRhdGUgdmFsdWUgZm9yIGNvbHVtbiB3aXRob3V0IGFjY2Vzc29yS2V5OicsXG4gICAgLy8gICAgICAgY29sdW1uLmlkXG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gbmV3TWFwO1xuICAgIC8vIH0pO1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkVmFsdWVGbihcbiAgICByb3dJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHZhbHVlRm46ICh2YWx1ZTogYW55KSA9PiBULFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgLy8gdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgLy8gICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgLy8gICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgIC8vICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCAuLi52YWx1ZUZuKHZhbHVlKSB9KTtcbiAgICAvLyAgIHJldHVybiBuZXdNYXA7XG4gICAgLy8gfSk7XG4gIH1cblxuICB1cGRhdGVFZGl0ZWREYXRhKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsIGRhdGE6IFBhcnRpYWw8VD4pIHtcbiAgICAvLyB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAvLyAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAvLyAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgLy8gICBuZXdNYXAuc2V0KHJvd0lkLCB7IC4uLnJvd0RhdGEsIC4uLmRhdGEgfSk7XG4gICAgLy8gICByZXR1cm4gbmV3TWFwO1xuICAgIC8vIH0pO1xuICB9XG5cbiAgdXBkYXRlTmVzdGVkRWRpdGVkVmFsdWUoXG4gICAgcm93SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sXG4gICAgbmVzdGVkRmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIC8vIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgIC8vICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIC8vICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAvLyAgIGlmIChjb2x1bW4uYWNjZXNzb3JLZXkpIHtcbiAgICAvLyAgICAgY29uc3QgY29sdW1uRGF0YSA9IChyb3dEYXRhW2NvbHVtbi5hY2Nlc3NvcktleV0gYXMgYW55KSB8fCB7fTtcbiAgICAvLyAgICAgbmV3TWFwLnNldChyb3dJZCwge1xuICAgIC8vICAgICAgIC4uLnJvd0RhdGEsXG4gICAgLy8gICAgICAgW2NvbHVtbi5hY2Nlc3NvcktleV06IHtcbiAgICAvLyAgICAgICAgIC4uLmNvbHVtbkRhdGEsXG4gICAgLy8gICAgICAgICBbbmVzdGVkRmllbGRdOiB2YWx1ZSxcbiAgICAvLyAgICAgICB9LFxuICAgIC8vICAgICB9KTtcbiAgICAvLyAgIH0gZWxzZSB7XG4gICAgLy8gICAgIGNvbnNvbGUud2FybihcbiAgICAvLyAgICAgICAnQ2Fubm90IHVwZGF0ZSBuZXN0ZWQgdmFsdWUgZm9yIGNvbHVtbiB3aXRob3V0IGFjY2Vzc29yS2V5OicsXG4gICAgLy8gICAgICAgY29sdW1uLmlkXG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gbmV3TWFwO1xuICAgIC8vIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbENvbnRleHQoXG4gICAgcm93OiBEYXRhV2l0aEtleTxUPixcbiAgICBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sXG4gICAgcm93SW5kZXg6IG51bWJlclxuICApIHtcbiAgICBjb25zdCByb3dJZCA9IHJvdy5fa2V5O1xuICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuaXNSb3dFZGl0aW5nKHJvdyk7XG4gICAgLy8gY29uc3QgZWRpdGVkRGF0YSA9IHRoaXMuZWRpdGVkRGF0YVNpZ25hbCgpLmdldChyb3dJZCk7XG4gICAgY29uc3QgZWRpdGVkRm9ybSA9IHRoaXMuZm9ybUdyb3Vwc1NpZ25hbCgpLmdldChyb3dJZCk7XG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSBlZGl0ZWRGb3JtPy5nZXQoY29sdW1uLmZvcm1Db250cm9sTmFtZSB8fCAnJyk7XG5cbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgdmFsdWUgPSBmb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgaWYgKGVkaXRlZERhdGEpIHtcbiAgICAgIC8vICAgaWYgKGNvbHVtbi5hY2Nlc3NvcktleSAmJiBjb2x1bW4uYWNjZXNzb3JLZXkgaW4gZWRpdGVkRGF0YSkge1xuICAgICAgLy8gICAgIC8vIElmIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3JLZXkgYW5kIGl0IGV4aXN0cyBpbiBlZGl0ZWQgZGF0YSwgdXNlIHRoYXRcbiAgICAgIC8vICAgICB2YWx1ZSA9IGVkaXRlZERhdGFbY29sdW1uLmFjY2Vzc29yS2V5XTtcbiAgICAgIC8vICAgfSBlbHNlIGlmIChjb2x1bW4uYWNjZXNzb3JGbikge1xuICAgICAgLy8gICAgIC8vIElmIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3JGbiwgYXBwbHkgaXQgdG8gdGhlIGVkaXRlZCBkYXRhXG4gICAgICAvLyAgICAgdmFsdWUgPSBjb2x1bW4uYWNjZXNzb3JGbih7IC4uLnJvdywgLi4uZWRpdGVkRGF0YSB9KTtcbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAvLyBGYWxsYmFjayB0byBnZXR0aW5nIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCByb3dcbiAgICAgIC8vICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiB2YWx1ZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcm93LFxuICAgICAgY29sdW1uLFxuICAgICAgcm93SW5kZXgsXG4gICAgICByb3dJZCxcbiAgICAgIGlzRWRpdGluZyxcbiAgICAgIGZvcm1Db250cm9sLFxuICAgICAgaXNTZWxlY3RlZDogdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd1NlbGVjdGlvbjogKCkgPT4gdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQpLFxuICAgICAgdG9nZ2xlUm93RWRpdDogKCkgPT4gdGhpcy50b2dnbGVSb3dFZGl0SW50ZXJuYWwocm93LCByb3dJbmRleCksXG4gICAgICBkZWxldGVSb3c6ICgpID0+IHRoaXMuZGVsZXRlUm93KHJvd0lkKSxcbiAgICAgIHVwZGF0ZVZhbHVlOiAobmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRWYWx1ZShyb3dJZCwgY29sdW1uLCBuZXdWYWx1ZSksXG4gICAgICB1cGRhdGVOZXN0ZWRWYWx1ZTogKG5lc3RlZEZpZWxkOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlTmVzdGVkRWRpdGVkVmFsdWUocm93SWQsIGNvbHVtbiwgbmVzdGVkRmllbGQsIG5ld1ZhbHVlKSxcbiAgICAgIHVwZGF0ZVZhbHVlRm46ICh2YWx1ZUZuOiAodmFsdWU6IGFueSkgPT4gVCwgbmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRWYWx1ZUZuKHJvd0lkLCB2YWx1ZUZuLCBuZXdWYWx1ZSksXG4gICAgICB1cGRhdGVEYXRhOiAobmV3RGF0YTogUGFydGlhbDxUPikgPT5cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWREYXRhKHJvd0lkLCBuZXdEYXRhKSxcbiAgICB9O1xuICB9XG5cbiAgZGVsZXRlUm93ID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgICBjb25zdCByb3dUb0RlbGV0ZSA9IHRoaXMudGFibGVEYXRhKCkuZmluZCgocm93KSA9PiByb3cuX2tleSA9PT0gcm93SWQpO1xuICAgIGlmIChyb3dUb0RlbGV0ZSkge1xuICAgICAgdGhpcy5yb3dEZWxldGUuZW1pdChyb3dUb0RlbGV0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGdldEZvb3RlckNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY29sdW1uLFxuICAgICAgY29sdW1uLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgIH07XG4gIH1cblxuICBnZXRUYWJsZVN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0eWxlQ29uZmlnLmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdGhpcy5zdHlsZUNvbmZpZy5mb250U2l6ZSxcbiAgICAgIHdoaXRlU3BhY2U6IHRoaXMuc3R5bGVDb25maWcud2hpdGVTcGFjZSxcbiAgICAgIG1hcmdpbjogdGhpcy5zdHlsZUNvbmZpZy5tYXJnaW4sXG4gICAgICBib3JkZXI6IHRoaXMuc3R5bGVDb25maWcuYm9yZGVyLFxuICAgICAgYm9yZGVyQ29sbGFwc2U6IHRoaXMuc3R5bGVDb25maWcuYm9yZGVyQ29sbGFwc2UsXG4gICAgICBib3JkZXJTcGFjaW5nOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlclNwYWNpbmcsXG4gICAgICB0YWJsZUxheW91dDogdGhpcy5zdHlsZUNvbmZpZy50YWJsZUxheW91dCxcbiAgICAgIHdpZHRoOiB0aGlzLnN0eWxlQ29uZmlnLndpZHRoLFxuICAgIH07XG4gIH1cblxuICBnZXRIZWFkZXJTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmhlYWRlcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnN0eWxlQ29uZmlnLmhlYWRlcj8uc3RpY2t5VG9wID8gJ3N0aWNreScgOiAnc3RhdGljJyxcbiAgICAgIHRvcDogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnN0aWNreVRvcCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldEZvb3RlclN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcuZm9vdGVyLFxuICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZm9vdGVyPy5zdGlja3lCb3R0b20gPyAnc3RpY2t5JyA6ICdzdGF0aWMnLFxuICAgICAgYm90dG9tOiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uc3RpY2t5Qm90dG9tID8gJzAnIDogJ2F1dG8nLFxuICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uekluZGV4IHx8ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0Um93U3R5bGUocm93SW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3Qgcm93U3R5bGVzID0gdGhpcy5zdHlsZUNvbmZpZy5yb3dzO1xuICAgIGlmIChyb3dTdHlsZXMgJiYgJ2V2ZW4nIGluIHJvd1N0eWxlcyAmJiAnb2RkJyBpbiByb3dTdHlsZXMpIHtcbiAgICAgIHJldHVybiByb3dJbmRleCAlIDIgPT09IDAgPyByb3dTdHlsZXMuZXZlbiA6IHJvd1N0eWxlcy5vZGQ7XG4gICAgfSBlbHNlIGlmIChyb3dTdHlsZXMgJiYgJ250aCcgaW4gcm93U3R5bGVzICYmIHJvd1N0eWxlcy5udGgpIHtcbiAgICAgIGNvbnN0IHsgaW50ZXJ2YWwsIHN0eWxlIH0gPSByb3dTdHlsZXMubnRoO1xuICAgICAgcmV0dXJuIChyb3dJbmRleCArIDEpICUgKGludGVydmFsIHx8IDEpID09PSAwID8gc3R5bGUgOiB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJvd1N0eWxlcyB8fCB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRDZWxsU3R5bGUocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgaXNGaXJzdENvbHVtbiA9IGNvbEluZGV4ID09PSAwO1xuICAgIGNvbnN0IGlzTGFzdENvbHVtbiA9IGNvbEluZGV4ID09PSB0aGlzLmRpc3BsYXlDb2x1bW5zKCkubGVuZ3RoIC0gMTtcblxuICAgIGxldCBjZWxsU3R5bGUgPSB7IC4uLnRoaXMuc3R5bGVDb25maWcuY2VsbHMgfTtcblxuICAgIGlmIChpc0ZpcnN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnN0aWNreUxlZnRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgbGVmdDogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzTGFzdENvbHVtbikge1xuICAgICAgY2VsbFN0eWxlID0ge1xuICAgICAgICAuLi5jZWxsU3R5bGUsXG4gICAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgcmlnaHQ6IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHQgPyAnMCcgOiAnYXV0bycsXG4gICAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocm93SW5kZXggPj0gMCkge1xuICAgICAgLy8gQXBwbHkgYm9keSBzdHlsZXMgdG8gYWxsIGNlbGxzXG4gICAgICBjZWxsU3R5bGUgPSB7IC4uLmNlbGxTdHlsZSwgLi4udGhpcy5zdHlsZUNvbmZpZy5ib2R5IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbFN0eWxlO1xuICB9XG59XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBleHRlbmRzIFQgd2l0aCBhIF9rZXkgcHJvcGVydHlcbnR5cGUgRGF0YVdpdGhLZXk8VD4gPSBUICYgeyBfa2V5OiBzdHJpbmcgfCBudW1iZXIgfTtcblxuLy8gRGVmYXVsdCBzdHlsZXNcbmNvbnN0IGRlZmF1bHRUYWJsZVN0eWxlczogVGFibGVTdHlsZXMgPSB7XG4gIGJvcmRlcjogJzFweCBzb2xpZCAjZTBlMGUwJyxcbiAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBib3hTaGFkb3c6ICcwIDJweCA0cHggcmdiYSgwLDAsMCwwLjEpJyxcbiAgd2lkdGg6ICcxMDAlJyxcbiAgaGVhZGVyOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIGNvbG9yOiAnIzMzMycsXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyQm90dG9tOiAnMnB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxuICByb3dzOiB7XG4gICAgZXZlbjoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgfSxcbiAgICBvZGQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmOWY5ZjknLFxuICAgIH0sXG4gICAgbnRoOiB7XG4gICAgICBpbnRlcnZhbDogNSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmMGYwZjAnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjZWxsczoge1xuICAgIHBhZGRpbmc6ICcxMnB4IDE2cHgnLFxuICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCAjZTBlMGUwJyxcbiAgfSxcbiAgZm9vdGVyOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIGNvbG9yOiAnIzMzMycsXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyVG9wOiAnMnB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxufTtcbiIsIjx0YWJsZSBbbmdTdHlsZV09XCJnZXRUYWJsZVN0eWxlKClcIj5cbiAgPHRoZWFkPlxuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRIZWFkZXJTdHlsZSgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgZGlzcGxheUNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICA8dGggW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKC0xLCAkaW5kZXgpXCI+XG4gICAgICAgIEBpZiAoY29sdW1uLmhlYWRlclRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRIZWFkZXJDb250ZXh0KGNvbHVtbilcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICB7eyBjb2x1bW4uaGVhZGVyIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgICB9XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIEBmb3IgKHJvdyBvZiB0YWJsZURhdGEoKTsgdHJhY2sgcm93Ll9rZXk7IGxldCByb3dJbmRleCA9ICRpbmRleCkgeyBAaWZcbiAgICAoaXNHcm91cFJvdyhyb3cpKSB7XG4gICAgPHRyIGNsYXNzPVwiZ3JvdXAtcm93XCIgW25nU3R5bGVdPVwiZ2V0Um93U3R5bGUocm93SW5kZXgpXCI+XG4gICAgICA8dGRcbiAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5Q29sdW1ucygpLmxlbmd0aFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZShyb3dJbmRleCwgMClcIlxuICAgICAgPlxuICAgICAgICB7eyBnZXRDZWxsVmFsdWUocm93LCBkaXNwbGF5Q29sdW1ucygpWzBdKSB9fVxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIH0gQGVsc2Uge1xuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRSb3dTdHlsZShyb3dJbmRleClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBkaXNwbGF5Q29sdW1ucygpOyB0cmFjayBjb2x1bW4uaWQ7IGxldCBjb2xJbmRleCA9ICRpbmRleClcbiAgICAgIHtcbiAgICAgIDx0ZCBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUocm93SW5kZXgsIGNvbEluZGV4KVwiPlxuICAgICAgICBAaWYgKGlzUm93RWRpdGluZyhyb3cpICYmIGNvbHVtbi5jZWxsRWRpdFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uY2VsbEVkaXRUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENlbGxDb250ZXh0KHJvdywgY29sdW1uLCByb3dJbmRleClcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jZWxsVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5jZWxsVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDZWxsQ29udGV4dChyb3csIGNvbHVtbiwgcm93SW5kZXgpXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKSB9fVxuICAgICAgICB9XG4gICAgICA8L3RkPlxuICAgICAgfVxuICAgIDwvdHI+XG4gICAgfSB9XG4gIDwvdGJvZHk+XG4gIEBpZiAoaGFzRm9vdGVyKCkpIHtcbiAgPHRmb290PlxuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRGb290ZXJTdHlsZSgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgZGlzcGxheUNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICA8dGQgW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKC0xLCAkaW5kZXgpXCI+XG4gICAgICAgIEBpZiAoY29sdW1uLmZvb3RlclRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uZm9vdGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRGb290ZXJDb250ZXh0KGNvbHVtbilcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgICB9XG4gICAgPC90cj5cbiAgPC90Zm9vdD5cbiAgfVxuPC90YWJsZT5cbiJdfQ==
516
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUVmLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFHTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFRdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBbUIsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVE1RCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLHdDQUF3QztJQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBTyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF5QixDQUFDO0lBQ2xELE9BQU8sR0FBRyxLQUFLLEVBQVcsQ0FBQyxDQUFDLDJDQUEyQztJQUN2RSxlQUFlLEdBQUcsS0FBSyxFQUlwQixDQUFDO0lBRUosT0FBTyxHQUFHLEtBQUssRUFBK0IsQ0FBQztJQUV0QyxXQUFXLEdBQWdCLGtCQUFrQixDQUFDO0lBRXZELGVBQWUsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7SUFDaEMsT0FBTyxHQUFHLElBQUksWUFBWSxFQUloQyxDQUFDO0lBQ0ssU0FBUyxHQUFHLElBQUksWUFBWSxFQUls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LEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFlBQVksRUFBRSxtQkFBbUI7S0FDbEM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixlQUFlLEVBQUUsU0FBUztTQUMzQjtRQUNELEdBQUcsRUFBRTtZQUNILGVBQWUsRUFBRSxTQUFTO1NBQzNCO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUU7Z0JBQ0wsZUFBZSxFQUFFLFNBQVM7YUFDM0I7U0FDRjtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFdBQVc7UUFDcEIsWUFBWSxFQUFFLG1CQUFtQjtLQUNsQztJQUNELE1BQU0sRUFBRTtRQUNOLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkcmVuLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgaW5wdXQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaWduYWwsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29sdW1uRGVmaW5pdGlvbixcbiAgRGF0YVdpdGhLZXksXG4gIEVkaXRlZERhdGEsXG4gIEZvcm1Hcm91cENvbmZpZyxcbiAgR3JvdXBlZERhdGFSb3csXG59IGZyb20gJy4vZGF0YS10YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQmFzZVN0eWxlcywgVGFibGVTdHlsZXMgfSBmcm9tICcuL3N0eWxlLnR5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQ8VD4ge1xuICAvLyBNb2RpZnkgZGF0YSBpbnB1dCB0byB1c2UgZ3JvdXBlZCBkYXRhXG4gIGRhdGEgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG4gIGNvbHVtbnMgPSBpbnB1dC5yZXF1aXJlZDxDb2x1bW5EZWZpbml0aW9uPFQ+W10+KCk7XG4gIGRhdGFLZXkgPSBpbnB1dDxrZXlvZiBUPigpOyAvLyBOZXcgcmVxdWlyZWQgaW5wdXQgZm9yIHVuaXF1ZSBpZGVudGlmaWVyXG4gIGZvcm1Hcm91cENvbmZpZyA9IGlucHV0PFxuICAgIEZvcm1Hcm91cENvbmZpZzx7XG4gICAgICBbSyBpbiBrZXlvZiBUXTogQWJzdHJhY3RDb250cm9sO1xuICAgIH0+XG4gID4oKTtcblxuICBncm91cEJ5ID0gaW5wdXQ8a2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpPigpO1xuXG4gIEBJbnB1dCgpIHN0eWxlQ29uZmlnOiBUYWJsZVN0eWxlcyA9IGRlZmF1bHRUYWJsZVN0eWxlcztcblxuICBjb2x1bW5UZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKTtcblxuICBAT3V0cHV0KCkgcm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJvd1NhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyIHwgc3RyaW5nO1xuICAgIGRhdGE6IFBhcnRpYWw8VD47XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSByb3dSZXZlcnQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGtleTogbnVtYmVyIHwgc3RyaW5nO1xuICAgIGRhdGE6IFQ7XG4gIH0+KCk7XG4gIEBPdXRwdXQoKSByb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcblxuICAvKiogSW50ZXJuYWxseSBtYWludGFpbmVkIGRhdGEsIHdpdGggZ3VhcmFudGVlZCB1bmlxdWVuZXNzIGR1ZSB0byBrZXkgcHJvcGVydHkgKi9cbiAgdGFibGVEYXRhOiBTaWduYWw8RGF0YVdpdGhLZXk8VD5bXT47XG5cbiAgcHJpdmF0ZSBlZGl0aW5nUm93c1NpZ25hbCA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJvd3NTaWduYWwgPSBzaWduYWw8U2V0PHN0cmluZyB8IG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIC8vIHByaXZhdGUgZWRpdGVkRGF0YVNpZ25hbCA9IHNpZ25hbDxNYXA8c3RyaW5nIHwgbnVtYmVyLCBFZGl0ZWREYXRhPFQ+Pj4oXG4gIC8vICAgbmV3IE1hcCgpXG4gIC8vICk7XG4gIHByaXZhdGUgdW5FZGl0ZWREYXRhU2lnbmFsID0gc2lnbmFsPE1hcDxzdHJpbmcgfCBudW1iZXIsIFQ+PihuZXcgTWFwKCkpO1xuICBwcml2YXRlIGZvcm1Hcm91cHNTaWduYWwgPSBzaWduYWw8TWFwPHN0cmluZyB8IG51bWJlciwgRm9ybUdyb3VwPj4obmV3IE1hcCgpKTtcblxuICBjb2x1bW5zU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb2x1bW5zKCkpO1xuXG4gIGRpc3BsYXlDb2x1bW5zOiBTaWduYWw8Q29sdW1uRGVmaW5pdGlvbjxUPltdPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uc1NpZ25hbCgpLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVGVtcGxhdGUgPSB0aGlzLmNvbHVtblRlbXBsYXRlcygpLmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQuY29sdW1uSWQgPT09IGNvbHVtbi5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbFRlbXBsYXRlLFxuICAgICAgICAgICAgY2VsbEVkaXRUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsRWRpdFRlbXBsYXRlLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5mb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVEYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgY29uc3QgZGF0YUtleSA9IHRoaXMuX2dldFJvd0lkQnlEYXRhS2V5KGl0ZW0pO1xuICAgICAgICBpZiAoZGF0YUtleSkge1xuICAgICAgICAgIGtleSA9IGRhdGFLZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gaW5kZXggYXMgRGF0YVdpdGhLZXk8VD5bJ19rZXknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9yaWdpbmFsRGF0YTogaXRlbSxcbiAgICAgICAgICBfa2V5OiBrZXksXG4gICAgICAgICAgX2tleV9wcm9wOiB0aGlzLmRhdGFLZXkoKSA/PyAnX2luZGV4JyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaGFzRm9vdGVyID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zKCkuc29tZSgoY29sKSA9PiBjb2wuZm9vdGVyVGVtcGxhdGUgIT09IHVuZGVmaW5lZClcbiAgKTtcblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByb3dcbiAgcHJpdmF0ZSBfZ2V0Um93SWRCeURhdGFLZXkocm93OiBUKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmRhdGFLZXkoKTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHJvd1trZXldO1xuXG4gICAgICAvLyBDb252ZXJ0IHRvIHN0cmluZyBvciBudW1iZXIgaWYgcG9zc2libGUsIG90aGVyd2lzZSBzdHJpbmdpZnlcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVHlwZSBndWFyZCBtZXRob2QgdG8gY2hlY2sgZm9yIGdyb3VwIHJvd3NcbiAgaXNHcm91cFJvdyhyb3c6IFQpOiByb3cgaXMgVCAmIHsgaXNHcm91cFJvdzogdHJ1ZTsgZ3JvdXBUaXRsZTogYW55IH0ge1xuICAgIHJldHVybiAhIShyb3cgYXMgYW55KS5pc0dyb3VwUm93O1xuICB9XG5cbiAgLy8gQ29tcHV0ZWQgcHJvcGVydHkgZm9yIGdyb3VwZWQgZGF0YVxuXG4gIGdyb3VwZWREYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5ncm91cEJ5KCkpIHJldHVybiB0aGlzLnRhYmxlRGF0YSgpIGFzIEdyb3VwZWREYXRhUm93PFQ+W107XG5cbiAgICBjb25zdCBnZXRHcm91cFZhbHVlID1cbiAgICAgIHR5cGVvZiB0aGlzLmdyb3VwQnkoKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/ICh0aGlzLmdyb3VwQnkoKSBhcyAocm93OiBUKSA9PiBhbnkpXG4gICAgICAgIDogKHJvdzogVCkgPT4gcm93W3RoaXMuZ3JvdXBCeSgpIGFzIGtleW9mIFRdO1xuXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxhbnksIERhdGFXaXRoS2V5PFQ+W10+KCk7XG5cbiAgICB0aGlzLnRhYmxlRGF0YSgpLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgaWYgKGdldEdyb3VwVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBncm91cFZhbHVlID0gZ2V0R3JvdXBWYWx1ZShyb3cub3JpZ2luYWxEYXRhKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IGdyb3Vwcy5nZXQoZ3JvdXBWYWx1ZSkgfHwgW107XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXBWYWx1ZSwgWy4uLmV4aXN0aW5nR3JvdXAsIHJvd10pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZ3JvdXBlZERhdGFBcnJheTogR3JvdXBlZERhdGFSb3c8VD5bXSA9IFtdO1xuXG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwUm93cywgZ3JvdXBWYWx1ZSkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGdyb3VwIGhlYWRlciByb3dcbiAgICAgIGNvbnN0IGdyb3VwUm93OiBHcm91cGVkRGF0YVJvdzxUPiA9IHtcbiAgICAgICAgLi4uKHt9IGFzIERhdGFXaXRoS2V5PFQ+KSwgLy8gQ3JlYXRlIGVtcHR5IG9iamVjdCBvZiB0eXBlIFQgYXMgYmFzZVxuICAgICAgICBfa2V5OiBgZ3JvdXAtJHtncm91cFZhbHVlfWAsXG4gICAgICAgIGlzR3JvdXBSb3c6IHRydWUsXG4gICAgICAgIGdyb3VwVmFsdWUsXG4gICAgICAgIGdyb3VwVGl0bGU6IGdyb3VwVmFsdWUsXG4gICAgICB9O1xuXG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goZ3JvdXBSb3cpO1xuICAgICAgLy8gQWRkIHJlZ3VsYXIgcm93cyB3aXRoIHRoZSBvcHRpb25hbCBpc0dyb3VwUm93IHByb3BlcnR5ICh1bmRlZmluZWQgYnkgZGVmYXVsdClcbiAgICAgIGdyb3VwZWREYXRhQXJyYXkucHVzaCguLi4oZ3JvdXBSb3dzIGFzIEdyb3VwZWREYXRhUm93PFQ+W10pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cGVkRGF0YUFycmF5O1xuICB9KTtcblxuICBnZXRDZWxsVmFsdWUgPSAocm93OiBULCBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pOiBhbnkgPT4ge1xuICAgIC8vIEZvciBncm91cCByb3dzLCByZXR1cm4gdGhlIGdyb3VwIHRpdGxlIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmlzR3JvdXBSb3cocm93KSkge1xuICAgICAgcmV0dXJuIChyb3cgYXMgYW55KS5ncm91cFRpdGxlO1xuICAgIH1cblxuICAgIC8vIEV4aXN0aW5nIGxvZ2ljIGZvciBub3JtYWwgcm93c1xuICAgIGlmIChjb2x1bW4uYWNjZXNzb3JLZXkpIHtcbiAgICAgIHJldHVybiByb3dbY29sdW1uLmFjY2Vzc29yS2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbi5hY2Nlc3NvckZuID8gY29sdW1uLmFjY2Vzc29yRm4ocm93KSA6IHVuZGVmaW5lZDtcbiAgfTtcblxuICBwdWJsaWMgaXNSb3dFZGl0aW5nID0gKHJvd0tleTogRGF0YVdpdGhLZXk8VD5bJ19rZXknXSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdSb3dzU2lnbmFsKCkuaGFzKHJvd0tleSk7XG4gIH07XG5cbiAgcHVibGljIHRvZ2dsZVJvd0VkaXQgPSAocm93SWQ6IERhdGFXaXRoS2V5PFQ+Wydfa2V5J10pID0+IHtcbiAgICBsZXQgZGF0YTogRGF0YVdpdGhLZXk8VD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAtMTtcblxuICAgIHRoaXMudGFibGVEYXRhKCkuZm9yRWFjaCgoZGF0dW0sIGkpID0+IHtcbiAgICAgIGlmIChkYXR1bS5fa2V5ID09PSByb3dJZCkge1xuICAgICAgICBkYXRhID0gZGF0dW07XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy50b2dnbGVSb3dFZGl0SW50ZXJuYWwoZGF0YSwgaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZVJvd0VkaXRJbnRlcm5hbCA9IChyb3c6IERhdGFXaXRoS2V5PFQ+LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5lZGl0aW5nUm93c1NpZ25hbC51cGRhdGUoKHNldCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChzZXQpO1xuICAgICAgaWYgKG5ld1NldC5oYXMocm93Ll9rZXkpKSB7XG4gICAgICAgIG5ld1NldC5kZWxldGUocm93Ll9rZXkpO1xuICAgICAgICB0aGlzLnNhdmVSb3cocm93Ll9rZXksIGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93Ll9rZXkpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVFZGl0ZWREYXRhKHJvdyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUVkaXRlZERhdGEocm93OiBEYXRhV2l0aEtleTxUPikge1xuICAgIGNvbnN0IHJvd0lkID0gcm93Ll9rZXk7XG4gICAgdGhpcy51bkVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93Lm9yaWdpbmFsRGF0YSB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gICAgY29uc3QgZm9ybUdyb3VwQ29uZmlnID0gdGhpcy5mb3JtR3JvdXBDb25maWcoKTtcbiAgICBpZiAoZm9ybUdyb3VwQ29uZmlnKSB7XG4gICAgICBjb25zdCBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKFxuICAgICAgICBmb3JtR3JvdXBDb25maWcuY29udHJvbHMsXG4gICAgICAgIGZvcm1Hcm91cENvbmZpZy52YWxpZGF0b3JPck9wdHMsXG4gICAgICAgIGZvcm1Hcm91cENvbmZpZy5hc3luY1ZhbGlkYXRvclxuICAgICAgKTtcbiAgICAgIGZvcm1Hcm91cC5wYXRjaFZhbHVlKHJvdyBhcyBhbnkpO1xuICAgICAgdGhpcy5mb3JtR3JvdXBzU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgICAgbmV3TWFwLnNldChyb3dJZCwgZm9ybUdyb3VwKTtcbiAgICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZVJvdyhyb3dJZDogc3RyaW5nIHwgbnVtYmVyLCByb3dJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgZWRpdGVkRm9ybSA9IHRoaXMuZm9ybUdyb3Vwc1NpZ25hbCgpLmdldChyb3dJZCk7XG4gICAgY29uc3QgdW5FZGl0ZWREYXRhID0gdGhpcy51bkVkaXRlZERhdGFTaWduYWwoKS5nZXQocm93SWQpO1xuXG4gICAgLy8gaWYgKGVkaXRlZERhdGEpIHtcbiAgICAvLyAgIGNvbnN0IG9yaWdpbmFsUm93ID0gdGhpcy50YWJsZURhdGEoKS5maW5kKChyb3cpID0+IHJvdy5fa2V5ID09PSByb3dJZCk7XG4gICAgLy8gICBpZiAob3JpZ2luYWxSb3cpIHtcbiAgICAvLyAgICAgY29uc3QgdXBkYXRlZFJvdyA9IHsgLi4ub3JpZ2luYWxSb3csIC4uLmVkaXRlZERhdGEgfTtcbiAgICAvLyAgICAgdGhpcy5yb3dTYXZlLmVtaXQodXBkYXRlZFJvdyk7XG4gICAgLy8gICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgIC8vICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAvLyAgICAgICBuZXdNYXAuZGVsZXRlKHJvd0lkKTtcbiAgICAvLyAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBpZiAoZWRpdGVkRm9ybSkge1xuICAgICAgZWRpdGVkRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgZWRpdGVkRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIHRoaXMuZm9ybUdyb3Vwc1NpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICAgIG5ld01hcC5kZWxldGUocm93SWQpO1xuICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJvd1NhdmUuZW1pdCh7XG4gICAgICAgIGluZGV4OiByb3dJbmRleCxcbiAgICAgICAga2V5OiByb3dJZCxcbiAgICAgICAgZGF0YTogZWRpdGVkRm9ybS52YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh1bkVkaXRlZERhdGEpIHtcbiAgICAgIHRoaXMudW5FZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgICAgbmV3TWFwLmRlbGV0ZShyb3dJZCk7XG4gICAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucm93UmV2ZXJ0LmVtaXQoe1xuICAgICAgICBpbmRleDogcm93SW5kZXgsXG4gICAgICAgIGtleTogcm93SWQsXG4gICAgICAgIGRhdGE6IHVuRWRpdGVkRGF0YSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dTZWxlY3RlZCA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuaGFzKHJvd0lkKTtcbiAgfTtcblxuICBwcml2YXRlIHRvZ2dsZVJvd1NlbGVjdGlvbiA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgYWxsUm93c1NlbGVjdGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMuZGF0YSgpLmZpbHRlcigocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdykpO1xuICAgIHJldHVybiAoXG4gICAgICBub25Hcm91cFJvd3MubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID09PSBub25Hcm91cFJvd3MubGVuZ3RoXG4gICAgKTtcbiAgfTtcblxuICBwcml2YXRlIHNvbWVSb3dzU2VsZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgbm9uR3JvdXBSb3dzID0gdGhpcy5kYXRhKCkuZmlsdGVyKChyb3cpID0+ICF0aGlzLmlzR3JvdXBSb3cocm93KSk7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA8IG5vbkdyb3VwUm93cy5sZW5ndGhcbiAgICApO1xuICB9O1xuXG4gIHByaXZhdGUgdG9nZ2xlQWxsUm93cyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5hbGxSb3dzU2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwuc2V0KG5ldyBTZXQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vbkdyb3VwUm93cyA9IHRoaXMudGFibGVEYXRhKCkuZmlsdGVyKFxuICAgICAgICAocm93KSA9PiAhdGhpcy5pc0dyb3VwUm93KHJvdy5vcmlnaW5hbERhdGEpXG4gICAgICApO1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwuc2V0KG5ldyBTZXQobm9uR3JvdXBSb3dzLm1hcCgocm93KSA9PiByb3cuX2tleSkpKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMudGFibGVEYXRhKCkuZmlsdGVyKChyb3cpID0+XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbCgpLmhhcyhyb3cuX2tleSlcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoXG4gICAgICBzZWxlY3RlZFJvd3MubWFwKCh7IG9yaWdpbmFsRGF0YSB9KSA9PiBvcmlnaW5hbERhdGEpXG4gICAgKTtcbiAgfVxuXG4gIGdldEhlYWRlckNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY29sdW1uLFxuICAgICAgY29sdW1uLFxuICAgICAgYWxsUm93c1NlbGVjdGVkOiB0aGlzLmFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHNvbWVSb3dzU2VsZWN0ZWQ6IHRoaXMuc29tZVJvd3NTZWxlY3RlZCxcbiAgICAgIHRvZ2dsZUFsbFJvd3M6IHRoaXMudG9nZ2xlQWxsUm93cyxcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkVmFsdWUoXG4gICAgcm93SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICAvLyB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAvLyAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAvLyAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgLy8gICBpZiAoY29sdW1uLmFjY2Vzc29yS2V5KSB7XG4gICAgLy8gICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93RGF0YSwgW2NvbHVtbi5hY2Nlc3NvcktleV06IHZhbHVlIH0pO1xuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgY29uc29sZS53YXJuKFxuICAgIC8vICAgICAgICdDYW5ub3QgdXBkYXRlIHZhbHVlIGZvciBjb2x1bW4gd2l0aG91dCBhY2Nlc3NvcktleTonLFxuICAgIC8vICAgICAgIGNvbHVtbi5pZFxuICAgIC8vICAgICApO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ld01hcDtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIHVwZGF0ZUVkaXRlZFZhbHVlRm4oXG4gICAgcm93SWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICB2YWx1ZUZuOiAodmFsdWU6IGFueSkgPT4gVCxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIC8vIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgIC8vICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgIC8vICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAvLyAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93RGF0YSwgLi4udmFsdWVGbih2YWx1ZSkgfSk7XG4gICAgLy8gICByZXR1cm4gbmV3TWFwO1xuICAgIC8vIH0pO1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkRGF0YShyb3dJZDogc3RyaW5nIHwgbnVtYmVyLCBkYXRhOiBQYXJ0aWFsPFQ+KSB7XG4gICAgLy8gdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgLy8gICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgLy8gICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgIC8vICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCAuLi5kYXRhIH0pO1xuICAgIC8vICAgcmV0dXJuIG5ld01hcDtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIHVwZGF0ZU5lc3RlZEVkaXRlZFZhbHVlKFxuICAgIHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+LFxuICAgIG5lc3RlZEZpZWxkOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICAvLyB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAvLyAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAvLyAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgLy8gICBpZiAoY29sdW1uLmFjY2Vzc29yS2V5KSB7XG4gICAgLy8gICAgIGNvbnN0IGNvbHVtbkRhdGEgPSAocm93RGF0YVtjb2x1bW4uYWNjZXNzb3JLZXldIGFzIGFueSkgfHwge307XG4gICAgLy8gICAgIG5ld01hcC5zZXQocm93SWQsIHtcbiAgICAvLyAgICAgICAuLi5yb3dEYXRhLFxuICAgIC8vICAgICAgIFtjb2x1bW4uYWNjZXNzb3JLZXldOiB7XG4gICAgLy8gICAgICAgICAuLi5jb2x1bW5EYXRhLFxuICAgIC8vICAgICAgICAgW25lc3RlZEZpZWxkXTogdmFsdWUsXG4gICAgLy8gICAgICAgfSxcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBjb25zb2xlLndhcm4oXG4gICAgLy8gICAgICAgJ0Nhbm5vdCB1cGRhdGUgbmVzdGVkIHZhbHVlIGZvciBjb2x1bW4gd2l0aG91dCBhY2Nlc3NvcktleTonLFxuICAgIC8vICAgICAgIGNvbHVtbi5pZFxuICAgIC8vICAgICApO1xuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIG5ld01hcDtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGdldENlbGxDb250ZXh0KFxuICAgIHJvdzogRGF0YVdpdGhLZXk8VD4sXG4gICAgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+LFxuICAgIHJvd0luZGV4OiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3Qgcm93SWQgPSByb3cuX2tleTtcbiAgICBjb25zdCBpc0VkaXRpbmcgPSB0aGlzLmlzUm93RWRpdGluZyhyb3cuX2tleSk7XG4gICAgLy8gY29uc3QgZWRpdGVkRGF0YSA9IHRoaXMuZWRpdGVkRGF0YVNpZ25hbCgpLmdldChyb3dJZCk7XG4gICAgY29uc3QgZWRpdGVkRm9ybSA9IHRoaXMuZm9ybUdyb3Vwc1NpZ25hbCgpLmdldChyb3dJZCk7XG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSBlZGl0ZWRGb3JtPy5nZXQoY29sdW1uLmZvcm1Db250cm9sTmFtZSB8fCAnJyk7XG5cbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICBpZiAoaXNFZGl0aW5nKSB7XG4gICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgdmFsdWUgPSBmb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIGVsc2UgaWYgKGVkaXRlZERhdGEpIHtcbiAgICAgIC8vICAgaWYgKGNvbHVtbi5hY2Nlc3NvcktleSAmJiBjb2x1bW4uYWNjZXNzb3JLZXkgaW4gZWRpdGVkRGF0YSkge1xuICAgICAgLy8gICAgIC8vIElmIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3JLZXkgYW5kIGl0IGV4aXN0cyBpbiBlZGl0ZWQgZGF0YSwgdXNlIHRoYXRcbiAgICAgIC8vICAgICB2YWx1ZSA9IGVkaXRlZERhdGFbY29sdW1uLmFjY2Vzc29yS2V5XTtcbiAgICAgIC8vICAgfSBlbHNlIGlmIChjb2x1bW4uYWNjZXNzb3JGbikge1xuICAgICAgLy8gICAgIC8vIElmIGNvbHVtbiBoYXMgYW4gYWNjZXNzb3JGbiwgYXBwbHkgaXQgdG8gdGhlIGVkaXRlZCBkYXRhXG4gICAgICAvLyAgICAgdmFsdWUgPSBjb2x1bW4uYWNjZXNzb3JGbih7IC4uLnJvdywgLi4uZWRpdGVkRGF0YSB9KTtcbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAvLyBGYWxsYmFjayB0byBnZXR0aW5nIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCByb3dcbiAgICAgIC8vICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgdmFsdWUgPSB0aGlzLmdldENlbGxWYWx1ZShyb3cub3JpZ2luYWxEYXRhLCBjb2x1bW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2VsbFZhbHVlKHJvdy5vcmlnaW5hbERhdGEsIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdmFsdWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHJvdzogcm93Lm9yaWdpbmFsRGF0YSxcbiAgICAgIGNvbHVtbixcbiAgICAgIHJvd0luZGV4LFxuICAgICAgcm93SWQsXG4gICAgICBpc0VkaXRpbmcsXG4gICAgICBmb3JtQ29udHJvbCxcbiAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuaXNSb3dTZWxlY3RlZChyb3dJZCksXG4gICAgICB0b2dnbGVSb3dTZWxlY3Rpb246ICgpID0+IHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd0VkaXQ6ICgpID0+IHRoaXMudG9nZ2xlUm93RWRpdEludGVybmFsKHJvdywgcm93SW5kZXgpLFxuICAgICAgZGVsZXRlUm93OiAoKSA9PiB0aGlzLmRlbGV0ZVJvdyhyb3dJZCksXG4gICAgICB1cGRhdGVWYWx1ZTogKG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkVmFsdWUocm93SWQsIGNvbHVtbiwgbmV3VmFsdWUpLFxuICAgICAgdXBkYXRlTmVzdGVkVmFsdWU6IChuZXN0ZWRGaWVsZDogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZU5lc3RlZEVkaXRlZFZhbHVlKHJvd0lkLCBjb2x1bW4sIG5lc3RlZEZpZWxkLCBuZXdWYWx1ZSksXG4gICAgICB1cGRhdGVWYWx1ZUZuOiAodmFsdWVGbjogKHZhbHVlOiBhbnkpID0+IFQsIG5ld1ZhbHVlOiBhbnkpID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkVmFsdWVGbihyb3dJZCwgdmFsdWVGbiwgbmV3VmFsdWUpLFxuICAgICAgdXBkYXRlRGF0YTogKG5ld0RhdGE6IFBhcnRpYWw8VD4pID0+XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkRGF0YShyb3dJZCwgbmV3RGF0YSksXG4gICAgfTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm93VG9EZWxldGUgPSB0aGlzLnRhYmxlRGF0YSgpLmZpbmQoKHJvdykgPT4gcm93Ll9rZXkgPT09IHJvd0lkKTtcbiAgICBpZiAocm93VG9EZWxldGUpIHtcbiAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQocm93VG9EZWxldGUub3JpZ2luYWxEYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgZ2V0Rm9vdGVyQ29udGV4dChjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXG4gICAgICBjb2x1bW4sXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIGdldFRhYmxlU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZyxcbiAgICAgIGZvbnRGYW1pbHk6IHRoaXMuc3R5bGVDb25maWcuZm9udEZhbWlseSxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0eWxlQ29uZmlnLmZvbnRTaXplLFxuICAgICAgd2hpdGVTcGFjZTogdGhpcy5zdHlsZUNvbmZpZy53aGl0ZVNwYWNlLFxuICAgICAgbWFyZ2luOiB0aGlzLnN0eWxlQ29uZmlnLm1hcmdpbixcbiAgICAgIGJvcmRlcjogdGhpcy5zdHlsZUNvbmZpZy5ib3JkZXIsXG4gICAgICBib3JkZXJDb2xsYXBzZTogdGhpcy5zdHlsZUNvbmZpZy5ib3JkZXJDb2xsYXBzZSxcbiAgICAgIGJvcmRlclNwYWNpbmc6IHRoaXMuc3R5bGVDb25maWcuYm9yZGVyU3BhY2luZyxcbiAgICAgIHRhYmxlTGF5b3V0OiB0aGlzLnN0eWxlQ29uZmlnLnRhYmxlTGF5b3V0LFxuICAgICAgd2lkdGg6IHRoaXMuc3R5bGVDb25maWcud2lkdGgsXG4gICAgfTtcbiAgfVxuXG4gIGdldEhlYWRlclN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcuaGVhZGVyLFxuICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy5zdGlja3lUb3AgPyAnc3RpY2t5JyA6ICdzdGF0aWMnLFxuICAgICAgdG9wOiB0aGlzLnN0eWxlQ29uZmlnLmhlYWRlcj8uc3RpY2t5VG9wID8gJzAnIDogJ2F1dG8nLFxuICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmhlYWRlcj8uekluZGV4IHx8ICdhdXRvJyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0Rm9vdGVyU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5mb290ZXIsXG4gICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnN0aWNreUJvdHRvbSA/ICdzdGlja3knIDogJ3N0YXRpYycsXG4gICAgICBib3R0b206IHRoaXMuc3R5bGVDb25maWcuZm9vdGVyPy5zdGlja3lCb3R0b20gPyAnMCcgOiAnYXV0bycsXG4gICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuZm9vdGVyPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXRSb3dTdHlsZShyb3dJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCByb3dTdHlsZXMgPSB0aGlzLnN0eWxlQ29uZmlnLnJvd3M7XG4gICAgaWYgKHJvd1N0eWxlcyAmJiAnZXZlbicgaW4gcm93U3R5bGVzICYmICdvZGQnIGluIHJvd1N0eWxlcykge1xuICAgICAgcmV0dXJuIHJvd0luZGV4ICUgMiA9PT0gMCA/IHJvd1N0eWxlcy5ldmVuIDogcm93U3R5bGVzLm9kZDtcbiAgICB9IGVsc2UgaWYgKHJvd1N0eWxlcyAmJiAnbnRoJyBpbiByb3dTdHlsZXMgJiYgcm93U3R5bGVzLm50aCkge1xuICAgICAgY29uc3QgeyBpbnRlcnZhbCwgc3R5bGUgfSA9IHJvd1N0eWxlcy5udGg7XG4gICAgICByZXR1cm4gKHJvd0luZGV4ICsgMSkgJSAoaW50ZXJ2YWwgfHwgMSkgPT09IDAgPyBzdHlsZSA6IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcm93U3R5bGVzIHx8IHt9O1xuICAgIH1cbiAgfVxuXG4gIGdldENlbGxTdHlsZShyb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBpc0ZpcnN0Q29sdW1uID0gY29sSW5kZXggPT09IDA7XG4gICAgY29uc3QgaXNMYXN0Q29sdW1uID0gY29sSW5kZXggPT09IHRoaXMuZGlzcGxheUNvbHVtbnMoKS5sZW5ndGggLSAxO1xuXG4gICAgbGV0IGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5jZWxscyB9O1xuXG4gICAgaWYgKGlzRmlyc3RDb2x1bW4pIHtcbiAgICAgIGNlbGxTdHlsZSA9IHtcbiAgICAgICAgLi4uY2VsbFN0eWxlLFxuICAgICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uLFxuICAgICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdFxuICAgICAgICAgID8gJ3N0aWNreSdcbiAgICAgICAgICA6ICdzdGF0aWMnLFxuICAgICAgICBsZWZ0OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy5zdGlja3lMZWZ0ID8gJzAnIDogJ2F1dG8nLFxuICAgICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNMYXN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uLFxuICAgICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy5zdGlja3lSaWdodFxuICAgICAgICAgID8gJ3N0aWNreSdcbiAgICAgICAgICA6ICdzdGF0aWMnLFxuICAgICAgICByaWdodDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy5zdGlja3lSaWdodCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmxhc3RDb2x1bW4/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAvLyBBcHBseSBib2R5IHN0eWxlcyB0byBhbGwgY2VsbHNcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4uY2VsbFN0eWxlLCAuLi50aGlzLnN0eWxlQ29uZmlnLmJvZHkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2VsbFN0eWxlID0geyAuLi50aGlzLnN0eWxlQ29uZmlnLmhlYWRlciB9O1xuICAgIH1cblxuICAgIHJldHVybiBjZWxsU3R5bGU7XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBzdHlsZXNcbmNvbnN0IGRlZmF1bHRUYWJsZVN0eWxlczogVGFibGVTdHlsZXMgPSB7XG4gIGJvcmRlcjogJzFweCBzb2xpZCAjZTBlMGUwJyxcbiAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICBib3hTaGFkb3c6ICcwIDJweCA0cHggcmdiYSgwLDAsMCwwLjEpJyxcbiAgd2lkdGg6ICcxMDAlJyxcbiAgaGVhZGVyOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIGNvbG9yOiAnIzMzMycsXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyQm90dG9tOiAnMnB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxuICByb3dzOiB7XG4gICAgZXZlbjoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgfSxcbiAgICBvZGQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmOWY5ZjknLFxuICAgIH0sXG4gICAgbnRoOiB7XG4gICAgICBpbnRlcnZhbDogNSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmMGYwZjAnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjZWxsczoge1xuICAgIHBhZGRpbmc6ICcxMnB4IDE2cHgnLFxuICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCAjZTBlMGUwJyxcbiAgfSxcbiAgZm9vdGVyOiB7XG4gICAgYmFja2dyb3VuZENvbG9yOiAnI2Y1ZjVmNScsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgIGNvbG9yOiAnIzMzMycsXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyVG9wOiAnMnB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxufTtcbiIsIjx0YWJsZSBbbmdTdHlsZV09XCJnZXRUYWJsZVN0eWxlKClcIj5cbiAgPHRoZWFkPlxuICAgIDwhLS0gPHRyIFtuZ1N0eWxlXT1cImdldEhlYWRlclN0eWxlKClcIj5cbiAgICAgIDx0aCBjb2xzcGFuPVwiMlwiIHNjb3BlPVwiY29sZ3JvdXBcIj5Hcm91cCAxPC90aD5cbiAgICAgIDx0aCBjb2xzcGFuPVwiMVwiIHNjb3BlPVwiY29sZ3JvdXBcIj5Hcm91cCAyPC90aD5cbiAgICA8L3RyPiAtLT5cblxuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRIZWFkZXJTdHlsZSgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgZGlzcGxheUNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmlkKSB7XG4gICAgICA8dGggW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKC0xLCAkaW5kZXgpXCI+XG4gICAgICAgIEBpZiAoY29sdW1uLmhlYWRlclRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRIZWFkZXJDb250ZXh0KGNvbHVtbilcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICB7eyBjb2x1bW4uaGVhZGVyIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgICB9XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIEBmb3IgKHJvdyBvZiB0YWJsZURhdGEoKTsgdHJhY2sgcm93Ll9rZXk7IGxldCByb3dJbmRleCA9ICRpbmRleCkgeyBAaWZcbiAgICAoaXNHcm91cFJvdyhyb3cub3JpZ2luYWxEYXRhKSkge1xuICAgIDx0ciBjbGFzcz1cImdyb3VwLXJvd1wiIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0luZGV4KVwiPlxuICAgICAgPHRkXG4gICAgICAgIFthdHRyLmNvbHNwYW5dPVwiZGlzcGxheUNvbHVtbnMoKS5sZW5ndGhcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUocm93SW5kZXgsIDApXCJcbiAgICAgID5cbiAgICAgICAge3sgZ2V0Q2VsbFZhbHVlKHJvdy5vcmlnaW5hbERhdGEsIGRpc3BsYXlDb2x1bW5zKClbMF0pIH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgfSBAZWxzZSB7XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0luZGV4KVwiPlxuICAgICAgQGZvciAoY29sdW1uIG9mIGRpc3BsYXlDb2x1bW5zKCk7IHRyYWNrIGNvbHVtbi5pZDsgbGV0IGNvbEluZGV4ID0gJGluZGV4KVxuICAgICAge1xuICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZShyb3dJbmRleCwgY29sSW5kZXgpXCI+XG4gICAgICAgIEBpZiAoaXNSb3dFZGl0aW5nKHJvdy5fa2V5KSAmJiBjb2x1bW4uY2VsbEVkaXRUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmNlbGxFZGl0VGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDZWxsQ29udGV4dChyb3csIGNvbHVtbiwgcm93SW5kZXgpXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIGlmIChjb2x1bW4uY2VsbFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uY2VsbFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q2VsbENvbnRleHQocm93LCBjb2x1bW4sIHJvd0luZGV4KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3cub3JpZ2luYWxEYXRhLCBjb2x1bW4pIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgICB9XG4gICAgPC90cj5cbiAgICB9IH1cbiAgPC90Ym9keT5cbiAgQGlmIChoYXNGb290ZXIoKSkge1xuICA8dGZvb3Q+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEZvb3RlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBkaXNwbGF5Q29sdW1ucygpOyB0cmFjayBjb2x1bW4uaWQpIHtcbiAgICAgIDx0ZCBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUoLTEsICRpbmRleClcIj5cbiAgICAgICAgQGlmIChjb2x1bW4uZm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5mb290ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEZvb3RlckNvbnRleHQoY29sdW1uKVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC90ZD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICA8L3Rmb290PlxuICB9XG48L3RhYmxlPlxuIl19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBYnN0cmFjdENvbnRyb2xPcHRpb25zLFxuICBBc3luY1ZhbGlkYXRvckZuLFxuICBGb3JtQ29udHJvbCxcbiAgVmFsaWRhdG9yRm4sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5EZWZpbml0aW9uPFQ+IHtcbiAgaWQ6IHN0cmluZztcbiAgaGVhZGVyOiBzdHJpbmcgfCAoKGNvbnRleHQ6IGFueSkgPT4gYW55KTtcbiAgYWNjZXNzb3JLZXk/OiBrZXlvZiBUO1xuICBhY2Nlc3NvckZuPzogKHJvdzogVCkgPT4gYW55O1xuICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBjZWxsRWRpdFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBmb290ZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIHNvcnRBY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcbiAgZm9ybUNvbnRyb2xOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBHcm91cGVkRGF0YVJvdzxUPiA9IFQgJiB7XG4gIGlzR3JvdXBSb3c/OiBib29sZWFuO1xuICBncm91cFZhbHVlPzogYW55O1xuICBncm91cFRpdGxlPzogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybUNvbnRyb2xPZjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBGb3JtQ29udHJvbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwQ29uZmlnPFxuICBUQ29udHJvbCBleHRlbmRzIHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH1cbj4ge1xuICBjb250cm9sczogVENvbnRyb2w7XG4gIHZhbGlkYXRvck9yT3B0cz86IFZhbGlkYXRvckZuIHwgVmFsaWRhdG9yRm5bXSB8IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgfCBudWxsO1xuICBhc3luY1ZhbGlkYXRvcj86IEFzeW5jVmFsaWRhdG9yRm4gfCBBc3luY1ZhbGlkYXRvckZuW10gfCBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBFZGl0ZWREYXRhPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXT86IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBQYXJ0aWFsPFRbS10+IDogVFtLXTtcbn07XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZlcmJlbi1uZy11aS9zcmMvbGliL2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBYnN0cmFjdENvbnRyb2xPcHRpb25zLFxuICBBc3luY1ZhbGlkYXRvckZuLFxuICBGb3JtQ29udHJvbCxcbiAgVmFsaWRhdG9yRm4sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5EZWZpbml0aW9uPFQ+IHtcbiAgaWQ6IHN0cmluZztcbiAgaGVhZGVyOiBzdHJpbmcgfCAoKGNvbnRleHQ6IGFueSkgPT4gYW55KTtcbiAgYWNjZXNzb3JLZXk/OiBrZXlvZiBUO1xuICBhY2Nlc3NvckZuPzogKHJvdzogVCkgPT4gYW55O1xuICBjZWxsVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBjZWxsRWRpdFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBmb290ZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIHNvcnRBY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcbiAgZm9ybUNvbnRyb2xOYW1lPzogc3RyaW5nO1xuICBncm91cE5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBleHRlbmRzIFQgd2l0aCBhIF9rZXkgcHJvcGVydHlcbmV4cG9ydCB0eXBlIERhdGFXaXRoS2V5PFQ+ID0ge1xuICBfa2V5OiBzdHJpbmcgfCBudW1iZXI7XG4gIF9rZXlfcHJvcDoga2V5b2YgVCB8ICdfaW5kZXgnO1xuICBvcmlnaW5hbERhdGE6IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBHcm91cGVkRGF0YVJvdzxUPiA9IERhdGFXaXRoS2V5PFQ+ICYge1xuICBpc0dyb3VwUm93PzogYm9vbGVhbjtcbiAgZ3JvdXBWYWx1ZT86IGFueTtcbiAgZ3JvdXBUaXRsZT86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEZvcm1Db250cm9sT2Y8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdPzogRm9ybUNvbnRyb2w7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Hcm91cENvbmZpZzxcbiAgVENvbnRyb2wgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IEFic3RyYWN0Q29udHJvbCB9XG4+IHtcbiAgY29udHJvbHM6IFRDb250cm9sO1xuICB2YWxpZGF0b3JPck9wdHM/OiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW10gfCBBYnN0cmFjdENvbnRyb2xPcHRpb25zIHwgbnVsbDtcbiAgYXN5bmNWYWxpZGF0b3I/OiBBc3luY1ZhbGlkYXRvckZuIHwgQXN5bmNWYWxpZGF0b3JGbltdIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgRWRpdGVkRGF0YTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gUGFydGlhbDxUW0tdPiA6IFRbS107XG59O1xuIl19
@@ -4211,8 +4211,19 @@ class DataTableComponent {
4211
4211
  });
4212
4212
  this.tableData = computed(() => {
4213
4213
  return this.data().map((item, index) => {
4214
- const key = this._getRowIdByDataKey(item) ?? index;
4215
- return { ...item, _key: key };
4214
+ let key;
4215
+ const dataKey = this._getRowIdByDataKey(item);
4216
+ if (dataKey) {
4217
+ key = dataKey;
4218
+ }
4219
+ else {
4220
+ key = index;
4221
+ }
4222
+ return {
4223
+ originalData: item,
4224
+ _key: key,
4225
+ _key_prop: this.dataKey() ?? '_index',
4226
+ };
4216
4227
  });
4217
4228
  });
4218
4229
  }
@@ -4244,7 +4255,7 @@ class DataTableComponent {
4244
4255
  const groups = new Map();
4245
4256
  this.tableData().forEach((row) => {
4246
4257
  if (getGroupValue !== undefined) {
4247
- const groupValue = getGroupValue(row);
4258
+ const groupValue = getGroupValue(row.originalData);
4248
4259
  const existingGroup = groups.get(groupValue) || [];
4249
4260
  groups.set(groupValue, [...existingGroup, row]);
4250
4261
  }
@@ -4276,13 +4287,9 @@ class DataTableComponent {
4276
4287
  }
4277
4288
  return column.accessorFn ? column.accessorFn(row) : undefined;
4278
4289
  };
4279
- isRowEditing = (row) => {
4280
- return this.editingRowsSignal().has(row._key);
4290
+ isRowEditing = (rowKey) => {
4291
+ return this.editingRowsSignal().has(rowKey);
4281
4292
  };
4282
- /**
4283
- * Only exists because some boys started using the method externally
4284
- * and the signature changed. It hurts. Always use 'private', kids.
4285
- * */
4286
4293
  toggleRowEdit = (rowId) => {
4287
4294
  let data = undefined;
4288
4295
  let index = -1;
@@ -4314,7 +4321,7 @@ class DataTableComponent {
4314
4321
  const rowId = row._key;
4315
4322
  this.unEditedDataSignal.update((map) => {
4316
4323
  const newMap = new Map(map);
4317
- newMap.set(rowId, { ...row });
4324
+ newMap.set(rowId, { ...row.originalData });
4318
4325
  return newMap;
4319
4326
  });
4320
4327
  const formGroupConfig = this.formGroupConfig();
@@ -4401,14 +4408,14 @@ class DataTableComponent {
4401
4408
  this.selectedRowsSignal.set(new Set());
4402
4409
  }
4403
4410
  else {
4404
- const nonGroupRows = this.tableData().filter((row) => !this.isGroupRow(row));
4411
+ const nonGroupRows = this.tableData().filter((row) => !this.isGroupRow(row.originalData));
4405
4412
  this.selectedRowsSignal.set(new Set(nonGroupRows.map((row) => row._key)));
4406
4413
  }
4407
4414
  this.emitSelectionChange();
4408
4415
  };
4409
4416
  emitSelectionChange() {
4410
4417
  const selectedRows = this.tableData().filter((row) => this.selectedRowsSignal().has(row._key));
4411
- this.selectionChange.emit(selectedRows);
4418
+ this.selectionChange.emit(selectedRows.map(({ originalData }) => originalData));
4412
4419
  }
4413
4420
  getHeaderContext(column) {
4414
4421
  return {
@@ -4474,7 +4481,7 @@ class DataTableComponent {
4474
4481
  }
4475
4482
  getCellContext(row, column, rowIndex) {
4476
4483
  const rowId = row._key;
4477
- const isEditing = this.isRowEditing(row);
4484
+ const isEditing = this.isRowEditing(row._key);
4478
4485
  // const editedData = this.editedDataSignal().get(rowId);
4479
4486
  const editedForm = this.formGroupsSignal().get(rowId);
4480
4487
  const formControl = editedForm?.get(column.formControlName || '');
@@ -4495,14 +4502,15 @@ class DataTableComponent {
4495
4502
  // value = this.getCellValue(row, column);
4496
4503
  // }
4497
4504
  // }
4505
+ value = this.getCellValue(row.originalData, column);
4498
4506
  }
4499
4507
  else {
4500
- value = this.getCellValue(row, column);
4508
+ value = this.getCellValue(row.originalData, column);
4501
4509
  }
4502
4510
  return {
4503
4511
  $implicit: value,
4504
4512
  value,
4505
- row,
4513
+ row: row.originalData,
4506
4514
  column,
4507
4515
  rowIndex,
4508
4516
  rowId,
@@ -4521,7 +4529,7 @@ class DataTableComponent {
4521
4529
  deleteRow = (rowId) => {
4522
4530
  const rowToDelete = this.tableData().find((row) => row._key === rowId);
4523
4531
  if (rowToDelete) {
4524
- this.rowDelete.emit(rowToDelete);
4532
+ this.rowDelete.emit(rowToDelete.originalData);
4525
4533
  }
4526
4534
  };
4527
4535
  getFooterContext(column) {
@@ -4610,11 +4618,11 @@ class DataTableComponent {
4610
4618
  return cellStyle;
4611
4619
  }
4612
4620
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4613
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowRevert: "rowRevert", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, isSignal: true }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4621
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.10", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, dataKey: { classPropertyName: "dataKey", publicName: "dataKey", isSignal: true, isRequired: false, transformFunction: null }, formGroupConfig: { classPropertyName: "formGroupConfig", publicName: "formGroupConfig", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowRevert: "rowRevert", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective, isSignal: true }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n </tr> -->\n\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row.originalData)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row.originalData, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row._key) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row.originalData, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4614
4622
  }
4615
4623
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: DataTableComponent, decorators: [{
4616
4624
  type: Component,
4617
- args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
4625
+ args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <!-- <tr [ngStyle]=\"getHeaderStyle()\">\n <th colspan=\"2\" scope=\"colgroup\">Group 1</th>\n <th colspan=\"1\" scope=\"colgroup\">Group 2</th>\n </tr> -->\n\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of displayColumns(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track row._key; let rowIndex = $index) { @if\n (isGroupRow(row.originalData)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"displayColumns().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row.originalData, displayColumns()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of displayColumns(); track column.id; let colIndex = $index)\n {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row._key) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row.originalData, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of displayColumns(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
4618
4626
  }], ctorParameters: () => [], propDecorators: { styleConfig: [{
4619
4627
  type: Input
4620
4628
  }], rowEdit: [{