@onecx/angular-accelerator 4.11.0

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 (130) hide show
  1. package/README.md +7 -0
  2. package/assets/i18n/de.json +130 -0
  3. package/assets/i18n/en.json +130 -0
  4. package/assets/images/placeholder.png +0 -0
  5. package/assets/styles.scss +8 -0
  6. package/esm2020/index.mjs +49 -0
  7. package/esm2020/lib/angular-accelerator-primeng.module.mjs +83 -0
  8. package/esm2020/lib/angular-accelerator.module.mjs +209 -0
  9. package/esm2020/lib/components/column-group-selection/column-group-selection.component.mjs +72 -0
  10. package/esm2020/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +108 -0
  11. package/esm2020/lib/components/data-layout-selection/data-layout-selection.component.mjs +45 -0
  12. package/esm2020/lib/components/data-list-grid/data-list-grid.component.mjs +358 -0
  13. package/esm2020/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +92 -0
  14. package/esm2020/lib/components/data-sort-base/data-sort-base.mjs +110 -0
  15. package/esm2020/lib/components/data-table/data-table.component.mjs +350 -0
  16. package/esm2020/lib/components/data-view/data-view.component.mjs +355 -0
  17. package/esm2020/lib/components/diagram/diagram.component.mjs +136 -0
  18. package/esm2020/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +109 -0
  19. package/esm2020/lib/components/interactive-data-view/interactive-data-view.component.mjs +342 -0
  20. package/esm2020/lib/components/page-header/page-header.component.mjs +189 -0
  21. package/esm2020/lib/components/search-config/search-config.component.mjs +34 -0
  22. package/esm2020/lib/components/search-header/search-header.component.mjs +136 -0
  23. package/esm2020/lib/directives/if-breakpoint.directive.mjs +39 -0
  24. package/esm2020/lib/directives/if-permission.directive.mjs +53 -0
  25. package/esm2020/lib/functions/flatten-object.mjs +20 -0
  26. package/esm2020/lib/model/breadcrumb-menu-item.model.mjs +2 -0
  27. package/esm2020/lib/model/column-type.model.mjs +9 -0
  28. package/esm2020/lib/model/data-action.mjs +2 -0
  29. package/esm2020/lib/model/data-column-name-id.model.mjs +2 -0
  30. package/esm2020/lib/model/data-sort-direction.mjs +2 -0
  31. package/esm2020/lib/model/data-table-column.model.mjs +2 -0
  32. package/esm2020/lib/model/diagram-column.mjs +2 -0
  33. package/esm2020/lib/model/diagram-data.mjs +2 -0
  34. package/esm2020/lib/model/diagram-type.mjs +2 -0
  35. package/esm2020/lib/model/search-config-info.mjs +2 -0
  36. package/esm2020/lib/pipes/dynamic.pipe.mjs +58 -0
  37. package/esm2020/lib/pipes/ocxtimeago.pipe.mjs +15 -0
  38. package/esm2020/lib/services/breadcrumb.service.mjs +79 -0
  39. package/esm2020/lib/services/translation-cache.service.mjs +54 -0
  40. package/esm2020/lib/utils/async-translate-loader.utils.mjs +12 -0
  41. package/esm2020/lib/utils/caching-translate-loader.utils.mjs +15 -0
  42. package/esm2020/lib/utils/colorutils.mjs +19 -0
  43. package/esm2020/lib/utils/create-translate-loader.utils.mjs +23 -0
  44. package/esm2020/lib/utils/dateutils.mjs +32 -0
  45. package/esm2020/lib/utils/objectutils.mjs +30 -0
  46. package/esm2020/lib/utils/ocxtimeagointl.utils.mjs +34 -0
  47. package/esm2020/lib/utils/primeicon.utils.mjs +2 -0
  48. package/esm2020/lib/utils/translate.combined.loader.mjs +36 -0
  49. package/esm2020/onecx-angular-accelerator.mjs +5 -0
  50. package/esm2020/testing/column-group-selection.harness.mjs +10 -0
  51. package/esm2020/testing/custom-group-column-selector.harness.mjs +31 -0
  52. package/esm2020/testing/data-layout-selection.harness.mjs +33 -0
  53. package/esm2020/testing/data-list-grid.harness.mjs +47 -0
  54. package/esm2020/testing/data-table.harness.mjs +57 -0
  55. package/esm2020/testing/data-view.harness.mjs +12 -0
  56. package/esm2020/testing/default-grid-item.harness.mjs +24 -0
  57. package/esm2020/testing/default-list-item.harness.mjs +24 -0
  58. package/esm2020/testing/diagram.harness.mjs +22 -0
  59. package/esm2020/testing/index.mjs +17 -0
  60. package/esm2020/testing/interactive-data-view.harness.mjs +19 -0
  61. package/esm2020/testing/more-actions-menu-button.harness.mjs +35 -0
  62. package/esm2020/testing/onecx-angular-accelerator-testing.mjs +5 -0
  63. package/esm2020/testing/page-header.harness.mjs +36 -0
  64. package/esm2020/testing/search-config.harness.mjs +10 -0
  65. package/fesm2015/onecx-angular-accelerator-testing.mjs +430 -0
  66. package/fesm2015/onecx-angular-accelerator-testing.mjs.map +1 -0
  67. package/fesm2015/onecx-angular-accelerator.mjs +3118 -0
  68. package/fesm2015/onecx-angular-accelerator.mjs.map +1 -0
  69. package/fesm2020/onecx-angular-accelerator-testing.mjs +338 -0
  70. package/fesm2020/onecx-angular-accelerator-testing.mjs.map +1 -0
  71. package/fesm2020/onecx-angular-accelerator.mjs +3085 -0
  72. package/fesm2020/onecx-angular-accelerator.mjs.map +1 -0
  73. package/index.d.ts +38 -0
  74. package/lib/angular-accelerator-primeng.module.d.ts +16 -0
  75. package/lib/angular-accelerator.module.d.ts +32 -0
  76. package/lib/components/column-group-selection/column-group-selection.component.d.ts +28 -0
  77. package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +45 -0
  78. package/lib/components/data-layout-selection/data-layout-selection.component.d.ts +25 -0
  79. package/lib/components/data-list-grid/data-list-grid.component.d.ts +120 -0
  80. package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +30 -0
  81. package/lib/components/data-sort-base/data-sort-base.d.ts +32 -0
  82. package/lib/components/data-table/data-table.component.d.ts +124 -0
  83. package/lib/components/data-view/data-view.component.d.ts +112 -0
  84. package/lib/components/diagram/diagram.component.d.ts +43 -0
  85. package/lib/components/group-by-count-diagram/group-by-count-diagram.component.d.ts +39 -0
  86. package/lib/components/interactive-data-view/interactive-data-view.component.d.ts +108 -0
  87. package/lib/components/page-header/page-header.component.d.ts +90 -0
  88. package/lib/components/search-config/search-config.component.d.ts +16 -0
  89. package/lib/components/search-header/search-header.component.d.ts +46 -0
  90. package/lib/directives/if-breakpoint.directive.d.ts +12 -0
  91. package/lib/directives/if-permission.directive.d.ts +18 -0
  92. package/lib/functions/flatten-object.d.ts +14 -0
  93. package/lib/model/breadcrumb-menu-item.model.d.ts +60 -0
  94. package/lib/model/column-type.model.d.ts +7 -0
  95. package/lib/model/data-action.d.ts +9 -0
  96. package/lib/model/data-column-name-id.model.d.ts +4 -0
  97. package/lib/model/data-sort-direction.d.ts +5 -0
  98. package/lib/model/data-table-column.model.d.ts +9 -0
  99. package/lib/model/diagram-column.d.ts +5 -0
  100. package/lib/model/diagram-data.d.ts +4 -0
  101. package/lib/model/diagram-type.d.ts +5 -0
  102. package/lib/model/search-config-info.d.ts +4 -0
  103. package/lib/pipes/dynamic.pipe.d.ts +13 -0
  104. package/lib/pipes/ocxtimeago.pipe.d.ts +6 -0
  105. package/lib/services/breadcrumb.service.d.ts +20 -0
  106. package/lib/services/translation-cache.service.d.ts +12 -0
  107. package/lib/utils/async-translate-loader.utils.d.ts +9 -0
  108. package/lib/utils/caching-translate-loader.utils.d.ts +13 -0
  109. package/lib/utils/colorutils.d.ts +12 -0
  110. package/lib/utils/create-translate-loader.utils.d.ts +5 -0
  111. package/lib/utils/dateutils.d.ts +9 -0
  112. package/lib/utils/objectutils.d.ts +4 -0
  113. package/lib/utils/ocxtimeagointl.utils.d.ts +9 -0
  114. package/lib/utils/primeicon.utils.d.ts +5 -0
  115. package/lib/utils/translate.combined.loader.d.ts +9 -0
  116. package/package.json +55 -0
  117. package/testing/column-group-selection.harness.d.ts +6 -0
  118. package/testing/custom-group-column-selector.harness.d.ts +14 -0
  119. package/testing/data-layout-selection.harness.d.ts +11 -0
  120. package/testing/data-list-grid.harness.d.ts +15 -0
  121. package/testing/data-table.harness.d.ts +17 -0
  122. package/testing/data-view.harness.d.ts +8 -0
  123. package/testing/default-grid-item.harness.d.ts +11 -0
  124. package/testing/default-list-item.harness.d.ts +12 -0
  125. package/testing/diagram.harness.d.ts +10 -0
  126. package/testing/index.d.ts +16 -0
  127. package/testing/interactive-data-view.harness.d.ts +15 -0
  128. package/testing/more-actions-menu-button.harness.d.ts +10 -0
  129. package/testing/page-header.harness.d.ts +13 -0
  130. package/testing/search-config.harness.d.ts +6 -0
@@ -0,0 +1,350 @@
1
+ import { Component, ContentChild, EventEmitter, Inject, Injector, Input, LOCALE_ID, Output, } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { TranslateService } from '@ngx-translate/core';
4
+ import { BehaviorSubject, combineLatest, map, mergeMap, of } from 'rxjs';
5
+ import { ColumnType } from '../../model/column-type.model';
6
+ import { DataSortBase } from '../data-sort-base/data-sort-base';
7
+ import { ObjectUtils } from '../../utils/objectutils';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@ngx-translate/core";
10
+ import * as i2 from "@angular/router";
11
+ import * as i3 from "@angular/common";
12
+ import * as i4 from "primeng/api";
13
+ import * as i5 from "primeng/button";
14
+ import * as i6 from "primeng/table";
15
+ import * as i7 from "primeng/multiselect";
16
+ import * as i8 from "@angular/forms";
17
+ import * as i9 from "../../directives/if-permission.directive";
18
+ import * as i10 from "../../pipes/ocxtimeago.pipe";
19
+ export class DataTableComponent extends DataSortBase {
20
+ get rows() {
21
+ return this._rows$.getValue();
22
+ }
23
+ set rows(value) {
24
+ this._rows$.next(value);
25
+ }
26
+ get selectedRows() {
27
+ return this._selection$.getValue();
28
+ }
29
+ set selectedRows(value) {
30
+ this._selection$.next(value);
31
+ }
32
+ get filters() {
33
+ return this._filters$.getValue();
34
+ }
35
+ set filters(value) {
36
+ this._filters$.next(value);
37
+ }
38
+ get sortDirection() {
39
+ return this._sortDirection$.getValue();
40
+ }
41
+ set sortDirection(value) {
42
+ this._sortDirection$.next(value);
43
+ }
44
+ get sortColumn() {
45
+ return this?._sortColumn$.getValue();
46
+ }
47
+ set sortColumn(value) {
48
+ this?._sortColumn$.next(value);
49
+ }
50
+ get totalRecordsOnServer() {
51
+ return this.params['totalRecordsOnServer'] ? Number(this.params['totalRecordsOnServer']) : undefined;
52
+ }
53
+ set totalRecordsOnServer(value) {
54
+ this.params['totalRecordsOnServer'] = value?.toString() ?? '0';
55
+ }
56
+ get _stringCell() {
57
+ return this.stringCellTemplate || this.stringCellChildTemplate;
58
+ }
59
+ get _numberCell() {
60
+ return this.numberCellTemplate || this.numberCellChildTemplate;
61
+ }
62
+ get _dateCell() {
63
+ return this.dateCellTemplate || this.dateCellChildTemplate;
64
+ }
65
+ get _relativeDateCell() {
66
+ return this.relativeDateCellTemplate || this.relativeDateCellChildTemplate;
67
+ }
68
+ get _cell() {
69
+ return this.cellTemplate || this.cellChildTemplate;
70
+ }
71
+ get _translationKeyCell() {
72
+ return this.translationKeyCellTemplate || this.translationKeyCellChildTemplate;
73
+ }
74
+ get viewTableRowObserved() {
75
+ const dv = this.injector.get('DataViewComponent', null);
76
+ return dv?.viewItemObserved || dv?.viewItem.observed || this.viewTableRow.observed;
77
+ }
78
+ get editTableRowObserved() {
79
+ const dv = this.injector.get('DataViewComponent', null);
80
+ return dv?.editItemObserved || dv?.editItem.observed || this.editTableRow.observed;
81
+ }
82
+ get deleteTableRowObserved() {
83
+ const dv = this.injector.get('DataViewComponent', null);
84
+ return dv?.deleteItemObserved || dv?.deleteItem.observed || this.deleteTableRow.observed;
85
+ }
86
+ get anyRowActionObserved() {
87
+ return this.viewTableRowObserved || this.editTableRowObserved || this.deleteTableRowObserved;
88
+ }
89
+ get selectionChangedObserved() {
90
+ const dv = this.injector.get('DataViewComponent', null);
91
+ return dv?.selectionChangedObserved || dv?.selectionChanged.observed || this.selectionChanged.observed;
92
+ }
93
+ constructor(locale, translateService, router, injector) {
94
+ super(locale, translateService);
95
+ this.router = router;
96
+ this.injector = injector;
97
+ this._rows$ = new BehaviorSubject([]);
98
+ this._selection$ = new BehaviorSubject([]);
99
+ this._filters$ = new BehaviorSubject([]);
100
+ this._sortDirection$ = new BehaviorSubject("NONE" /* DataSortDirection.NONE */);
101
+ this._sortColumn$ = new BehaviorSubject('');
102
+ this.columns = [];
103
+ this.clientSideFiltering = true;
104
+ this.clientSideSorting = true;
105
+ this.sortStates = ["ASCENDING" /* DataSortDirection.ASCENDING */, "DESCENDING" /* DataSortDirection.DESCENDING */];
106
+ this.pageSizes = [10, 25, 50];
107
+ this.pageSize = this.pageSizes[0] || 50;
108
+ this.name = '';
109
+ this.paginator = true;
110
+ this.page = 0;
111
+ this.currentPageShowingKey = 'OCX_DATA_TABLE.SHOWING';
112
+ this.currentPageShowingWithTotalOnServerKey = 'OCX_DATA_TABLE.SHOWING_WITH_TOTAL_ON_SERVER';
113
+ this.params = {
114
+ currentPage: '{currentPage}',
115
+ totalPages: '{totalPages}',
116
+ rows: '{rows}',
117
+ first: '{first}',
118
+ last: '{last}',
119
+ totalRecords: '{totalRecords}',
120
+ };
121
+ this.additionalActions = [];
122
+ this.frozenActionColumn = false;
123
+ this.actionColumnPosition = 'right';
124
+ this.filtered = new EventEmitter();
125
+ this.sorted = new EventEmitter();
126
+ this.viewTableRow = new EventEmitter();
127
+ this.editTableRow = new EventEmitter();
128
+ this.deleteTableRow = new EventEmitter();
129
+ this.selectionChanged = new EventEmitter();
130
+ this.pageChanged = new EventEmitter();
131
+ this.currentFilterColumn$ = new BehaviorSubject(null);
132
+ this.name = this.name || this.router.url.replace(/[^A-Za-z0-9]/, '_');
133
+ }
134
+ ngOnInit() {
135
+ this.displayedRows$ = combineLatest([this._rows$, this._filters$, this._sortColumn$, this._sortDirection$]).pipe(mergeMap((params) => this.translateItems(params, this.columns, this.clientSideFiltering, this.clientSideSorting)), map((params) => this.filterItems(params, this.clientSideFiltering)), map((params) => this.sortItems(params, this.columns, this.clientSideSorting)), map(([rows]) => this.flattenItems(rows)));
136
+ this.currentSelectedFilters$ = combineLatest([this._filters$, this.currentFilterColumn$]).pipe(map(([filters, currentFilterColumn]) => {
137
+ return filters.filter((filter) => filter.columnId === currentFilterColumn?.id).map((filter) => filter.value);
138
+ }));
139
+ this.currentFilterOptions$ = combineLatest([this._rows$, this.currentFilterColumn$, this._filters$]).pipe(mergeMap(([rows, currentFilterColumn, filters]) => {
140
+ if (!currentFilterColumn?.id) {
141
+ return of([]);
142
+ }
143
+ const currentFilters = filters
144
+ .filter((filter) => filter.columnId === currentFilterColumn?.id)
145
+ .map((filter) => filter.value);
146
+ const columnValues = rows.map((row) => row[currentFilterColumn?.id]);
147
+ const translateObservable = this.columns.find((c) => c.id === currentFilterColumn?.id)?.columnType === ColumnType.TRANSLATION_KEY
148
+ ? this.translateService.get(columnValues)
149
+ : of(Object.fromEntries(columnValues.map((cv) => [cv, cv])));
150
+ return translateObservable.pipe(map((translatedValues) => {
151
+ return Object.values(translatedValues)
152
+ .concat(currentFilters)
153
+ .filter((value, index, self) => self.indexOf(value) === index && value != null)
154
+ .map((filterOption) => ({
155
+ label: filterOption,
156
+ value: filterOption,
157
+ }));
158
+ }));
159
+ }));
160
+ this.filterAmounts$ = this._filters$.pipe(map((filters) => filters
161
+ .map((filter) => filter.columnId)
162
+ .map((columnId) => [columnId, filters.filter((filter) => filter.columnId === columnId).length])), map((amounts) => Object.fromEntries(amounts)));
163
+ this.mapSelectionToRows();
164
+ }
165
+ onSortColumnClick(sortColumn) {
166
+ const newSortDirection = this.columnNextSortDirection(sortColumn);
167
+ this._sortColumn$.next(sortColumn);
168
+ this._sortDirection$.next(newSortDirection);
169
+ this.sorted.emit({ sortColumn: sortColumn, sortDirection: newSortDirection });
170
+ }
171
+ columnNextSortDirection(sortColumn) {
172
+ return sortColumn !== this.sortColumn
173
+ ? this.sortStates[0]
174
+ : this.sortStates[(this.sortStates.indexOf(this.sortDirection) + 1) % this.sortStates.length];
175
+ }
176
+ onDeleteRow(selectedTableRow) {
177
+ this.deleteTableRow.emit(selectedTableRow);
178
+ }
179
+ onViewRow(selectedTableRow) {
180
+ this.viewTableRow.emit(selectedTableRow);
181
+ }
182
+ onEditRow(selectedTableRow) {
183
+ this.editTableRow.emit(selectedTableRow);
184
+ }
185
+ onFilterClick(column) {
186
+ this.currentFilterColumn$.next(column);
187
+ }
188
+ onFilterChange(column, event) {
189
+ const filters = this.filters
190
+ .filter((filter) => filter.columnId !== column.id)
191
+ .concat(event.value.map((value) => ({
192
+ columnId: column.id,
193
+ value,
194
+ })));
195
+ if (this.clientSideFiltering) {
196
+ this.filters = filters;
197
+ }
198
+ this.filtered.emit(filters);
199
+ }
200
+ getSelectedFilters(columnId) {
201
+ return this.filters.filter((filter) => filter.columnId === columnId).map((filter) => filter.value);
202
+ }
203
+ sortIconTitle(sortColumn) {
204
+ return this.sortDirectionToTitle(sortColumn !== this.sortDirection
205
+ ? "NONE" /* DataSortDirection.NONE */
206
+ : this.sortStates[this.sortStates.indexOf(this.sortDirection) % this.sortStates.length]);
207
+ }
208
+ sortDirectionToTitle(sortDirection) {
209
+ switch (sortDirection) {
210
+ case "ASCENDING" /* DataSortDirection.ASCENDING */:
211
+ return 'OCX_DATA_TABLE.TOGGLE_BUTTON.ASCENDING_TITLE';
212
+ case "DESCENDING" /* DataSortDirection.DESCENDING */:
213
+ return 'OCX_DATA_TABLE.TOGGLE_BUTTON.DESCENDING_TITLE';
214
+ default:
215
+ return 'OCX_DATA_TABLE.TOGGLE_BUTTON.DEFAULT_TITLE';
216
+ }
217
+ }
218
+ mapSelectionToRows() {
219
+ this.selectedRows$ = combineLatest([this._selection$, this._rows$]).pipe(map(([selectedRows, rows]) => {
220
+ return selectedRows.map((row) => {
221
+ return rows.find((r) => r.id === row.id);
222
+ });
223
+ }));
224
+ }
225
+ onSelectionChange(event) {
226
+ this.selectionChanged.emit(event);
227
+ }
228
+ onPageChange(event) {
229
+ const page = event.first / event.rows;
230
+ this.page = page;
231
+ this.pageChanged.emit(page);
232
+ }
233
+ fieldIsTruthy(object, key) {
234
+ return !!(ObjectUtils.resolveFieldData(object, key));
235
+ }
236
+ }
237
+ DataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataTableComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.Router }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
238
+ DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DataTableComponent, selector: "ocx-data-table", inputs: { rows: "rows", selectedRows: "selectedRows", filters: "filters", sortDirection: "sortDirection", sortColumn: "sortColumn", columns: "columns", clientSideFiltering: "clientSideFiltering", clientSideSorting: "clientSideSorting", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", name: "name", deletePermission: "deletePermission", viewPermission: "viewPermission", editPermission: "editPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", paginator: "paginator", page: "page", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", stringCellTemplate: "stringCellTemplate", numberCellTemplate: "numberCellTemplate", dateCellTemplate: "dateCellTemplate", relativeDateCellTemplate: "relativeDateCellTemplate", cellTemplate: "cellTemplate", translationKeyCellTemplate: "translationKeyCellTemplate", additionalActions: "additionalActions", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition" }, outputs: { filtered: "filtered", sorted: "sorted", viewTableRow: "viewTableRow", editTableRow: "editTableRow", deleteTableRow: "deleteTableRow", selectionChanged: "selectionChanged", pageChanged: "pageChanged" }, queries: [{ propertyName: "stringCellChildTemplate", first: true, predicate: ["stringCell"], descendants: true }, { propertyName: "numberCellChildTemplate", first: true, predicate: ["numberCell"], descendants: true }, { propertyName: "dateCellChildTemplate", first: true, predicate: ["dateCell"], descendants: true }, { propertyName: "relativeDateCellChildTemplate", first: true, predicate: ["relativeDateCell"], descendants: true }, { propertyName: "cellChildTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "translationKeyCellChildTemplate", first: true, predicate: ["translationKeyCell"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container *ngIf=\"anyRowActionObserved\">\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\">\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\">\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\">\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of additionalActions\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container *ngIf=\"anyRowActionObserved\">\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<p-table\n [value]=\"(displayedRows$ | async) || []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * pageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"pageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"[10, 25, 50, rows?.length]\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) || []\"\n [scrollable]=\"true\"\n>\n <ng-template let-item pTemplate=\"paginatordropdownitem\">\n {{ item.value === rows?.length ? (\"OCX_DATA_TABLE.ALL\" | translate) : item.value }}\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt-slash]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n aria-label=\"{{('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})}}\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container [ngSwitch]=\"(currentFilterColumn$ | async)?.columnType\">\n <span *ngSwitchCase=\"'DATE'\">{{ value.label | date }}</span>\n <span *ngSwitchDefault> {{ value.label }} </span>\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-tableCheckbox [value]=\"rowObject\"></p-tableCheckbox>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: defaultCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved) ? 1 : 0)\">{{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}</td>\n </tr>\n </ng-template>\n</p-table>\n\n<ng-template #defaultCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container [ngSwitch]=\"column.columnType\">\n <ng-container *ngSwitchCase=\"'DATE'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _dateCell ? _dateCell : defaultDateCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'RELATIVE_DATE'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _relativeDateCell ? _relativeDateCell : defaultRelativeDateCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TRANSLATION_KEY'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _translationKeyCell ? _translationKeyCell: defaultTranslationKeyCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'NUMBER'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _numberCell ? _numberCell: defaultNumberCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container\n [ngTemplateOutlet]=\"\n _stringCell ? _stringCell: defaultStringCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultStringCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] }} </ng-container>\n</ng-template>\n\n<ng-template #defaultNumberCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | number }} </ng-container>\n</ng-template>\n\n<ng-template #defaultDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | date: 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template #defaultRelativeDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ rowObject[column.id] | timeago }} </ng-container>\n</ng-template>\n\n<ng-template #defaultTranslationKeyCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "virtualRowHeight", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i6.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "component", type: i6.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i6.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i10.OcxTimeAgoPipe, name: "timeago" }] });
239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataTableComponent, decorators: [{
240
+ type: Component,
241
+ args: [{ selector: 'ocx-data-table', template: "<ng-template #actionColumn let-rowObject=\"localRowObject\">\n <ng-container *ngIf=\"anyRowActionObserved\">\n <td\n class=\"actions\"\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-left' : 'action-column-right'\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n >\n <div class=\"icon-button-row-wrapper\">\n <ng-container *ngIf=\"viewTableRowObserved && (!viewActionVisibleField || fieldIsTruthy(rowObject, viewActionVisibleField))\">\n <button\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(rowObject, viewActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text viewTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.VIEW' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.VIEW' | translate\"\n icon=\"pi pi-eye\"\n (click)=\"onViewRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"editTableRowObserved && (!editActionVisibleField || fieldIsTruthy(rowObject, editActionVisibleField))\">\n <button\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(rowObject, editActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text editTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.EDIT' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.EDIT' | translate\"\n icon=\"pi pi-pencil\"\n (click)=\"onEditRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"deleteTableRowObserved && (!deleteActionVisibleField || fieldIsTruthy(rowObject, deleteActionVisibleField))\">\n <button\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(rowObject, deleteActionEnabledField)\"\n pButton\n class=\"p-button-rounded p-button-text p-button-danger deleteTableRowButton\"\n title=\"{{ 'OCX_DATA_TABLE.ACTIONS.DELETE' | translate }}\"\n [attr.aria-label]=\"'OCX_DATA_TABLE.ACTIONS.DELETE' | translate\"\n icon=\"pi pi-trash\"\n (click)=\"onDeleteRow(rowObject)\"\n [attr.name]=\"'data-table-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of additionalActions\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(rowObject)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled\"\n ></button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n</ng-template>\n\n<ng-template #actionColumnHeader>\n <ng-container *ngIf=\"anyRowActionObserved\">\n <th\n pFrozenColumn\n [frozen]=\"frozenActionColumn\"\n [alignFrozen]=\"actionColumnPosition\"\n [ngClass]=\"(frozenActionColumn && actionColumnPosition === 'left') ? 'border-right-1' : (frozenActionColumn && actionColumnPosition === 'right') ? 'border-left-1' : ''\"\n [attr.name]=\"actionColumnPosition === 'left' ? 'action-column-header-left' : 'action-column-header-right'\"\n >\n {{ 'OCX_DATA_TABLE.ACTIONS_COLUMN_NAME' | translate }}\n </th>\n </ng-container>\n</ng-template>\n\n<p-table\n [value]=\"(displayedRows$ | async) || []\"\n responsiveLayout=\"scroll\"\n [paginator]=\"paginator\"\n [first]=\"page * pageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"pageSize\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"[10, 25, 50, rows?.length]\"\n id=\"dataTable_{{name}}\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selection]=\"(selectedRows$ | async) || []\"\n [scrollable]=\"true\"\n>\n <ng-template let-item pTemplate=\"paginatordropdownitem\">\n {{ item.value === rows?.length ? (\"OCX_DATA_TABLE.ALL\" | translate) : item.value }}\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 4rem\" scope=\"col\" *ngIf=\"selectionChangedObserved\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n <ng-container *ngFor=\"let column of columns\">\n <th *ngIf=\"column.sortable || column.filterable; else simpleHeader\" scope=\"col\">\n <div class=\"table-header-wrapper\">\n <span id=\"{{column.id}}-header-name\">{{ column.nameKey | translate }}</span>\n <span class=\"icon-button-header-wrapper\">\n <button\n *ngIf=\"column.sortable\"\n class=\"pi sortButton\"\n [class.pi-sort-alt-slash]=\"(column?.id === sortColumn && sortDirection === 'NONE') || column?.id !== sortColumn\"\n [class.pi-sort-amount-up]=\"column?.id === sortColumn && sortDirection === 'ASCENDING'\"\n [class.pi-sort-amount-down]=\"column?.id === sortColumn && sortDirection === 'DESCENDING'\"\n (click)=\"onSortColumnClick(column.id)\"\n [title]=\"(sortIconTitle(column.id) | translate)\"\n [attr.aria-label]=\"('OCX_DATA_TABLE.TOGGLE_BUTTON.ARIA_LABEL' | translate: { column: (column.nameKey | translate), direction: (sortDirectionToTitle(columnNextSortDirection(column.id)) | translate)})\"\n ></button>\n <p-multiSelect\n class=\"filterMultiSelect\"\n *ngIf=\"column.filterable\"\n [options]=\"(currentFilterOptions$ | async) || []\"\n [ngModel]=\"(currentSelectedFilters$ | async) || []\"\n [showToggleAll]=\"true\"\n emptyFilterMessage=\"{{ 'OCX_DATA_TABLE.EMPTY_FILTER_MESSAGE' | translate }}\"\n [displaySelectedLabel]=\"false\"\n [resetFilterOnHide]=\"true\"\n (onChange)=\"onFilterChange(column, $event)\"\n placeholder=\"Icon\"\n appendTo=\"body\"\n (onClick)=\"onFilterClick(column)\"\n [title]=\"'OCX_DATA_TABLE.FILTER_TITLE' | translate\"\n aria-label=\"{{('OCX_DATA_TABLE.FILTER_ARIA_LABEL' | translate: { column: column.nameKey | translate})}}\"\n >\n <ng-template pTemplate=\"selectedItems\" let-value>\n <div\n class=\"pi\"\n [class.pi-filter]=\"!((filterAmounts$ | async) || {})[column.id]\"\n [class.pi-filter-fill]=\"((filterAmounts$ | async) || {})[column.id] > 0\"\n ></div>\n </ng-template>\n <ng-template pTemplate=\"item\" let-value>\n <ng-container [ngSwitch]=\"(currentFilterColumn$ | async)?.columnType\">\n <span *ngSwitchCase=\"'DATE'\">{{ value.label | date }}</span>\n <span *ngSwitchDefault> {{ value.label }} </span>\n </ng-container>\n </ng-template>\n </p-multiSelect>\n </span>\n </div>\n </th>\n <ng-template #simpleHeader>\n <th scope=\"col\">{{ column.nameKey | translate }}</th>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumnHeader\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowObject>\n <tr>\n <td *ngIf=\"selectionChangedObserved\">\n <p-tableCheckbox [value]=\"rowObject\"></p-tableCheckbox>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'left';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n <td *ngFor=\"let column of columns\">\n <ng-container\n [ngTemplateOutlet]=\"\n _cell ? _cell: defaultCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n ></ng-container>\n </td>\n <ng-container *ngIf=\"actionColumnPosition === 'right';\">\n <ng-container *ngTemplateOutlet=\"actionColumn; context: {localRowObject: rowObject}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [colSpan]=\"columns.length + ((anyRowActionObserved) ? 1 : 0)\">{{ emptyResultsMessage || (\"OCX_DATA_TABLE.EMPTY_RESULT\" | translate) }}</td>\n </tr>\n </ng-template>\n</p-table>\n\n<ng-template #defaultCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container [ngSwitch]=\"column.columnType\">\n <ng-container *ngSwitchCase=\"'DATE'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _dateCell ? _dateCell : defaultDateCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'RELATIVE_DATE'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _relativeDateCell ? _relativeDateCell : defaultRelativeDateCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'TRANSLATION_KEY'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _translationKeyCell ? _translationKeyCell: defaultTranslationKeyCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'NUMBER'\">\n <ng-container\n [ngTemplateOutlet]=\"\n _numberCell ? _numberCell: defaultNumberCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container\n [ngTemplateOutlet]=\"\n _stringCell ? _stringCell: defaultStringCell\n \"\n [ngTemplateOutletContext]=\"{\n rowObject: rowObject,\n column: column\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #defaultStringCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] }} </ng-container>\n</ng-template>\n\n<ng-template #defaultNumberCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | number }} </ng-container>\n</ng-template>\n\n<ng-template #defaultDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | date: 'medium' }} </ng-container>\n</ng-template>\n\n<ng-template #defaultRelativeDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ 'OCX_DATA_TABLE.EDITED' | translate }} {{ rowObject[column.id] | timeago }} </ng-container>\n</ng-template>\n\n<ng-template #defaultTranslationKeyCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container> {{ rowObject[column.id] | translate }} </ng-container>\n</ng-template>\n", styles: [":host ::ng-deep .p-multiselect{padding:0;background:#f7f7f7;border:none}:host ::ng-deep .p-multiselect .p-multiselect-container{height:20px;width:20px}:host ::ng-deep .p-multiselect .p-multiselect-trigger{display:none}:host ::ng-deep .p-multiselect .p-multiselect-label.p-placeholder{color:#262626;font-size:.9rem;font-family:Bold,sans-serif;font-weight:700;padding:0}:host ::ng-deep .p-multiselect:focus-within{box-shadow:none;background:#979797}.pi{border:none;background:none;cursor:pointer}\n"] }]
242
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
243
+ type: Inject,
244
+ args: [LOCALE_ID]
245
+ }] }, { type: i1.TranslateService }, { type: i2.Router }, { type: i0.Injector }]; }, propDecorators: { rows: [{
246
+ type: Input
247
+ }], selectedRows: [{
248
+ type: Input
249
+ }], filters: [{
250
+ type: Input
251
+ }], sortDirection: [{
252
+ type: Input
253
+ }], sortColumn: [{
254
+ type: Input
255
+ }], columns: [{
256
+ type: Input
257
+ }], clientSideFiltering: [{
258
+ type: Input
259
+ }], clientSideSorting: [{
260
+ type: Input
261
+ }], sortStates: [{
262
+ type: Input
263
+ }], pageSizes: [{
264
+ type: Input
265
+ }], pageSize: [{
266
+ type: Input
267
+ }], emptyResultsMessage: [{
268
+ type: Input
269
+ }], name: [{
270
+ type: Input
271
+ }], deletePermission: [{
272
+ type: Input
273
+ }], viewPermission: [{
274
+ type: Input
275
+ }], editPermission: [{
276
+ type: Input
277
+ }], deleteActionVisibleField: [{
278
+ type: Input
279
+ }], deleteActionEnabledField: [{
280
+ type: Input
281
+ }], viewActionVisibleField: [{
282
+ type: Input
283
+ }], viewActionEnabledField: [{
284
+ type: Input
285
+ }], editActionVisibleField: [{
286
+ type: Input
287
+ }], editActionEnabledField: [{
288
+ type: Input
289
+ }], paginator: [{
290
+ type: Input
291
+ }], page: [{
292
+ type: Input
293
+ }], totalRecordsOnServer: [{
294
+ type: Input
295
+ }], currentPageShowingKey: [{
296
+ type: Input
297
+ }], currentPageShowingWithTotalOnServerKey: [{
298
+ type: Input
299
+ }], stringCellTemplate: [{
300
+ type: Input
301
+ }], stringCellChildTemplate: [{
302
+ type: ContentChild,
303
+ args: ['stringCell']
304
+ }], numberCellTemplate: [{
305
+ type: Input
306
+ }], numberCellChildTemplate: [{
307
+ type: ContentChild,
308
+ args: ['numberCell']
309
+ }], dateCellTemplate: [{
310
+ type: Input
311
+ }], dateCellChildTemplate: [{
312
+ type: ContentChild,
313
+ args: ['dateCell']
314
+ }], relativeDateCellTemplate: [{
315
+ type: Input
316
+ }], relativeDateCellChildTemplate: [{
317
+ type: ContentChild,
318
+ args: ['relativeDateCell']
319
+ }], cellTemplate: [{
320
+ type: Input
321
+ }], cellChildTemplate: [{
322
+ type: ContentChild,
323
+ args: ['cell']
324
+ }], translationKeyCellTemplate: [{
325
+ type: Input
326
+ }], translationKeyCellChildTemplate: [{
327
+ type: ContentChild,
328
+ args: ['translationKeyCell']
329
+ }], additionalActions: [{
330
+ type: Input
331
+ }], frozenActionColumn: [{
332
+ type: Input
333
+ }], actionColumnPosition: [{
334
+ type: Input
335
+ }], filtered: [{
336
+ type: Output
337
+ }], sorted: [{
338
+ type: Output
339
+ }], viewTableRow: [{
340
+ type: Output
341
+ }], editTableRow: [{
342
+ type: Output
343
+ }], deleteTableRow: [{
344
+ type: Output
345
+ }], selectionChanged: [{
346
+ type: Output
347
+ }], pageChanged: [{
348
+ type: Output
349
+ }] } });
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUVULE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFdEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBSTFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7Ozs7Ozs7Ozs7OztBQWdCckQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFlBQVk7SUFFbEQsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQy9CLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFZO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxD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dUJBQUMsWUFBWTtnQkFLakIsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNzQix1QkFBdUI7c0JBQWxELFlBQVk7dUJBQUMsWUFBWTtnQkFLakIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNvQixxQkFBcUI7c0JBQTlDLFlBQVk7dUJBQUMsVUFBVTtnQkFLZix3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQzRCLDZCQUE2QjtzQkFBOUQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBS3ZCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ2dCLGlCQUFpQjtzQkFBdEMsWUFBWTt1QkFBQyxNQUFNO2dCQUlYLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDOEIsK0JBQStCO3NCQUFsRSxZQUFZO3VCQUFDLG9CQUFvQjtnQkFLekIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgbWFwLCBtZXJnZU1hcCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQ29sdW1uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2NvbHVtbi10eXBlLm1vZGVsJ1xuaW1wb3J0IHsgRGF0YUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtYWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXNvcnQtZGlyZWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5pbXBvcnQgeyBEYXRhU29ydEJhc2UgfSBmcm9tICcuLi9kYXRhLXNvcnQtYmFzZS9kYXRhLXNvcnQtYmFzZSdcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vLi4vdXRpbHMvb2JqZWN0dXRpbHMnXG5cbnR5cGUgUHJpbWl0aXZlID0gbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IGJpZ2ludCB8IERhdGVcbmV4cG9ydCB0eXBlIFJvdyA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICBbY29sdW1uSWQ6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IHR5cGUgRmlsdGVyID0geyBjb2x1bW5JZDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1cbmV4cG9ydCB0eXBlIFNvcnQgPSB7IHNvcnRDb2x1bW46IHN0cmluZzsgc29ydERpcmVjdGlvbjogRGF0YVNvcnREaXJlY3Rpb24gfVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBEYXRhU29ydEJhc2UgaW1wbGVtZW50cyBPbkluaXQge1xuICBfcm93cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFJvd1tdPihbXSlcbiAgQElucHV0KClcbiAgZ2V0IHJvd3MoKTogUm93W10ge1xuICAgIHJldHVybiB0aGlzLl9yb3dzJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHJvd3ModmFsdWU6IFJvd1tdKSB7XG4gICAgdGhpcy5fcm93cyQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc2VsZWN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93W10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgc2VsZWN0ZWRSb3dzKCk6IFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNlbGVjdGVkUm93cyh2YWx1ZTogUm93W10pIHtcbiAgICB0aGlzLl9zZWxlY3Rpb24kLm5leHQodmFsdWUpXG4gIH1cbiAgX2ZpbHRlcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWx0ZXJbXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBmaWx0ZXJzKCk6IEZpbHRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVycyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBmaWx0ZXJzKHZhbHVlOiBGaWx0ZXJbXSkge1xuICAgIHRoaXMuX2ZpbHRlcnMkLm5leHQodmFsdWUpXG4gIH1cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fc29ydERpcmVjdGlvbiQubmV4dCh2YWx1ZSlcbiAgfVxuICBfc29ydENvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIEBJbnB1dCgpXG4gIGdldCBzb3J0Q29sdW1uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0Q29sdW1uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnRDb2x1bW4odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXM/Ll9zb3J0Q29sdW1uJC5uZXh0KHZhbHVlKVxuICB9XG4gIEBJbnB1dCgpIGNvbHVtbnM6IERhdGFUYWJsZUNvbHVtbltdID0gW11cbiAgQElucHV0KCkgY2xpZW50U2lkZUZpbHRlcmluZyA9IHRydWVcbiAgQElucHV0KCkgY2xpZW50U2lkZVNvcnRpbmcgPSB0cnVlXG4gIEBJbnB1dCgpIHNvcnRTdGF0ZXM6IERhdGFTb3J0RGlyZWN0aW9uW10gPSBbRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HLCBEYXRhU29ydERpcmVjdGlvbi5ERVNDRU5ESU5HXVxuICBASW5wdXQoKSBwYWdlU2l6ZXM6IG51bWJlcltdID0gWzEwLCAyNSwgNTBdXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSB0aGlzLnBhZ2VTaXplc1swXSB8fCA1MFxuICBASW5wdXQoKSBlbXB0eVJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgbmFtZSA9ICcnXG4gIEBJbnB1dCgpIGRlbGV0ZVBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSB2aWV3UGVybWlzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHBhZ2luYXRvciA9IHRydWVcbiAgQElucHV0KCkgcGFnZSA9IDBcbiAgQElucHV0KClcbiAgZ2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddID8gTnVtYmVyKHRoaXMucGFyYW1zWyd0b3RhbFJlY29yZHNPblNlcnZlciddKSA6IHVuZGVmaW5lZFxuICB9XG4gIHNldCB0b3RhbFJlY29yZHNPblNlcnZlcih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPSB2YWx1ZT8udG9TdHJpbmcoKSA/PyAnMCdcbiAgfVxuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lORydcbiAgQElucHV0KCkgY3VycmVudFBhZ2VTaG93aW5nV2l0aFRvdGFsT25TZXJ2ZXJLZXkgPSAnT0NYX0RBVEFfVEFCTEUuU0hPV0lOR19XSVRIX1RPVEFMX09OX1NFUlZFUidcbiAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIGN1cnJlbnRQYWdlOiAne2N1cnJlbnRQYWdlfScsXG4gICAgdG90YWxQYWdlczogJ3t0b3RhbFBhZ2VzfScsXG4gICAgcm93czogJ3tyb3dzfScsXG4gICAgZmlyc3Q6ICd7Zmlyc3R9JyxcbiAgICBsYXN0OiAne2xhc3R9JyxcbiAgICB0b3RhbFJlY29yZHM6ICd7dG90YWxSZWNvcmRzfScsXG4gIH1cblxuICBASW5wdXQoKSBzdHJpbmdDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnc3RyaW5nQ2VsbCcpIHN0cmluZ0NlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfc3RyaW5nQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zdHJpbmdDZWxsVGVtcGxhdGUgfHwgdGhpcy5zdHJpbmdDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbnVtYmVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ251bWJlckNlbGwnKSBudW1iZXJDZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX251bWJlckNlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubnVtYmVyQ2VsbFRlbXBsYXRlIHx8IHRoaXMubnVtYmVyQ2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGRhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnZGF0ZUNlbGwnKSBkYXRlQ2VsbENoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9kYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlQ2VsbFRlbXBsYXRlIHx8IHRoaXMuZGF0ZUNlbGxDaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSByZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgncmVsYXRpdmVEYXRlQ2VsbCcpIHJlbGF0aXZlRGF0ZUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfcmVsYXRpdmVEYXRlQ2VsbCgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWxhdGl2ZURhdGVDZWxsVGVtcGxhdGUgfHwgdGhpcy5yZWxhdGl2ZURhdGVDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgY2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2NlbGwnKSBjZWxsQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2NlbGwoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFRlbXBsYXRlIHx8IHRoaXMuY2VsbENoaWxkVGVtcGxhdGVcbiAgfVxuICBASW5wdXQoKSB0cmFuc2xhdGlvbktleUNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCd0cmFuc2xhdGlvbktleUNlbGwnKSB0cmFuc2xhdGlvbktleUNlbGxDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfdHJhbnNsYXRpb25LZXlDZWxsKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uS2V5Q2VsbFRlbXBsYXRlIHx8IHRoaXMudHJhbnNsYXRpb25LZXlDZWxsQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgYWRkaXRpb25hbEFjdGlvbnM6IERhdGFBY3Rpb25bXSA9IFtdXG4gIEBJbnB1dCgpIGZyb3plbkFjdGlvbkNvbHVtbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGFjdGlvbkNvbHVtblBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnID0gJ3JpZ2h0J1xuXG4gIEBPdXRwdXQoKSBmaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyW10+KClcbiAgQE91dHB1dCgpIHNvcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKVxuICBAT3V0cHV0KCkgdmlld1RhYmxlUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3c+KClcbiAgQE91dHB1dCgpIGVkaXRUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBkZWxldGVUYWJsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8Um93PigpXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dbXT4oKVxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuXG4gIGRpc3BsYXllZFJvd3MkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcbiAgc2VsZWN0ZWRSb3dzJDogT2JzZXJ2YWJsZTx1bmtub3duW10+IHwgdW5kZWZpbmVkXG5cbiAgY3VycmVudEZpbHRlckNvbHVtbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFUYWJsZUNvbHVtbiB8IG51bGw+KG51bGwpXG4gIGN1cnJlbnRGaWx0ZXJPcHRpb25zJDogT2JzZXJ2YWJsZTxTZWxlY3RJdGVtW10+IHwgdW5kZWZpbmVkXG4gIGN1cnJlbnRTZWxlY3RlZEZpbHRlcnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB8IHVuZGVmaW5lZFxuICBmaWx0ZXJBbW91bnRzJDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB8IHVuZGVmaW5lZFxuICBnZXQgdmlld1RhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8udmlld0l0ZW1PYnNlcnZlZCB8fCBkdj8udmlld0l0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy52aWV3VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZWRpdFRhYmxlUm93T2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8uZWRpdEl0ZW1PYnNlcnZlZCB8fCBkdj8uZWRpdEl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5lZGl0VGFibGVSb3cub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZGVsZXRlVGFibGVSb3dPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5kZWxldGVJdGVtT2JzZXJ2ZWQgfHwgZHY/LmRlbGV0ZUl0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy5kZWxldGVUYWJsZVJvdy5vYnNlcnZlZFxuICB9XG4gIGdldCBhbnlSb3dBY3Rpb25PYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aWV3VGFibGVSb3dPYnNlcnZlZCB8fCB0aGlzLmVkaXRUYWJsZVJvd09ic2VydmVkIHx8IHRoaXMuZGVsZXRlVGFibGVSb3dPYnNlcnZlZFxuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbkNoYW5nZWRPYnNlcnZlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkdiA9IHRoaXMuaW5qZWN0b3IuZ2V0KCdEYXRhVmlld0NvbXBvbmVudCcsIG51bGwpXG4gICAgcmV0dXJuIGR2Py5zZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWQgfHwgZHY/LnNlbGVjdGlvbkNoYW5nZWQub2JzZXJ2ZWQgfHwgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLm9ic2VydmVkXG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgbG9jYWxlOiBzdHJpbmcsXG4gICAgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuICAgIHN1cGVyKGxvY2FsZSwgdHJhbnNsYXRlU2VydmljZSlcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUgfHwgdGhpcy5yb3V0ZXIudXJsLnJlcGxhY2UoL1teQS1aYS16MC05XS8sICdfJylcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkUm93cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5fZmlsdGVycyQsIHRoaXMuX3NvcnRDb2x1bW4kLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW3Jvd3NdKSA9PiB0aGlzLmZsYXR0ZW5JdGVtcyhyb3dzKSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX2ZpbHRlcnMkLCB0aGlzLmN1cnJlbnRGaWx0ZXJDb2x1bW4kXSkucGlwZShcbiAgICAgIG1hcCgoW2ZpbHRlcnMsIGN1cnJlbnRGaWx0ZXJDb2x1bW5dKSA9PiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLnZhbHVlKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLl9yb3dzJCwgdGhpcy5jdXJyZW50RmlsdGVyQ29sdW1uJCwgdGhpcy5fZmlsdGVycyRdKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKFtyb3dzLCBjdXJyZW50RmlsdGVyQ29sdW1uLCBmaWx0ZXJzXSkgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnRGaWx0ZXJDb2x1bW4/LmlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKFtdKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJzID0gZmlsdGVyc1xuICAgICAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkID09PSBjdXJyZW50RmlsdGVyQ29sdW1uPy5pZClcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci52YWx1ZSlcblxuICAgICAgICBjb25zdCBjb2x1bW5WYWx1ZXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbY3VycmVudEZpbHRlckNvbHVtbj8uaWRdKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGVPYnNlcnZhYmxlID1cbiAgICAgICAgICB0aGlzLmNvbHVtbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gY3VycmVudEZpbHRlckNvbHVtbj8uaWQpPy5jb2x1bW5UeXBlID09PSBDb2x1bW5UeXBlLlRSQU5TTEFUSU9OX0tFWVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KGNvbHVtblZhbHVlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgICAgIDogb2YoT2JqZWN0LmZyb21FbnRyaWVzKGNvbHVtblZhbHVlcy5tYXAoKGN2KSA9PiBbY3YsIGN2XSkpKVxuICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JzZXJ2YWJsZS5waXBlKFxuICAgICAgICAgIG1hcCgodHJhbnNsYXRlZFZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModHJhbnNsYXRlZFZhbHVlcylcbiAgICAgICAgICAgICAgLmNvbmNhdChjdXJyZW50RmlsdGVycylcbiAgICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCAmJiB2YWx1ZSAhPSBudWxsKVxuICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChmaWx0ZXJPcHRpb24pID0+XG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgfSBhcyBTZWxlY3RJdGVtKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICApXG4gICAgdGhpcy5maWx0ZXJBbW91bnRzJCA9IHRoaXMuX2ZpbHRlcnMkLnBpcGUoXG4gICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgIGZpbHRlcnNcbiAgICAgICAgICAubWFwKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZClcbiAgICAgICAgICAubWFwKChjb2x1bW5JZCkgPT4gW2NvbHVtbklkLCBmaWx0ZXJzLmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuY29sdW1uSWQgPT09IGNvbHVtbklkKS5sZW5ndGhdKVxuICAgICAgKSxcbiAgICAgIG1hcCgoYW1vdW50cykgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGFtb3VudHMpKVxuICAgIClcbiAgICB0aGlzLm1hcFNlbGVjdGlvblRvUm93cygpXG4gIH1cblxuICBvblNvcnRDb2x1bW5DbGljayhzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBuZXdTb3J0RGlyZWN0aW9uID0gdGhpcy5jb2x1bW5OZXh0U29ydERpcmVjdGlvbihzb3J0Q29sdW1uKVxuXG4gICAgdGhpcy5fc29ydENvbHVtbiQubmV4dChzb3J0Q29sdW1uKVxuICAgIHRoaXMuX3NvcnREaXJlY3Rpb24kLm5leHQobmV3U29ydERpcmVjdGlvbilcblxuICAgIHRoaXMuc29ydGVkLmVtaXQoeyBzb3J0Q29sdW1uOiBzb3J0Q29sdW1uLCBzb3J0RGlyZWN0aW9uOiBuZXdTb3J0RGlyZWN0aW9uIH0pXG4gIH1cblxuICBjb2x1bW5OZXh0U29ydERpcmVjdGlvbihzb3J0Q29sdW1uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc29ydENvbHVtbiAhPT0gdGhpcy5zb3J0Q29sdW1uXG4gICAgICA/IHRoaXMuc29ydFN0YXRlc1swXVxuICAgICAgOiB0aGlzLnNvcnRTdGF0ZXNbKHRoaXMuc29ydFN0YXRlcy5pbmRleE9mKHRoaXMuc29ydERpcmVjdGlvbikgKyAxKSAlIHRoaXMuc29ydFN0YXRlcy5sZW5ndGhdXG4gIH1cblxuICBvbkRlbGV0ZVJvdyhzZWxlY3RlZFRhYmxlUm93OiBSb3cpIHtcbiAgICB0aGlzLmRlbGV0ZVRhYmxlUm93LmVtaXQoc2VsZWN0ZWRUYWJsZVJvdylcbiAgfVxuXG4gIG9uVmlld1JvdyhzZWxlY3RlZFRhYmxlUm93OiBSb3cpIHtcbiAgICB0aGlzLnZpZXdUYWJsZVJvdy5lbWl0KHNlbGVjdGVkVGFibGVSb3cpXG4gIH1cblxuICBvbkVkaXRSb3coc2VsZWN0ZWRUYWJsZVJvdzogUm93KSB7XG4gICAgdGhpcy5lZGl0VGFibGVSb3cuZW1pdChzZWxlY3RlZFRhYmxlUm93KVxuICB9XG5cbiAgb25GaWx0ZXJDbGljayhjb2x1bW46IERhdGFUYWJsZUNvbHVtbikge1xuICAgIHRoaXMuY3VycmVudEZpbHRlckNvbHVtbiQubmV4dChjb2x1bW4pXG4gIH1cblxuICBvbkZpbHRlckNoYW5nZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbiwgZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLmZpbHRlcnNcbiAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLmNvbHVtbklkICE9PSBjb2x1bW4uaWQpXG4gICAgICAuY29uY2F0KFxuICAgICAgICBldmVudC52YWx1ZS5tYXAoKHZhbHVlOiBQcmltaXRpdmUpID0+ICh7XG4gICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZCxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgaWYgKHRoaXMuY2xpZW50U2lkZUZpbHRlcmluZykge1xuICAgICAgdGhpcy5maWx0ZXJzID0gZmlsdGVyc1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkLmVtaXQoZmlsdGVycylcbiAgfVxuXG4gIGdldFNlbGVjdGVkRmlsdGVycyhjb2x1bW5JZDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnMuZmlsdGVyKChmaWx0ZXIpID0+IGZpbHRlci5jb2x1bW5JZCA9PT0gY29sdW1uSWQpLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIudmFsdWUpXG4gIH1cblxuICBzb3J0SWNvblRpdGxlKHNvcnRDb2x1bW46IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25Ub1RpdGxlKFxuICAgICAgc29ydENvbHVtbiAhPT0gdGhpcy5zb3J0RGlyZWN0aW9uXG4gICAgICAgID8gRGF0YVNvcnREaXJlY3Rpb24uTk9ORVxuICAgICAgICA6IHRoaXMuc29ydFN0YXRlc1t0aGlzLnNvcnRTdGF0ZXMuaW5kZXhPZih0aGlzLnNvcnREaXJlY3Rpb24pICUgdGhpcy5zb3J0U3RhdGVzLmxlbmd0aF1cbiAgICApXG4gIH1cblxuICBzb3J0RGlyZWN0aW9uVG9UaXRsZShzb3J0RGlyZWN0aW9uOiBEYXRhU29ydERpcmVjdGlvbikge1xuICAgIHN3aXRjaCAoc29ydERpcmVjdGlvbikge1xuICAgICAgY2FzZSBEYXRhU29ydERpcmVjdGlvbi5BU0NFTkRJTkc6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5BU0NFTkRJTkdfVElUTEUnXG4gICAgICBjYXNlIERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkc6XG4gICAgICAgIHJldHVybiAnT0NYX0RBVEFfVEFCTEUuVE9HR0xFX0JVVFRPTi5ERVNDRU5ESU5HX1RJVExFJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdPQ1hfREFUQV9UQUJMRS5UT0dHTEVfQlVUVE9OLkRFRkFVTFRfVElUTEUnXG4gICAgfVxuICB9XG5cbiAgbWFwU2VsZWN0aW9uVG9Sb3dzKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRSb3dzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3NlbGVjdGlvbiQsIHRoaXMuX3Jvd3MkXSkucGlwZShcbiAgICAgIG1hcCgoW3NlbGVjdGVkUm93cywgcm93c10pID0+IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkUm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dzLmZpbmQoKHIpID0+IHIuaWQgPT09IHJvdy5pZClcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IFJvd1tdKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkLmVtaXQoZXZlbnQpXG4gIH1cblxuICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHBhZ2UgPSBldmVudC5maXJzdCAvIGV2ZW50LnJvd3NcbiAgICB0aGlzLnBhZ2UgPSBwYWdlXG4gICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2UpXG4gIH1cblxuICBmaWVsZElzVHJ1dGh5KG9iamVjdDogYW55LCBrZXk6IGFueSkge1xuICAgIHJldHVybiAhIShPYmplY3RVdGlscy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KSlcbiAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNhY3Rpb25Db2x1bW4gbGV0LXJvd09iamVjdD1cImxvY2FsUm93T2JqZWN0XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJhbnlSb3dBY3Rpb25PYnNlcnZlZFwiPlxuICAgIDx0ZFxuICAgICAgY2xhc3M9XCJhY3Rpb25zXCJcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcgPyAnYWN0aW9uLWNvbHVtbi1sZWZ0JyA6ICdhY3Rpb24tY29sdW1uLXJpZ2h0J1wiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWJ1dHRvbi1yb3ctd3JhcHBlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlld1RhYmxlUm93T2JzZXJ2ZWQgJiYgKCF2aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwidmlld1Blcm1pc3Npb25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdmlld0FjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIHZpZXdBY3Rpb25FbmFibGVkRmllbGQpXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHZpZXdUYWJsZVJvd0J1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLlZJRVcnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuVklFVycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWV5ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WaWV3Um93KHJvd09iamVjdClcIlxuICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS10YWJsZS1hY3Rpb24tYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRUYWJsZVJvd09ic2VydmVkICYmICghZWRpdEFjdGlvblZpc2libGVGaWVsZCB8fCBmaWVsZElzVHJ1dGh5KHJvd09iamVjdCwgZWRpdEFjdGlvblZpc2libGVGaWVsZCkpXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm9jeElmUGVybWlzc2lvbj1cImVkaXRQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWVkaXRBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBlZGl0VGFibGVSb3dCdXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnT0NYX0RBVEFfVEFCTEUuQUNUSU9OUy5FRElUJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkVESVQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWxldGVUYWJsZVJvd09ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkocm93T2JqZWN0LCBkZWxldGVBY3Rpb25WaXNpYmxlRmllbGQpKVwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJkZWxldGVQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShyb3dPYmplY3QsIGRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIGRlbGV0ZVRhYmxlUm93QnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlMuREVMRVRFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5BQ1RJT05TLkRFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVJvdyhyb3dPYmplY3QpXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtdGFibGUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBhZGRpdGlvbmFsQWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJhY3Rpb24ucGVybWlzc2lvblwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb24uY2xhc3Nlc1wiXG4gICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiB8fCAnJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uLmNhbGxiYWNrKHJvd09iamVjdClcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWRcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0aW9uQ29sdW1uSGVhZGVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYW55Um93QWN0aW9uT2JzZXJ2ZWRcIj5cbiAgICA8dGhcbiAgICAgIHBGcm96ZW5Db2x1bW5cbiAgICAgIFtmcm96ZW5dPVwiZnJvemVuQWN0aW9uQ29sdW1uXCJcbiAgICAgIFthbGlnbkZyb3plbl09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvblwiXG4gICAgICBbbmdDbGFzc109XCIoZnJvemVuQWN0aW9uQ29sdW1uICYmIGFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCcpID8gJ2JvcmRlci1yaWdodC0xJyA6IChmcm96ZW5BY3Rpb25Db2x1bW4gJiYgYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCcpID8gJ2JvcmRlci1sZWZ0LTEnIDogJydcIlxuICAgICAgW2F0dHIubmFtZV09XCJhY3Rpb25Db2x1bW5Qb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2FjdGlvbi1jb2x1bW4taGVhZGVyLWxlZnQnIDogJ2FjdGlvbi1jb2x1bW4taGVhZGVyLXJpZ2h0J1wiXG4gICAgPlxuICAgICAge3sgJ09DWF9EQVRBX1RBQkxFLkFDVElPTlNfQ09MVU1OX05BTUUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48cC10YWJsZVxuICBbdmFsdWVdPVwiKGRpc3BsYXllZFJvd3MkIHwgYXN5bmMpIHx8IFtdXCJcbiAgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gIFtwYWdpbmF0b3JdPVwicGFnaW5hdG9yXCJcbiAgW2ZpcnN0XT1cInBhZ2UgKiBwYWdlU2l6ZVwiXG4gIChvblBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICBbcm93c109XCJwYWdlU2l6ZVwiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAodG90YWxSZWNvcmRzT25TZXJ2ZXIgPyBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA6IGN1cnJlbnRQYWdlU2hvd2luZ0tleSkgfCB0cmFuc2xhdGU6cGFyYW1zIH19XCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbMTAsIDI1LCA1MCwgcm93cz8ubGVuZ3RoXVwiXG4gIGlkPVwiZGF0YVRhYmxlX3t7bmFtZX19XCJcbiAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgW3NlbGVjdGlvbl09XCIoc2VsZWN0ZWRSb3dzJCB8IGFzeW5jKSB8fCBbXVwiXG4gIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuPlxuICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwicGFnaW5hdG9yZHJvcGRvd25pdGVtXCI+XG4gICAge3sgaXRlbS52YWx1ZSA9PT0gcm93cz8ubGVuZ3RoID8gKFwiT0NYX0RBVEFfVEFCTEUuQUxMXCIgfCB0cmFuc2xhdGUpIDogaXRlbS52YWx1ZSB9fVxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgPHRyPlxuICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDRyZW1cIiBzY29wZT1cImNvbFwiICpuZ0lmPVwic2VsZWN0aW9uQ2hhbmdlZE9ic2VydmVkXCI+XG4gICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XG4gICAgICA8L3RoPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIj5cbiAgICAgICAgPHRoICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlIHx8IGNvbHVtbi5maWx0ZXJhYmxlOyBlbHNlIHNpbXBsZUhlYWRlclwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci13cmFwcGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBpZD1cInt7Y29sdW1uLmlkfX0taGVhZGVyLW5hbWVcIj57eyBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1idXR0b24taGVhZGVyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHNvcnRCdXR0b25cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFsdC1zbGFzaF09XCIoY29sdW1uPy5pZCA9PT0gc29ydENvbHVtbiAmJiBzb3J0RGlyZWN0aW9uID09PSAnTk9ORScpIHx8IGNvbHVtbj8uaWQgIT09IHNvcnRDb2x1bW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5waS1zb3J0LWFtb3VudC11cF09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdBU0NFTkRJTkcnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucGktc29ydC1hbW91bnQtZG93bl09XCJjb2x1bW4/LmlkID09PSBzb3J0Q29sdW1uICYmIHNvcnREaXJlY3Rpb24gPT09ICdERVNDRU5ESU5HJ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU29ydENvbHVtbkNsaWNrKGNvbHVtbi5pZClcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoc29ydEljb25UaXRsZShjb2x1bW4uaWQpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoJ09DWF9EQVRBX1RBQkxFLlRPR0dMRV9CVVRUT04uQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiAoY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUpLCBkaXJlY3Rpb246IChzb3J0RGlyZWN0aW9uVG9UaXRsZShjb2x1bW5OZXh0U29ydERpcmVjdGlvbihjb2x1bW4uaWQpKSB8IHRyYW5zbGF0ZSl9KVwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZpbHRlck11bHRpU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCIoY3VycmVudEZpbHRlck9wdGlvbnMkIHwgYXN5bmMpIHx8IFtdXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCIoY3VycmVudFNlbGVjdGVkRmlsdGVycyQgfCBhc3luYykgfHwgW11cIlxuICAgICAgICAgICAgICAgIFtzaG93VG9nZ2xlQWxsXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGVtcHR5RmlsdGVyTWVzc2FnZT1cInt7ICdPQ1hfREFUQV9UQUJMRS5FTVBUWV9GSUxURVJfTUVTU0FHRScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFtkaXNwbGF5U2VsZWN0ZWRMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZpbHRlckNoYW5nZShjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiSWNvblwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJvbkZpbHRlckNsaWNrKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInT0NYX0RBVEFfVEFCTEUuRklMVEVSX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cInt7KCdPQ1hfREFUQV9UQUJMRS5GSUxURVJfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgY29sdW1uOiBjb2x1bW4ubmFtZUtleSB8IHRyYW5zbGF0ZX0pfX1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbXNcIiBsZXQtdmFsdWU+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGlcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MucGktZmlsdGVyXT1cIiEoKGZpbHRlckFtb3VudHMkIHwgYXN5bmMpIHx8IHt9KVtjb2x1bW4uaWRdXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpLWZpbHRlci1maWxsXT1cIigoZmlsdGVyQW1vdW50cyQgfCBhc3luYykgfHwge30pW2NvbHVtbi5pZF0gPiAwXCJcbiAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LXZhbHVlPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiKGN1cnJlbnRGaWx0ZXJDb2x1bW4kIHwgYXN5bmMpPy5jb2x1bW5UeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInREFURSdcIj57eyB2YWx1ZS5sYWJlbCB8IGRhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ1N3aXRjaERlZmF1bHQ+IHt7IHZhbHVlLmxhYmVsIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzaW1wbGVIZWFkZXI+XG4gICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3sgY29sdW1uLm5hbWVLZXkgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQ29sdW1uUG9zaXRpb24gPT09ICdyaWdodCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW5IZWFkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd09iamVjdD5cbiAgICA8dHI+XG4gICAgICA8dGQgKm5nSWY9XCJzZWxlY3Rpb25DaGFuZ2VkT2JzZXJ2ZWRcIj5cbiAgICAgICAgPHAtdGFibGVDaGVja2JveCBbdmFsdWVdPVwicm93T2JqZWN0XCI+PC9wLXRhYmxlQ2hlY2tib3g+XG4gICAgICA8L3RkPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAnbGVmdCc7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhY3Rpb25Db2x1bW47IGNvbnRleHQ6IHtsb2NhbFJvd09iamVjdDogcm93T2JqZWN0fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgIF9jZWxsID8gX2NlbGw6IGRlZmF1bHRDZWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcm93T2JqZWN0OiByb3dPYmplY3QsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvbkNvbHVtblBvc2l0aW9uID09PSAncmlnaHQnO1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQ29sdW1uOyBjb250ZXh0OiB7bG9jYWxSb3dPYmplY3Q6IHJvd09iamVjdH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cbiAgICA8dHI+XG4gICAgICA8dGQgW2NvbFNwYW5dPVwiY29sdW1ucy5sZW5ndGggKyAoKGFueVJvd0FjdGlvbk9ic2VydmVkKSA/IDEgOiAwKVwiPnt7IGVtcHR5UmVzdWx0c01lc3NhZ2UgfHwgKFwiT0NYX0RBVEFfVEFCTEUuRU1QVFlfUkVTVUxUXCIgfCB0cmFuc2xhdGUpIH19PC90ZD5cbiAgICA8L3RyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9wLXRhYmxlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRDZWxsIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5jb2x1bW5UeXBlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ0RBVEUnXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgX2RhdGVDZWxsID8gX2RhdGVDZWxsIDogZGVmYXVsdERhdGVDZWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidSRUxBVElWRV9EQVRFJ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgIF9yZWxhdGl2ZURhdGVDZWxsID8gX3JlbGF0aXZlRGF0ZUNlbGwgOiBkZWZhdWx0UmVsYXRpdmVEYXRlQ2VsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICByb3dPYmplY3Q6IHJvd09iamVjdCxcbiAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgfVwiXG4gICAgICA+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInVFJBTlNMQVRJT05fS0VZJ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgIF90cmFuc2xhdGlvbktleUNlbGwgPyBfdHJhbnNsYXRpb25LZXlDZWxsOiBkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidOVU1CRVInXCI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIlxuICAgICAgICAgICAgX251bWJlckNlbGwgPyBfbnVtYmVyQ2VsbDogZGVmYXVsdE51bWJlckNlbGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgcm93T2JqZWN0OiByb3dPYmplY3QsXG4gICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgICAgIF9zdHJpbmdDZWxsID8gX3N0cmluZ0NlbGw6IGRlZmF1bHRTdHJpbmdDZWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHJvd09iamVjdDogcm93T2JqZWN0LFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFN0cmluZ0NlbGwgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcm93T2JqZWN0W2NvbHVtbi5pZF0gfX0gPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHROdW1iZXJDZWxsIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJvd09iamVjdFtjb2x1bW4uaWRdIHwgbnVtYmVyIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF0ZUNlbGwgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgcm93T2JqZWN0W2NvbHVtbi5pZF0gfCBkYXRlOiAnbWVkaXVtJyB9fSA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlbGF0aXZlRGF0ZUNlbGwgbGV0LXJvd09iamVjdD1cInJvd09iamVjdFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgPG5nLWNvbnRhaW5lcj4ge3sgJ09DWF9EQVRBX1RBQkxFLkVESVRFRCcgfCB0cmFuc2xhdGUgfX0ge3sgcm93T2JqZWN0W2NvbHVtbi5pZF0gfCB0aW1lYWdvIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VHJhbnNsYXRpb25LZXlDZWxsIGxldC1yb3dPYmplY3Q9XCJyb3dPYmplY3RcIiBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxuZy1jb250YWluZXI+IHt7IHJvd09iamVjdFtjb2x1bW4uaWRdIHwgdHJhbnNsYXRlIH19IDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==