@porscheinformatik/material-addons 16.0.0 → 16.0.2

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.
Files changed (63) hide show
  1. package/esm2022/lib/button/button.mjs +7 -0
  2. package/esm2022/lib/button/button.module.mjs +26 -0
  3. package/esm2022/lib/button/danger-button/danger-button.component.mjs +28 -0
  4. package/esm2022/lib/button/flat-button/link-button.component.mjs +28 -0
  5. package/esm2022/lib/button/icon-button/icon-button.component.mjs +28 -0
  6. package/esm2022/lib/button/mad-basic-button.mjs +39 -0
  7. package/esm2022/lib/button/outline-button/outline-button.component.mjs +28 -0
  8. package/esm2022/lib/button/primary-button/primary-button.component.mjs +28 -0
  9. package/esm2022/lib/card/card.component.mjs +129 -0
  10. package/esm2022/lib/card/card.mjs +2 -0
  11. package/esm2022/lib/card/card.module.mjs +23 -0
  12. package/esm2022/lib/content-panel/content-header/content-header.component.mjs +11 -0
  13. package/esm2022/lib/content-panel/content-panel-container/content-panel-container.component.mjs +11 -0
  14. package/esm2022/lib/content-panel/content-panel-container-content/content-panel-container-content.component.mjs +11 -0
  15. package/esm2022/lib/content-panel/content-panel-container-footer/content-panel-container-footer.component.mjs +11 -0
  16. package/esm2022/lib/content-panel/content-panel.module.mjs +42 -0
  17. package/esm2022/lib/content-panel/main-container/main-container.component.mjs +11 -0
  18. package/esm2022/lib/data-table/data-table-action-type.mjs +6 -0
  19. package/esm2022/lib/data-table/data-table-action.mjs +2 -0
  20. package/esm2022/lib/data-table/data-table-column-definition.mjs +2 -0
  21. package/esm2022/lib/data-table/data-table-column.mjs +2 -0
  22. package/esm2022/lib/data-table/data-table-columns-modal/data-table-columns-modal.component.mjs +103 -0
  23. package/esm2022/lib/data-table/data-table-row.mjs +2 -0
  24. package/esm2022/lib/data-table/data-table.component.mjs +527 -0
  25. package/esm2022/lib/data-table/data-table.mjs +3 -0
  26. package/esm2022/lib/data-table/data-table.module.mjs +81 -0
  27. package/esm2022/lib/flowbar/flowbar.component.mjs +190 -0
  28. package/esm2022/lib/flowbar/flowbar.module.mjs +19 -0
  29. package/esm2022/lib/material-action-button/material-action-button.component.mjs +34 -0
  30. package/esm2022/lib/material-action-button/material-action-button.module.mjs +22 -0
  31. package/esm2022/lib/material-addons.module.mjs +45 -0
  32. package/esm2022/lib/numeric-field/number-format.service.mjs +139 -0
  33. package/esm2022/lib/numeric-field/numeric-field.directive.mjs +295 -0
  34. package/esm2022/lib/numeric-field/numeric-field.mjs +2 -0
  35. package/esm2022/lib/numeric-field/numeric-field.module.mjs +24 -0
  36. package/esm2022/lib/quick-list/base-quick-list.component.mjs +101 -0
  37. package/esm2022/lib/quick-list/quick-list-compact/quick-list-compact.component.mjs +20 -0
  38. package/esm2022/lib/quick-list/quick-list.component.mjs +21 -0
  39. package/esm2022/lib/quick-list/quick-list.mjs +4 -0
  40. package/esm2022/lib/quick-list/quick-list.module.mjs +23 -0
  41. package/esm2022/lib/readonly/readonly-form-field/readonly-form-field.component.mjs +155 -0
  42. package/esm2022/lib/readonly/readonly-form-field-wrapper/readonly-form-field-wrapper.component.mjs +185 -0
  43. package/esm2022/lib/readonly/readonly-form-field.module.mjs +24 -0
  44. package/esm2022/lib/stepper/mad-stepper-animation.mjs +13 -0
  45. package/esm2022/lib/stepper/step-header/step-header.component.mjs +77 -0
  46. package/esm2022/lib/stepper/stepper.component.mjs +159 -0
  47. package/esm2022/lib/stepper/stepper.module.mjs +23 -0
  48. package/esm2022/lib/table/column-header.mjs +2 -0
  49. package/esm2022/lib/table/table-action.mjs +2 -0
  50. package/esm2022/lib/table/table.component.mjs +130 -0
  51. package/esm2022/lib/table/table.mjs +2 -0
  52. package/esm2022/lib/table/table.module.mjs +56 -0
  53. package/esm2022/lib/throttle-click/throttle-click.directive.mjs +38 -0
  54. package/esm2022/lib/throttle-click/throttle-click.module.mjs +18 -0
  55. package/esm2022/lib/toolbar/toolbar-action.interface.mjs +2 -0
  56. package/esm2022/lib/toolbar/toolbar.component.mjs +78 -0
  57. package/esm2022/lib/toolbar/toolbar.module.mjs +56 -0
  58. package/esm2022/lib/toolbar/toolbar.service.mjs +124 -0
  59. package/esm2022/porscheinformatik-material-addons.mjs +5 -0
  60. package/esm2022/public_api.mjs +41 -0
  61. package/fesm2022/porscheinformatik-material-addons.mjs +2983 -0
  62. package/fesm2022/porscheinformatik-material-addons.mjs.map +1 -0
  63. package/package.json +8 -12
@@ -0,0 +1,527 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { MatTableDataSource } from '@angular/material/table';
3
+ import { MatPaginator } from '@angular/material/paginator';
4
+ import { MatSort } from '@angular/material/sort';
5
+ import { DataTableActionType } from './data-table-action-type';
6
+ import { SelectionModel } from '@angular/cdk/collections';
7
+ import { v4 as uuidV4 } from 'uuid';
8
+ import { DataTableColumnsModalComponent } from './data-table-columns-modal/data-table-columns-modal.component';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/material/dialog";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/material/icon";
13
+ import * as i4 from "@angular/material/form-field";
14
+ import * as i5 from "@angular/material/input";
15
+ import * as i6 from "@angular/material/menu";
16
+ import * as i7 from "@angular/material/paginator";
17
+ import * as i8 from "@angular/material/sort";
18
+ import * as i9 from "@angular/material/table";
19
+ import * as i10 from "@angular/material/progress-spinner";
20
+ import * as i11 from "../button/outline-button/outline-button.component";
21
+ import * as i12 from "../button/icon-button/icon-button.component";
22
+ import * as i13 from "@angular/material/checkbox";
23
+ import * as i14 from "@ngx-translate/core";
24
+ export class DataTableComponent {
25
+ set filterValue(filterValue) {
26
+ const filterString = '' + filterValue;
27
+ if (this.dataSource) {
28
+ this.setFilterValue(filterString);
29
+ }
30
+ }
31
+ set displayedColumns(cols) {
32
+ if (!this.displayedColumnDefinition) {
33
+ this.columns = cols ? [...cols] : [];
34
+ this.columnIds = this.columns.map((column) => column.id);
35
+ this.columnIds.unshift(this.ACTION_COLUMN_NAME);
36
+ }
37
+ }
38
+ set displayedColumnDefinition(def) {
39
+ this.selectedColumnDefinion = def;
40
+ this.columns = def.displayedColumns;
41
+ this.columnIds = this.columns.map((column) => column.id);
42
+ this.columnIds.unshift(this.ACTION_COLUMN_NAME);
43
+ }
44
+ set tableData(data) {
45
+ const dataArray = data ? data : [];
46
+ if (!this.dataSource) {
47
+ this.dataSource = new MatTableDataSource(dataArray);
48
+ }
49
+ this.createDataMapsAndSetDisplayedDataSourceData(dataArray);
50
+ }
51
+ set page(page) {
52
+ this.paginatorPageIndex = page.pageIndex;
53
+ this.paginatorPageSize = page.pageSize;
54
+ this.paginatorLength = page.length;
55
+ }
56
+ set columnDefinitions(definitions) {
57
+ this.editableColumnDefinitions = [];
58
+ this.viewableColumnDefinitions = [];
59
+ this.allColumnDefinitions = [...definitions];
60
+ for (const definition of definitions) {
61
+ if (definition.editable) {
62
+ this.editableColumnDefinitions.push(definition);
63
+ }
64
+ if (definition.displayedColumns?.length > 0) {
65
+ this.viewableColumnDefinitions.push(definition);
66
+ }
67
+ }
68
+ }
69
+ set loading(isLoading) {
70
+ this.isLoading = isLoading;
71
+ }
72
+ set defaultPageSize(defaultSize) {
73
+ this.paginatorPageSize = defaultSize;
74
+ }
75
+ set externalPaginator(paginator) {
76
+ this.extPaginator = paginator;
77
+ }
78
+ set paginationEnabled(isPaginationEnabled) {
79
+ this.isPaginationEnabled = isPaginationEnabled;
80
+ this.unsetPageSizeIfNecessary();
81
+ }
82
+ set allColumns(allColumns) {
83
+ this.allAvailableColumns = allColumns;
84
+ if (allColumns && this.showColumnModal) {
85
+ this.openColumnModal();
86
+ }
87
+ }
88
+ set filterEnabled(isFilterEnabled) {
89
+ this.isFilterEnabled = !this.useAsync ? isFilterEnabled : false;
90
+ this.setFilterValue(undefined);
91
+ }
92
+ set forceMode(mode) {
93
+ if (mode === this.SINGLE || mode === this.BATCH || mode === this.NONE) {
94
+ this._forceMode = mode;
95
+ this.mode = mode;
96
+ this.selectionModel.clear();
97
+ this.setActions();
98
+ }
99
+ }
100
+ constructor(matDialog) {
101
+ this.matDialog = matDialog;
102
+ // Translations
103
+ this.filterLabel = 'Filter';
104
+ this.filterPlaceholder = '';
105
+ this.filterColumnsLabel = 'Filter';
106
+ this.filterColumnsPlaceHolder = 'Filter available columns';
107
+ this.noDataText = 'No matching data found';
108
+ this.columnSettingsModalTitleLabel = 'Column settings';
109
+ this.selectedLabel = 'Selected columns';
110
+ this.availableLabel = 'Available columns';
111
+ this.saveLabel = 'Save';
112
+ this.deleteLabel = 'Delete';
113
+ this.cancelLabel = 'Cancel';
114
+ this.infoTextLabel = 'Drag and drop a column to select or reorder it.';
115
+ this.pageSizeOptions = [5, 10, 15];
116
+ this.actions = [];
117
+ this.deleteDefinitionAllowed = false;
118
+ this.useAsync = false;
119
+ this.translateLabels = true;
120
+ this.sortEvent = new EventEmitter();
121
+ this.actionEvent = new EventEmitter();
122
+ this.pageEvent = new EventEmitter();
123
+ this.allColumnsEvent = new EventEmitter();
124
+ this.columnDefinitionChangeEvent = new EventEmitter();
125
+ this.viewDefinitionChangeEvent = new EventEmitter();
126
+ this.ACTION_COLUMN_NAME = '__action__';
127
+ this.SINGLE = DataTableActionType.SINGLE;
128
+ this.BATCH = DataTableActionType.BATCH;
129
+ this.NONE = DataTableActionType.NONE;
130
+ this.tableActions = [];
131
+ this.rowActions = [];
132
+ this.columns = [];
133
+ this.allSelected = false;
134
+ this.rowMap = new Map();
135
+ this.selectionModel = new SelectionModel(true);
136
+ this.allColumnDefinitions = [];
137
+ this.isFilterEnabled = false;
138
+ this.isPaginationEnabled = false;
139
+ this.mode = this.NONE;
140
+ this.isRowClickable = false;
141
+ this.showColumnModal = false;
142
+ this.isLoading = false;
143
+ this.paginatorLength = 0;
144
+ this.paginatorPageIndex = 0;
145
+ this.paginatorPageSize = 50;
146
+ }
147
+ static compare(a, b, sort) {
148
+ const x = a[sort.active];
149
+ const y = b[sort.active];
150
+ const ascending = sort.direction === 'asc';
151
+ switch (typeof x) {
152
+ case 'number':
153
+ return DataTableComponent.compareNumber(x, y, ascending);
154
+ case 'string':
155
+ return DataTableComponent.compareString(x, y, ascending);
156
+ case 'boolean':
157
+ return DataTableComponent.compareBoolean(x, y, ascending);
158
+ default:
159
+ // cannot compare -> return equal
160
+ return 0;
161
+ }
162
+ }
163
+ static compareNumber(x, y, ascending) {
164
+ return ascending ? x - y : y - x;
165
+ }
166
+ static compareString(x, y, ascending) {
167
+ return ascending ? x.localeCompare(y) : y.localeCompare(x);
168
+ }
169
+ static compareBoolean(x, y, ascending) {
170
+ if (x === y) {
171
+ return 0;
172
+ }
173
+ if (ascending) {
174
+ // true first
175
+ return x ? -1 : 1;
176
+ }
177
+ else {
178
+ // false first
179
+ return x ? 1 : -1;
180
+ }
181
+ }
182
+ static transformData(value, transformer, transformerParams) {
183
+ if (!transformer || !(transformer instanceof Function)) {
184
+ return value;
185
+ }
186
+ return transformer(value, transformerParams);
187
+ }
188
+ static generateRowId() {
189
+ return uuidV4();
190
+ }
191
+ static isClickOnRowMenuIcon(event) {
192
+ return event?.target?.classList.contains('mat-icon');
193
+ }
194
+ ngOnInit() {
195
+ this.mode = this.getTableMode();
196
+ this.setActions();
197
+ if (this.mode !== this.NONE) {
198
+ this.isRowClickable = true;
199
+ this.defaultAction = this.rowActions[0];
200
+ }
201
+ }
202
+ ngAfterViewInit() {
203
+ if (!this.useAsync) {
204
+ this.dataSource.paginator = this.paginator;
205
+ this.dataSource.sort = this.sort;
206
+ }
207
+ }
208
+ onColumnSettings(definition) {
209
+ this.showColumnModal = true;
210
+ this.selectedDefinition = definition ? definition : this.allColumnDefinitions[0];
211
+ if (this.allAvailableColumns) {
212
+ this.openColumnModal();
213
+ }
214
+ else {
215
+ // if no complete definitions have been loaded yet send an event so the app can load it
216
+ this.allColumnsEvent.emit();
217
+ }
218
+ }
219
+ onViewDefinition(definition) {
220
+ this.selectedDefinition = definition;
221
+ this.viewDefinitionChangeEvent.emit(definition);
222
+ }
223
+ isCurrentDefinition(definition) {
224
+ return this.selectedDefinition && this.selectedDefinition.id === definition.id;
225
+ }
226
+ get selectedCount() {
227
+ return this.selectionModel?.selected ? this.selectionModel.selected.length : 0;
228
+ }
229
+ get rowCount() {
230
+ return this.getAllDataSourceRowsOfCurrentPage() ? this.getAllDataSourceRowsOfCurrentPage().length : 0;
231
+ }
232
+ getAllDataSourceRowsOfCurrentPage() {
233
+ return this.dataSource?._pageData(this.dataSource.data);
234
+ }
235
+ getSelectedCount(actionType) {
236
+ const count = this.selectedCount;
237
+ if (actionType !== this.BATCH || count < 2) {
238
+ return '';
239
+ }
240
+ return ' (' + count + ')';
241
+ }
242
+ isDisabled(actionType) {
243
+ switch (actionType) {
244
+ case this.SINGLE:
245
+ return this.selectedCount !== 1;
246
+ case this.BATCH:
247
+ return this.selectedCount < 1;
248
+ default:
249
+ return false;
250
+ }
251
+ }
252
+ onToggleSelectAll() {
253
+ // clear all selection first
254
+ this.selectionModel.clear();
255
+ // toggle all checkbox
256
+ this.allSelected = !this.allSelected;
257
+ if (this.allSelected) {
258
+ // select all rows of the current page
259
+ this.getAllDataSourceRowsOfCurrentPage().forEach((row) => {
260
+ if (!row.parentId) {
261
+ this.selectionModel.select('' + row.rowId);
262
+ }
263
+ });
264
+ }
265
+ }
266
+ isSelected(rowId) {
267
+ return this.selectionModel.isSelected(rowId);
268
+ }
269
+ setFilterValue(value) {
270
+ this.dataSource.filter = value?.trim().toLowerCase();
271
+ }
272
+ onRowEvent(event, row, action = this.defaultAction) {
273
+ if (row?.parentId) {
274
+ return;
275
+ }
276
+ switch (this.mode) {
277
+ case this.BATCH:
278
+ this.selectionModel.toggle(row.rowId);
279
+ break;
280
+ case this.SINGLE:
281
+ // emit the default action if the row (not the icon!) was clicked
282
+ if (!!action && !DataTableComponent.isClickOnRowMenuIcon(event)) {
283
+ const selected = [];
284
+ // if ID-generator is provided, return the ID, else return the ACTUAL data
285
+ selected.push(this.idGenerator ? row.rowId : this.rowMap.get(row.rowId)?.actualData);
286
+ this.emitTableAction(action, selected);
287
+ }
288
+ break;
289
+ default:
290
+ // do nothing if mode is NONE (or null)
291
+ return;
292
+ }
293
+ }
294
+ onSortingEvent(sort) {
295
+ if (this.useAsync) {
296
+ this.sortEvent.emit(sort);
297
+ }
298
+ else {
299
+ this.internalSort(sort);
300
+ }
301
+ }
302
+ onPageEvent(event) {
303
+ if (this.useAsync) {
304
+ this.pageEvent.emit(event);
305
+ }
306
+ }
307
+ onTableAction(tableAction) {
308
+ if (!!tableAction) {
309
+ const selection = [];
310
+ for (const selected of this.selectionModel.selected) {
311
+ selection.push(this.idGenerator ? selected : this.rowMap.get(selected)?.actualData);
312
+ }
313
+ tableAction.selected = selection;
314
+ this.actionEvent.emit(tableAction);
315
+ }
316
+ }
317
+ emitTableAction(action, selected) {
318
+ const emitAction = { ...action };
319
+ if (action.type !== this.NONE) {
320
+ emitAction.selected = [...selected];
321
+ }
322
+ this.actionEvent.emit(emitAction);
323
+ }
324
+ generateDisplayedDataElement(rowId, parentId, actualDataElement) {
325
+ const displayedDataElement = {};
326
+ displayedDataElement.rowId = rowId;
327
+ displayedDataElement.parentId = parentId;
328
+ for (const column of this.columns) {
329
+ const actualValue = actualDataElement[column.dataPropertyName];
330
+ displayedDataElement[column.dataPropertyName] = DataTableComponent.transformData(actualValue, column.transformer, column.transformerParams);
331
+ }
332
+ return displayedDataElement;
333
+ }
334
+ internalSort(sort) {
335
+ const sortedData = [...this.dataSource.data].sort((a, b) => DataTableComponent.compare(a, b, sort));
336
+ this.dataSource.data = [...sortedData];
337
+ }
338
+ setActions() {
339
+ this.rowActions = [];
340
+ this.tableActions = [];
341
+ for (const action of this.actions) {
342
+ if (this.mode !== action.hiddenInMode) {
343
+ switch (action.type) {
344
+ case this.SINGLE:
345
+ if (this.mode === this.SINGLE) {
346
+ this.rowActions.push(action);
347
+ }
348
+ else {
349
+ this.tableActions.push(action);
350
+ }
351
+ break;
352
+ case this.BATCH:
353
+ if (this.mode !== this.SINGLE) {
354
+ this.tableActions.push(action);
355
+ }
356
+ break;
357
+ default:
358
+ this.tableActions.push(action);
359
+ }
360
+ }
361
+ }
362
+ }
363
+ createDataMapsAndSetDisplayedDataSourceData(data) {
364
+ const displayedDataList = [];
365
+ this.rowMap.clear();
366
+ if (data?.length > 0) {
367
+ for (const dataEntry of data) {
368
+ const rowId = this.idGenerator ? this.idGenerator(dataEntry) : DataTableComponent.generateRowId();
369
+ const parentId = this.parentIdGenerator ? this.parentIdGenerator(dataEntry) : undefined;
370
+ const displayedDataElement = this.generateDisplayedDataElement(rowId, parentId, dataEntry);
371
+ const dataRow = {
372
+ id: rowId,
373
+ parentId: parentId,
374
+ actualData: dataEntry,
375
+ displayedData: displayedDataElement,
376
+ };
377
+ this.rowMap.set(rowId, dataRow);
378
+ displayedDataList.push(displayedDataElement);
379
+ }
380
+ }
381
+ this.dataSource.data = displayedDataList;
382
+ this.unsetPageSizeIfNecessary();
383
+ }
384
+ openColumnModal() {
385
+ const dialogData = {
386
+ allColumns: this.allAvailableColumns,
387
+ definition: this.selectedDefinition,
388
+ deleteDefinitionAllowed: this.deleteDefinitionAllowed,
389
+ filterColumnsLabel: this.filterColumnsLabel,
390
+ filterColumnsPlaceHolder: this.filterColumnsPlaceHolder,
391
+ noDataText: this.noDataText,
392
+ titleLabel: this.columnSettingsModalTitleLabel,
393
+ selectedLabel: this.selectedLabel,
394
+ availableLabel: this.availableLabel,
395
+ saveLabel: this.saveLabel,
396
+ deleteLabel: this.deleteLabel,
397
+ cancelLabel: this.cancelLabel,
398
+ infoTextLabel: this.infoTextLabel,
399
+ };
400
+ const dialog = this.matDialog.open(DataTableColumnsModalComponent, { data: dialogData });
401
+ dialog.afterClosed().subscribe((result) => {
402
+ // no event on CANCEL
403
+ if (result) {
404
+ this.columnDefinitionChangeEvent.emit(result);
405
+ }
406
+ });
407
+ }
408
+ getTableMode() {
409
+ if (this._forceMode) {
410
+ return this._forceMode;
411
+ }
412
+ if (!this.actions) {
413
+ return this.NONE;
414
+ }
415
+ const distinctActionTypes = new Set();
416
+ for (const rowAction of this.actions) {
417
+ distinctActionTypes.add(rowAction.type);
418
+ }
419
+ if (distinctActionTypes.has(this.BATCH)) {
420
+ return this.BATCH;
421
+ }
422
+ if (distinctActionTypes.has(this.SINGLE)) {
423
+ return this.SINGLE;
424
+ }
425
+ return this.NONE;
426
+ }
427
+ unsetPageSizeIfNecessary() {
428
+ if (!this.useAsync && !this.isPaginationEnabled) {
429
+ const dataCount = this.dataSource.data ? this.dataSource.data.length : 0;
430
+ this.paginatorPageSize = dataCount;
431
+ this.paginatorLength = dataCount;
432
+ }
433
+ }
434
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
435
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: DataTableComponent, selector: "mad-data-table", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", pageSizeOptions: "pageSizeOptions", externalFilter: "externalFilter", actions: "actions", idGenerator: "idGenerator", parentIdGenerator: "parentIdGenerator", deleteDefinitionAllowed: "deleteDefinitionAllowed", useAsync: "useAsync", translateLabels: "translateLabels", filterValue: "filterValue", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", tableData: "tableData", page: "page", columnDefinitions: "columnDefinitions", loading: "loading", defaultPageSize: "defaultPageSize", externalPaginator: "externalPaginator", paginationEnabled: "paginationEnabled", allColumns: "allColumns", filterEnabled: "filterEnabled", forceMode: "forceMode" }, outputs: { sortEvent: "sortEvent", actionEvent: "actionEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"mode === NONE ? 'no-action-cell' : 'row-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"mode === NONE ? 'no-action-cell' : 'row-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"!element.parentId && (mode === BATCH)\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n class=\"no-pointer-events\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"!element.parentId && (mode === SINGLE)\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <!-- data cell to be injected -->\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [class.mad-dt-child-cell]=\"element.parentId\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] }); }
436
+ }
437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: DataTableComponent, decorators: [{
438
+ type: Component,
439
+ args: [{ selector: 'mad-data-table', template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [ngClass]=\"mode === NONE ? 'no-action-cell' : 'row-action-cell'\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" [ngClass]=\"mode === NONE ? 'no-action-cell' : 'row-action-cell'\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"!element.parentId && (mode === BATCH)\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n class=\"no-pointer-events\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"!element.parentId && (mode === SINGLE)\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Cell definitions and rows with injected cells -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <!-- header cell to be injected -->\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <!-- data cell to be injected -->\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [class.mad-dt-child-cell]=\"element.parentId\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <!-- header row where cells will be injected -->\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <!-- data row where cells will be injected -->\n <tr\n mat-row\n [class.clickable-table-row]=\"!row.parentId && isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-cell{width:48px!important;padding-left:8px!important}.no-action-cell{width:8px!important;padding:0}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:8px;margin-left:8px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-mdc-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.no-pointer-events{pointer-events:none}.active-column-definition{color:#000;background-color:#f5f5f5}.mad-dt-child-cell{color:#0009}\n"] }]
440
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { filterLabel: [{
441
+ type: Input
442
+ }], filterPlaceholder: [{
443
+ type: Input
444
+ }], filterColumnsLabel: [{
445
+ type: Input
446
+ }], filterColumnsPlaceHolder: [{
447
+ type: Input
448
+ }], noDataText: [{
449
+ type: Input
450
+ }], columnSettingsModalTitleLabel: [{
451
+ type: Input
452
+ }], selectedLabel: [{
453
+ type: Input
454
+ }], availableLabel: [{
455
+ type: Input
456
+ }], saveLabel: [{
457
+ type: Input
458
+ }], deleteLabel: [{
459
+ type: Input
460
+ }], cancelLabel: [{
461
+ type: Input
462
+ }], infoTextLabel: [{
463
+ type: Input
464
+ }], tableClass: [{
465
+ type: Input
466
+ }], pageSizeOptions: [{
467
+ type: Input
468
+ }], externalFilter: [{
469
+ type: Input
470
+ }], actions: [{
471
+ type: Input
472
+ }], idGenerator: [{
473
+ type: Input
474
+ }], parentIdGenerator: [{
475
+ type: Input
476
+ }], deleteDefinitionAllowed: [{
477
+ type: Input
478
+ }], useAsync: [{
479
+ type: Input
480
+ }], translateLabels: [{
481
+ type: Input
482
+ }], filterValue: [{
483
+ type: Input
484
+ }], displayedColumns: [{
485
+ type: Input
486
+ }], displayedColumnDefinition: [{
487
+ type: Input
488
+ }], tableData: [{
489
+ type: Input
490
+ }], page: [{
491
+ type: Input
492
+ }], columnDefinitions: [{
493
+ type: Input
494
+ }], loading: [{
495
+ type: Input
496
+ }], defaultPageSize: [{
497
+ type: Input
498
+ }], externalPaginator: [{
499
+ type: Input
500
+ }], paginationEnabled: [{
501
+ type: Input
502
+ }], allColumns: [{
503
+ type: Input
504
+ }], filterEnabled: [{
505
+ type: Input
506
+ }], forceMode: [{
507
+ type: Input
508
+ }], sortEvent: [{
509
+ type: Output
510
+ }], actionEvent: [{
511
+ type: Output
512
+ }], pageEvent: [{
513
+ type: Output
514
+ }], allColumnsEvent: [{
515
+ type: Output
516
+ }], columnDefinitionChangeEvent: [{
517
+ type: Output
518
+ }], viewDefinitionChangeEvent: [{
519
+ type: Output
520
+ }], paginator: [{
521
+ type: ViewChild,
522
+ args: [MatPaginator, { static: false }]
523
+ }], sort: [{
524
+ type: ViewChild,
525
+ args: [MatSort, { static: true }]
526
+ }] } });
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVMvRyxNQUFNLE9BQU8sa0JBQWtCO0lBMkI3QixJQUFhLFdBQVcsQ0FBQyxXQUFtQjtRQUMxQyxNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVELElBQWEsZ0JBQWdCLENBQUMsSUFBdUI7UUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVELElBQWEseUJBQXlCLENBQUMsR0FBOEI7UUFDbkUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQWEsU0FBUyxDQUFDLElBQVc7UUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQU0sU0FBUyxDQUFDLENBQUM7U0FDMUQ7UUFDRCxJQUFJLENBQUMsMkNBQTJDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQWEsSUFBSSxDQUFDLElBQWU7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLFdBQXdDO1FBQ3JFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO1lBQ3BDLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNqRDtZQUNELElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDakQ7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFhLE9BQU8sQ0FBQyxTQUFrQjtRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBYSxlQUFlLENBQUMsV0FBbUI7UUFDOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBYSxpQkFBaUIsQ0FBQyxTQUFjO1FBQzNDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLG1CQUE0QjtRQUN6RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQWEsVUFBVSxDQUFDLFVBQTZCO1FBQ25ELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7UUFDdEMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsSUFDSSxhQUFhLENBQUMsZUFBd0I7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELElBQ0ksU0FBUyxDQUFDLElBQVk7UUFDeEIsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUE4Q0QsWUFBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQWhLeEMsZUFBZTtRQUNOLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUN2Qix1QkFBa0IsR0FBRyxRQUFRLENBQUM7UUFDOUIsNkJBQXdCLEdBQUcsMEJBQTBCLENBQUM7UUFDdEQsZUFBVSxHQUFHLHdCQUF3QixDQUFDO1FBQ3RDLGtDQUE2QixHQUFHLGlCQUFpQixDQUFDO1FBQ2xELGtCQUFhLEdBQUcsa0JBQWtCLENBQUM7UUFDbkMsbUJBQWMsR0FBRyxtQkFBbUIsQ0FBQztRQUNyQyxjQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQUcsUUFBUSxDQUFDO1FBQ3ZCLGtCQUFhLEdBQUcsaURBQWlELENBQUM7UUFHbEUsb0JBQWUsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHOUIsWUFBTyxHQUFzQixFQUFFLENBQUM7UUFHaEMsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBRWhDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUE0RnRCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDbEQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLGdDQUEyQixHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBQ2xGLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBSzNFLHVCQUFrQixHQUFHLFlBQVksQ0FBQztRQUNsQyxXQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQ3BDLFVBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFDbEMsU0FBSSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztRQUV6QyxpQkFBWSxHQUFzQixFQUFFLENBQUM7UUFDckMsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFDbkMsWUFBTyxHQUFzQixFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIsV0FBTSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBRXpDLG1CQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsSUFBSSxDQUFDLENBQUM7UUFFbEQseUJBQW9CLEdBQWdDLEVBQUUsQ0FBQztRQU92RCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsU0FBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDakIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUdsQixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO0lBRW9CLENBQUM7SUFFNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFzQixFQUFFLENBQXNCLEVBQUUsSUFBVTtRQUN2RSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUM7UUFDM0MsUUFBUSxPQUFPLENBQUMsRUFBRTtZQUNoQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRCxLQUFLLFNBQVM7Z0JBQ1osT0FBTyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RDtnQkFDRSxpQ0FBaUM7Z0JBQ2pDLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFNBQWtCO1FBQzNELE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsU0FBa0I7UUFDM0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBVSxFQUFFLENBQVUsRUFBRSxTQUFrQjtRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBSSxTQUFTLEVBQUU7WUFDYixhQUFhO1lBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7YUFBTTtZQUNMLGNBQWM7WUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQVUsRUFBRSxXQUFnQixFQUFFLGlCQUFzQjtRQUN2RSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxXQUFXLFlBQVksUUFBUSxDQUFDLEVBQUU7WUFDdEQsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYTtRQUNsQixPQUFPLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLENBQUMsb0JBQW9CLENBQUMsS0FBaUI7UUFDM0MsT0FBUSxLQUFLLEVBQUUsTUFBc0IsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQXNDO1FBQ3JELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjthQUFNO1lBQ0wsdUZBQXVGO1lBQ3ZGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBcUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxVQUFxQztRQUN2RCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsaUNBQWlDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBa0I7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNqQyxJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDMUMsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxVQUFrQjtRQUMzQixRQUFRLFVBQVUsRUFBRTtZQUNsQixLQUFLLElBQUksQ0FBQyxNQUFNO2dCQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxDQUFDLENBQUM7WUFDbEMsS0FBSyxJQUFJLENBQUMsS0FBSztnQkFDYixPQUFPLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzVCLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtvQkFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDNUM7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFhO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWlCLEVBQUUsR0FBUSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYTtRQUNqRSxJQUFJLEdBQUcsRUFBRSxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBQ0QsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEtBQUs7Z0JBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBQ1IsS0FBSyxJQUFJLENBQUMsTUFBTTtnQkFDZCxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMvRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7b0JBQ3BCLDBFQUEwRTtvQkFDMUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3JGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUN4QztnQkFDRCxNQUFNO1lBQ1I7Z0JBQ0UsdUNBQXVDO2dCQUN2QyxPQUFPO1NBQ1Y7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVU7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFnQjtRQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQTRCO1FBQ3hDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNqQixNQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtnQkFDbkQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3JGO1lBQ0QsV0FBVyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQXVCLEVBQUUsUUFBZTtRQUM5RCxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDakMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDN0IsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sNEJBQTRCLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsaUJBQXNCO1FBQzFGLE1BQU0sb0JBQW9CLEdBQTJCLEVBQUUsQ0FBQztRQUN4RCxvQkFBb0IsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25DLG9CQUFvQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekMsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FDOUUsV0FBVyxFQUNYLE1BQU0sQ0FBQyxXQUFXLEVBQ2xCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDekIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxvQkFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVU7UUFDN0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLFVBQVU7UUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUNyQyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7b0JBQ25CLEtBQUssSUFBSSxDQUFDLE1BQU07d0JBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7NEJBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUM5Qjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDaEM7d0JBQ0QsTUFBTTtvQkFDUixLQUFLLElBQUksQ0FBQyxLQUFLO3dCQUNiLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDaEM7d0JBQ0QsTUFBTTtvQkFDUjt3QkFDRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbEM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLDJDQUEyQyxDQUFDLElBQVc7UUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDeEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDM0YsTUFBTSxPQUFPLEdBQWlCO29CQUM1QixFQUFFLEVBQUUsS0FBSztvQkFDVCxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsVUFBVSxFQUFFLFNBQVM7b0JBQ3JCLGFBQWEsRUFBRSxvQkFBb0I7aUJBQ3BDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQzthQUM5QztTQUNGO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDekMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxVQUFVLEdBQXdCO1lBQ3RDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQ25DLHVCQUF1QixFQUFFLElBQUksQ0FBQyx1QkFBdUI7WUFDckQsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1lBQ3ZELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixVQUFVLEVBQUUsSUFBSSxDQUFDLDZCQUE2QjtZQUM5QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN6RixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDeEMscUJBQXFCO1lBQ3JCLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDbEI7UUFDRCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDOUMsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQzs4R0FqZVUsa0JBQWtCO2tHQUFsQixrQkFBa0IsczlDQTRIbEIsWUFBWSx1RUFDWixPQUFPLDhEQ2hKcEIsMmlPQW9MQTs7MkZEakthLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7Z0dBTWpCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRU8sV0FBVztzQkFBdkIsS0FBSztnQkFPTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBUU8seUJBQXlCO3NCQUFyQyxLQUFLO2dCQU9PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBUU8sSUFBSTtzQkFBaEIsS0FBSztnQkFNTyxpQkFBaUI7c0JBQTdCLEtBQUs7Z0JBY08sT0FBTztzQkFBbkIsS0FBSztnQkFJTyxlQUFlO3NCQUEzQixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxpQkFBaUI7c0JBQTdCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSztnQkFRRixhQUFhO3NCQURoQixLQUFLO2dCQU9GLFNBQVM7c0JBRFosS0FBSztnQkFVSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBRXFDLFNBQVM7c0JBQXBELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSixJQUFJO3NCQUF6QyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjdGlvbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb25UeXBlIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjdGlvbi10eXBlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IHY0IGFzIHV1aWRWNCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbiwgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSwgRGF0YVRhYmxlRGlhbG9nRGF0YSB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4tZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBEYXRhVGFibGVSb3cgfSBmcm9tICcuL2RhdGEtdGFibGUtcm93JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gVHJhbnNsYXRpb25zXG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gJ0ZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zID0gWzUsIDEwLCAxNV07XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG5cbiAgQElucHV0KCkgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgaWRHZW5lcmF0b3I6IGFueTtcbiAgQElucHV0KCkgcGFyZW50SWRHZW5lcmF0b3I6IGFueTtcbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSB1c2VBc3luYyA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmFuc2xhdGVMYWJlbHMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJWYWx1ZShmaWx0ZXJWYWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZmlsdGVyU3RyaW5nID0gJycgKyBmaWx0ZXJWYWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlKSB7XG4gICAgICB0aGlzLnNldEZpbHRlclZhbHVlKGZpbHRlclN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGRpc3BsYXllZENvbHVtbnMoY29sczogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICBpZiAoIXRoaXMuZGlzcGxheWVkQ29sdW1uRGVmaW5pdGlvbikge1xuICAgICAgdGhpcy5jb2x1bW5zID0gY29scyA/IFsuLi5jb2xzXSA6IFtdO1xuICAgICAgdGhpcy5jb2x1bW5JZHMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5pZCk7XG4gICAgICB0aGlzLmNvbHVtbklkcy51bnNoaWZ0KHRoaXMuQUNUSU9OX0NPTFVNTl9OQU1FKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1uRGVmaW5pdGlvbihkZWY6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uRGVmaW5pb24gPSBkZWY7XG4gICAgdGhpcy5jb2x1bW5zID0gZGVmLmRpc3BsYXllZENvbHVtbnM7XG4gICAgdGhpcy5jb2x1bW5JZHMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5pZCk7XG4gICAgdGhpcy5jb2x1bW5JZHMudW5zaGlmdCh0aGlzLkFDVElPTl9DT0xVTU5fTkFNRSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFibGVEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgY29uc3QgZGF0YUFycmF5ID0gZGF0YSA/IGRhdGEgOiBbXTtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZTxhbnk+KGRhdGFBcnJheSk7XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlRGF0YU1hcHNBbmRTZXREaXNwbGF5ZWREYXRhU291cmNlRGF0YShkYXRhQXJyYXkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2UocGFnZTogUGFnZUV2ZW50KSB7XG4gICAgdGhpcy5wYWdpbmF0b3JQYWdlSW5kZXggPSBwYWdlLnBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2luYXRvclBhZ2VTaXplID0gcGFnZS5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IHBhZ2UubGVuZ3RoO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNvbHVtbkRlZmluaXRpb25zKGRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10pIHtcbiAgICB0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFsbENvbHVtbkRlZmluaXRpb25zID0gWy4uLmRlZmluaXRpb25zXTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgZGVmaW5pdGlvbnMpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmVkaXRhYmxlKSB7XG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmluaXRpb24uZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkZWZhdWx0U2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBleHRlcm5hbFBhZ2luYXRvcihwYWdpbmF0b3I6IGFueSkge1xuICAgIHRoaXMuZXh0UGFnaW5hdG9yID0gcGFnaW5hdG9yO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2luYXRpb25FbmFibGVkKGlzUGFnaW5hdGlvbkVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQgPSBpc1BhZ2luYXRpb25FbmFibGVkO1xuICAgIHRoaXMudW5zZXRQYWdlU2l6ZUlmTmVjZXNzYXJ5KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsQ29sdW1ucyhhbGxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5zaG93Q29sdW1uTW9kYWwpIHtcbiAgICAgIHRoaXMub3BlbkNvbHVtbk1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGZpbHRlckVuYWJsZWQoaXNGaWx0ZXJFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0ZpbHRlckVuYWJsZWQgPSAhdGhpcy51c2VBc3luYyA/IGlzRmlsdGVyRW5hYmxlZCA6IGZhbHNlO1xuICAgIHRoaXMuc2V0RmlsdGVyVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmb3JjZU1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKG1vZGUgPT09IHRoaXMuU0lOR0xFIHx8IG1vZGUgPT09IHRoaXMuQkFUQ0ggfHwgbW9kZSA9PT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLl9mb3JjZU1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTtcbiAgICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhbGxDb2x1bW5zRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25DaGFuZ2U+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uPigpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogZmFsc2UgfSkgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSkgc29ydDogTWF0U29ydDtcblxuICByZWFkb25seSBBQ1RJT05fQ09MVU1OX05BTUUgPSAnX19hY3Rpb25fXyc7XG4gIHJlYWRvbmx5IFNJTkdMRSA9IERhdGFUYWJsZUFjdGlvblR5cGUuU0lOR0xFO1xuICByZWFkb25seSBCQVRDSCA9IERhdGFUYWJsZUFjdGlvblR5cGUuQkFUQ0g7XG4gIHJlYWRvbmx5IE5PTkUgPSBEYXRhVGFibGVBY3Rpb25UeXBlLk5PTkU7XG5cbiAgdGFibGVBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICByb3dBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBzZWxlY3RlZDogW107XG4gIF9mb3JjZU1vZGU6IHN0cmluZztcbiAgcm93TWFwID0gbmV3IE1hcDxzdHJpbmcsIERhdGFUYWJsZVJvdz4oKTtcbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueVtdPjtcbiAgc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0cnVlKTtcbiAgY29sdW1uSWRzOiBzdHJpbmdbXTtcbiAgYWxsQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXSA9IFtdO1xuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgc2VsZWN0ZWRDb2x1bW5EZWZpbmlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHNlbGVjdGVkRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgZGVmYXVsdEFjdGlvbjogRGF0YVRhYmxlQWN0aW9uO1xuICBpc0ZpbHRlckVuYWJsZWQgPSBmYWxzZTtcbiAgaXNQYWdpbmF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICBtb2RlID0gdGhpcy5OT05FO1xuICBpc1Jvd0NsaWNrYWJsZSA9IGZhbHNlO1xuICBzaG93Q29sdW1uTW9kYWwgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGV4dFBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuXG4gIHBhZ2luYXRvckxlbmd0aCA9IDA7XG4gIHBhZ2luYXRvclBhZ2VJbmRleCA9IDA7XG4gIHBhZ2luYXRvclBhZ2VTaXplID0gNTA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZykge31cblxuICBzdGF0aWMgY29tcGFyZShhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBiOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3J0OiBTb3J0KTogbnVtYmVyIHtcbiAgICBjb25zdCB4ID0gYVtzb3J0LmFjdGl2ZV07XG4gICAgY29uc3QgeSA9IGJbc29ydC5hY3RpdmVdO1xuICAgIGNvbnN0IGFzY2VuZGluZyA9IHNvcnQuZGlyZWN0aW9uID09PSAnYXNjJztcbiAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gRGF0YVRhYmxlQ29tcG9uZW50LmNvbXBhcmVOdW1iZXIoeCwgeSwgYXNjZW5kaW5nKTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZVN0cmluZyh4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZUJvb2xlYW4oeCwgeSwgYXNjZW5kaW5nKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGNhbm5vdCBjb21wYXJlIC0+IHJldHVybiBlcXVhbFxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29tcGFyZU51bWJlcih4OiBudW1iZXIsIHk6IG51bWJlciwgYXNjZW5kaW5nOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYXNjZW5kaW5nID8geCAtIHkgOiB5IC0geDtcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlU3RyaW5nKHg6IHN0cmluZywgeTogc3RyaW5nLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBhc2NlbmRpbmcgPyB4LmxvY2FsZUNvbXBhcmUoeSkgOiB5LmxvY2FsZUNvbXBhcmUoeCk7XG4gIH1cblxuICBzdGF0aWMgY29tcGFyZUJvb2xlYW4oeDogYm9vbGVhbiwgeTogYm9vbGVhbiwgYXNjZW5kaW5nOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgIC8vIHRydWUgZmlyc3RcbiAgICAgIHJldHVybiB4ID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmYWxzZSBmaXJzdFxuICAgICAgcmV0dXJuIHggPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRyYW5zZm9ybURhdGEodmFsdWU6IGFueSwgdHJhbnNmb3JtZXI6IGFueSwgdHJhbnNmb3JtZXJQYXJhbXM6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0cmFuc2Zvcm1lciB8fCAhKHRyYW5zZm9ybWVyIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lcih2YWx1ZSwgdHJhbnNmb3JtZXJQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIGdlbmVyYXRlUm93SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXVpZFY0KCk7XG4gIH1cblxuICBzdGF0aWMgaXNDbGlja09uUm93TWVudUljb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50Py50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1pY29uJyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLmdldFRhYmxlTW9kZSgpO1xuICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIGlmICh0aGlzLm1vZGUgIT09IHRoaXMuTk9ORSkge1xuICAgICAgdGhpcy5pc1Jvd0NsaWNrYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmRlZmF1bHRBY3Rpb24gPSB0aGlzLnJvd0FjdGlvbnNbMF07XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VBc3luYykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgfVxuICB9XG5cbiAgb25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uPzogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb24gPyBkZWZpbml0aW9uIDogdGhpcy5hbGxDb2x1bW5EZWZpbml0aW9uc1swXTtcbiAgICBpZiAodGhpcy5hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy52aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50LmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERlZmluaXRpb24gJiYgdGhpcy5zZWxlY3RlZERlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCA/IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEFsbERhdGFTb3VyY2VSb3dzT2ZDdXJyZW50UGFnZSgpID8gdGhpcy5nZXRBbGxEYXRhU291cmNlUm93c09mQ3VycmVudFBhZ2UoKS5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSB0aGlzLkJBVENIIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyAoJyArIGNvdW50ICsgJyknO1xuICB9XG5cbiAgaXNEaXNhYmxlZChhY3Rpb25UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgdGhpcy5TSU5HTEU6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgIT09IDE7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgPCAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCkuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmICghcm93LnBhcmVudElkKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoJycgKyByb3cucm93SWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkKHJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgb25Sb3dFdmVudChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnksIGFjdGlvbiA9IHRoaXMuZGVmYXVsdEFjdGlvbik6IHZvaWQge1xuICAgIGlmIChyb3c/LnBhcmVudElkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdy5yb3dJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgLy8gZW1pdCB0aGUgZGVmYXVsdCBhY3Rpb24gaWYgdGhlIHJvdyAobm90IHRoZSBpY29uISkgd2FzIGNsaWNrZWRcbiAgICAgICAgaWYgKCEhYWN0aW9uICYmICFEYXRhVGFibGVDb21wb25lbnQuaXNDbGlja09uUm93TWVudUljb24oZXZlbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgICAvLyBpZiBJRC1nZW5lcmF0b3IgaXMgcHJvdmlkZWQsIHJldHVybiB0aGUgSUQsIGVsc2UgcmV0dXJuIHRoZSBBQ1RVQUwgZGF0YVxuICAgICAgICAgIHNlbGVjdGVkLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHJvdy5yb3dJZCA6IHRoaXMucm93TWFwLmdldChyb3cucm93SWQpPy5hY3R1YWxEYXRhKTtcbiAgICAgICAgICB0aGlzLmVtaXRUYWJsZUFjdGlvbihhY3Rpb24sIHNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgbW9kZSBpcyBOT05FIChvciBudWxsKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgb25Tb3J0aW5nRXZlbnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZUFzeW5jKSB7XG4gICAgICB0aGlzLnNvcnRFdmVudC5lbWl0KHNvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmludGVybmFsU29ydChzb3J0KTtcbiAgICB9XG4gIH1cblxuICBvblBhZ2VFdmVudChldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlQXN5bmMpIHtcbiAgICAgIHRoaXMucGFnZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGFibGVBY3Rpb24odGFibGVBY3Rpb246IERhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIGlmICghIXRhYmxlQWN0aW9uKSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb246IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkIG9mIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgc2VsZWN0aW9uLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHNlbGVjdGVkIDogdGhpcy5yb3dNYXAuZ2V0KHNlbGVjdGVkKT8uYWN0dWFsRGF0YSk7XG4gICAgICB9XG4gICAgICB0YWJsZUFjdGlvbi5zZWxlY3RlZCA9IHNlbGVjdGlvbjtcbiAgICAgIHRoaXMuYWN0aW9uRXZlbnQuZW1pdCh0YWJsZUFjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFibGVBY3Rpb24oYWN0aW9uOiBEYXRhVGFibGVBY3Rpb24sIHNlbGVjdGVkOiBhbnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IGVtaXRBY3Rpb24gPSB7IC4uLmFjdGlvbiB9O1xuICAgIGlmIChhY3Rpb24udHlwZSAhPT0gdGhpcy5OT05FKSB7XG4gICAgICBlbWl0QWN0aW9uLnNlbGVjdGVkID0gWy4uLnNlbGVjdGVkXTtcbiAgICB9XG4gICAgdGhpcy5hY3Rpb25FdmVudC5lbWl0KGVtaXRBY3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURpc3BsYXllZERhdGFFbGVtZW50KHJvd0lkOiBzdHJpbmcsIHBhcmVudElkOiBzdHJpbmcsIGFjdHVhbERhdGFFbGVtZW50OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IGRpc3BsYXllZERhdGFFbGVtZW50OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZGlzcGxheWVkRGF0YUVsZW1lbnQucm93SWQgPSByb3dJZDtcbiAgICBkaXNwbGF5ZWREYXRhRWxlbWVudC5wYXJlbnRJZCA9IHBhcmVudElkO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxEYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV07XG4gICAgICBkaXNwbGF5ZWREYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV0gPSBEYXRhVGFibGVDb21wb25lbnQudHJhbnNmb3JtRGF0YShcbiAgICAgICAgYWN0dWFsVmFsdWUsXG4gICAgICAgIGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgY29sdW1uLnRyYW5zZm9ybWVyUGFyYW1zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXllZERhdGFFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNvcnQoc29ydDogU29ydCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGFdLnNvcnQoKGEsIGIpID0+IERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlKGEsIGIsIHNvcnQpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi5zb3J0ZWREYXRhXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubW9kZSAhPT0gYWN0aW9uLmhpZGRlbkluTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuU0lOR0xFKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLlNJTkdMRSkge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy50YWJsZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUxpc3QgPSBbXTtcbiAgICB0aGlzLnJvd01hcC5jbGVhcigpO1xuICAgIGlmIChkYXRhPy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGRhdGFFbnRyeSBvZiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IHJvd0lkID0gdGhpcy5pZEdlbmVyYXRvciA/IHRoaXMuaWRHZW5lcmF0b3IoZGF0YUVudHJ5KSA6IERhdGFUYWJsZUNvbXBvbmVudC5nZW5lcmF0ZVJvd0lkKCk7XG4gICAgICAgIGNvbnN0IHBhcmVudElkID0gdGhpcy5wYXJlbnRJZEdlbmVyYXRvciA/IHRoaXMucGFyZW50SWRHZW5lcmF0b3IoZGF0YUVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQgPSB0aGlzLmdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQsIHBhcmVudElkLCBkYXRhRW50cnkpO1xuICAgICAgICBjb25zdCBkYXRhUm93OiBEYXRhVGFibGVSb3cgPSB7XG4gICAgICAgICAgaWQ6IHJvd0lkLFxuICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRJZCxcbiAgICAgICAgICBhY3R1YWxEYXRhOiBkYXRhRW50cnksXG4gICAgICAgICAgZGlzcGxheWVkRGF0YTogZGlzcGxheWVkRGF0YUVsZW1lbnQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm93TWFwLnNldChyb3dJZCwgZGF0YVJvdyk7XG4gICAgICAgIGRpc3BsYXllZERhdGFMaXN0LnB1c2goZGlzcGxheWVkRGF0YUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGRpc3BsYXllZERhdGFMaXN0O1xuICAgIHRoaXMudW5zZXRQYWdlU2l6ZUlmTmVjZXNzYXJ5KCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Db2x1bW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dEYXRhOiBEYXRhVGFibGVEaWFsb2dEYXRhID0ge1xuICAgICAgYWxsQ29sdW1uczogdGhpcy5hbGxBdmFpbGFibGVDb2x1bW5zLFxuICAgICAgZGVmaW5pdGlvbjogdGhpcy5zZWxlY3RlZERlZmluaXRpb24sXG4gICAgICBkZWxldGVEZWZpbml0aW9uQWxsb3dlZDogdGhpcy5kZWxldGVEZWZpbml0aW9uQWxsb3dlZCxcbiAgICAgIGZpbHRlckNvbHVtbnNMYWJlbDogdGhpcy5maWx0ZXJDb2x1bW5zTGFiZWwsXG4gICAgICBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXI6IHRoaXMuZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyLFxuICAgICAgbm9EYXRhVGV4dDogdGhpcy5ub0RhdGFUZXh0LFxuICAgICAgdGl0bGVMYWJlbDogdGhpcy5jb2x1bW5TZXR0aW5nc01vZGFsVGl0bGVMYWJlbCxcbiAgICAgIHNlbGVjdGVkTGFiZWw6IHRoaXMuc2VsZWN0ZWRMYWJlbCxcbiAgICAgIGF2YWlsYWJsZUxhYmVsOiB0aGlzLmF2YWlsYWJsZUxhYmVsLFxuICAgICAgc2F2ZUxhYmVsOiB0aGlzLnNhdmVMYWJlbCxcbiAgICAgIGRlbGV0ZUxhYmVsOiB0aGlzLmRlbGV0ZUxhYmVsLFxuICAgICAgY2FuY2VsTGFiZWw6IHRoaXMuY2FuY2VsTGFiZWwsXG4gICAgICBpbmZvVGV4dExhYmVsOiB0aGlzLmluZm9UZXh0TGFiZWwsXG4gICAgfTtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLm1hdERpYWxvZy5vcGVuKERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCwgeyBkYXRhOiBkaWFsb2dEYXRhIH0pO1xuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAvLyBubyBldmVudCBvbiBDQU5DRUxcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQuZW1pdChyZXN1bHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJsZU1vZGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fZm9yY2VNb2RlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZm9yY2VNb2RlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hY3Rpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5OT05FO1xuICAgIH1cbiAgICBjb25zdCBkaXN0aW5jdEFjdGlvblR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3dBY3Rpb24gb2YgdGhpcy5hY3Rpb25zKSB7XG4gICAgICBkaXN0aW5jdEFjdGlvblR5cGVzLmFkZChyb3dBY3Rpb24udHlwZSk7XG4gICAgfVxuICAgIGlmIChkaXN0aW5jdEFjdGlvblR5cGVzLmhhcyh0aGlzLkJBVENIKSkge1xuICAgICAgcmV0dXJuIHRoaXMuQkFUQ0g7XG4gICAgfVxuICAgIGlmIChkaXN0aW5jdEFjdGlvblR5cGVzLmhhcyh0aGlzLlNJTkdMRSkpIHtcbiAgICAgIHJldHVybiB0aGlzLlNJTkdMRTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuTk9ORTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zZXRQYWdlU2l6ZUlmTmVjZXNzYXJ5KCkge1xuICAgIGlmICghdGhpcy51c2VBc3luYyAmJiAhdGhpcy5pc1BhZ2luYXRpb25FbmFibGVkKSB7XG4gICAgICBjb25zdCBkYXRhQ291bnQgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSA/IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA6IDA7XG4gICAgICB0aGlzLnBhZ2luYXRvclBhZ2VTaXplID0gZGF0YUNvdW50O1xuICAgICAgdGhpcy5wYWdpbmF0b3JMZW5ndGggPSBkYXRhQ291bnQ7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibWFkLWRhdGF0YWJsZS1hY3Rpb24tYmFyXCI+XG4gIDwhLS0gVGFibGUgYWN0aW9uczogZGlzcGxheWVkIGJlZm9yZSB0aGUgdGFibGUgLS0+XG4gIDxkaXYgKm5nSWY9XCJ0YWJsZUFjdGlvbnM/Lmxlbmd0aFwiPlxuICAgIDxtYWQtb3V0bGluZS1idXR0b25cbiAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKHRhYmxlQWN0aW9uLnR5cGUpXCJcbiAgICAgIGNsYXNzPVwidGFibGUtYWN0aW9uXCJcbiAgICAgICpuZ0Zvcj1cImxldCB0YWJsZUFjdGlvbiBvZiB0YWJsZUFjdGlvbnNcIlxuICAgICAgKGNsaWNrKT1cIm9uVGFibGVBY3Rpb24odGFibGVBY3Rpb24pXCI+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAodGFibGVBY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUpIDogdGFibGVBY3Rpb24ubGFiZWwgfX0ge3sgZ2V0U2VsZWN0ZWRDb3VudCh0YWJsZUFjdGlvbi50eXBlKSB9fVxuICAgIDwvbWFkLW91dGxpbmUtYnV0dG9uPlxuICA8L2Rpdj5cbiAgPCEtLSBUYWJsZSBmaWx0ZXIgLS0+XG4gIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImlzRmlsdGVyRW5hYmxlZFwiPlxuICAgIDxtYXQtbGFiZWw+e3sgdHJhbnNsYXRlTGFiZWxzID8gKGZpbHRlckxhYmVsIHwgdHJhbnNsYXRlKSA6IGZpbHRlckxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IG1hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIChrZXl1cCk9XCJzZXRGaWx0ZXJWYWx1ZSgkZXZlbnQ/LnRhcmdldD8udmFsdWUpXCJcbiAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBmaWx0ZXJQbGFjZWhvbGRlciB9fVwiIC8+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cblxuXG48IS0tIFJvdyBhY3Rpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjcm93QWN0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1lbGVtZW50PVwiZWxlbWVudFwiPlxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHJvd0FjdGlvbiBvZiByb3dBY3Rpb25zXCIgbWF0LW1lbnUtaXRlbSBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50LCByb3dBY3Rpb24pXCI+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAocm93QWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IHJvd0FjdGlvbi5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBlZGl0YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI2VkaXRhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBkZWZpbml0aW9uIG9mIGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnNcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgY2xhc3M9XCJyb3ctYWN0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKGRlZmluaXRpb24pXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKX1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gdmlld2FibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICN2aWV3YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiB2aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WaWV3RGVmaW5pdGlvbihkZWZpbml0aW9uKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1jb2x1bW4tZGVmaW5pdGlvbic6IGlzQ3VycmVudERlZmluaXRpb24oZGVmaW5pdGlvbil9XCJcbiAgICA+XG4gICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBkZWZpbml0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIFRhYmxlIC0tPlxuPGRpdiAqbmdJZj1cInJvd0NvdW50ID4gMDsgZWxzZSBub0RhdGFcIiBjbGFzcz1cImRhdGF0YWJsZVwiIFtjbGFzc109XCJ0YWJsZUNsYXNzXCI+XG4gIDxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLXNwaW5uZXItd3JhcHBlclwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgbWF0U29ydCAobWF0U29ydENoYW5nZSk9XCJvblNvcnRpbmdFdmVudCgkZXZlbnQpXCI+XG4gICAgPCEtLSBSb3cgYWN0aW9ucyBjb2x1bW4tLT5cbiAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiQUNUSU9OX0NPTFVNTl9OQU1FXCI+XG4gICAgICA8dGggc2NvcGU9XCJjb2xcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW25nQ2xhc3NdPVwibW9kZSA9PT0gTk9ORSA/ICduby1hY3Rpb24tY2VsbCcgOiAncm93LWFjdGlvbi1jZWxsJ1wiPlxuICAgICAgICA8IS0tIEJBVENIOiBtYXN0ZXIgY2hlY2tib3ggLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSBCQVRDSFwiIGNsYXNzPVwibWFkLWRhdGF0YWJsZS1jaGVja2JveC1jb250YWluZXJcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU0lOR0xFIC8gTk9ORTogbm90aGluZyBpbiBoZWFkZXIgcm93IC0tPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgW25nQ2xhc3NdPVwibW9kZSA9PT0gTk9ORSA/ICduby1hY3Rpb24tY2VsbCcgOiAncm93LWFjdGlvbi1jZWxsJ1wiPlxuICAgICAgICA8IS0tIEJBVENIOiByb3cgY2hlY2tib3ggLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZWxlbWVudC5wYXJlbnRJZCAmJiAobW9kZSA9PT0gQkFUQ0gpXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgIGNsYXNzPVwibm8tcG9pbnRlci1ldmVudHNcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChlbGVtZW50LnJvd0lkKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCIhZWxlbWVudC5wYXJlbnRJZCAmJiAobW9kZSA9PT0gU0lOR0xFKVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IGVsZW1lbnQ6IGVsZW1lbnQgfVwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJyb3dBY3Rpb25NZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBOT05FOiBub3RoaW5nIC0tPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIENlbGwgZGVmaW5pdGlvbnMgYW5kIHJvd3Mgd2l0aCBpbmplY3RlZCBjZWxscyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICA8IS0tIGhlYWRlciBjZWxsIHRvIGJlIGluamVjdGVkIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi5pc1NvcnRhYmxlOyBlbHNlIG5vU29ydFwiPlxuICAgICAgICA8dGhcbiAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICBtYXQtc29ydC1oZWFkZXI9XCJ7eyBjb2x1bW4ub3JkZXJCeU5hbWU/IGNvbHVtbi5vcmRlckJ5TmFtZSA6IGNvbHVtbi5kYXRhUHJvcGVydHlOYW1lIH19XCJcbiAgICAgICAgICBbYXJyb3dQb3NpdGlvbl09XCJjb2x1bW4uaXNSaWdodEFsaWduZWQgPyAnYmVmb3JlJyA6ICdhZnRlcidcIlxuICAgICAgICAgIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0cmFuc2xhdGVMYWJlbHMgPyAoY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICA8L3RoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI25vU29ydD5cbiAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiPlxuICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPCEtLSBkYXRhIGNlbGwgdG8gYmUgaW5qZWN0ZWQgLS0+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiIFtjbGFzcy5tYWQtZHQtY2hpbGQtY2VsbF09XCJlbGVtZW50LnBhcmVudElkXCIgW25nU3dpdGNoXT1cImNvbHVtbi50cmFuc2Zvcm1lclwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7eyBlbGVtZW50W2NvbHVtbi5kYXRhUHJvcGVydHlOYW1lXSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gaGVhZGVyIHJvdyB3aGVyZSBjZWxscyB3aWxsIGJlIGluamVjdGVkIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzXCI+PC90cj5cbiAgICA8IS0tIGRhdGEgcm93IHdoZXJlIGNlbGxzIHdpbGwgYmUgaW5qZWN0ZWQgLS0+XG4gICAgPHRyXG4gICAgICBtYXQtcm93XG4gICAgICBbY2xhc3MuY2xpY2thYmxlLXRhYmxlLXJvd109XCIhcm93LnBhcmVudElkICYmIGlzUm93Q2xpY2thYmxlXCJcbiAgICAgIChjbGljayk9XCJvblJvd0V2ZW50KCRldmVudCwgcm93KVwiXG4gICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzXCJcbiAgICA+PC90cj5cbiAgPC90YWJsZT5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWJvdHRvbS1hcmVhXCI+XG4gIDxkaXYgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20taW5mby1hcmVhXCI+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IDEgZGVmaW5pdGlvbiAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAqbmdJZj1cInRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoID09IDFcIlxuICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoKVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj52aWV3X2NvbHVtbjwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gICAgPCEtLSBjb2x1bW4gc2V0dGluZ3M6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b25cbiAgICAgICpuZ0lmPVwidGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zPy5sZW5ndGggPiAwXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImVkaXRhYmxlRGVmaW5pdGlvbk1lbnVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj52aWV3X2NvbHVtbjwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gICAgPCEtLSBjb2x1bW4gdmlldzogbXVsdGlwbGUgZGVmaW5pdGlvbnMgLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJ0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld2FibGVEZWZpbml0aW9uTWVudVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPnByZXZpZXc8L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gIDxtYXQtcGFnaW5hdG9yXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiaXNQYWdpbmF0aW9uRW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSdcIlxuICAgIFtsZW5ndGhdPVwicGFnaW5hdG9yTGVuZ3RoXCJcbiAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRvclBhZ2VJbmRleFwiXG4gICAgW3BhZ2VTaXplXT1cInBhZ2luYXRvclBhZ2VTaXplXCJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgKHBhZ2UpPVwib25QYWdlRXZlbnQoJGV2ZW50KVwiXG4gICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcbiAgPlxuICA8L21hdC1wYWdpbmF0b3I+XG48L2Rpdj5cblxuPCEtLSBObyBkYXRhIGFsZXJ0IC0tPlxuPG5nLXRlbXBsYXRlICNub0RhdGE+XG4gIDxkaXYgY2xhc3M9XCJub0RhdGFUZXh0XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNTBcIiBbc3Ryb2tlV2lkdGhdPVwiM1wiPjwvbWF0LXNwaW5uZXI+XG4gICAgPC9kaXY+XG4gICAge3sgbm9EYXRhVGV4dCB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=