@aquera/ngx-smart-table 0.0.16-alpha → 0.0.18-alpha

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 (170) hide show
  1. package/{fesm2020 → fesm2022}/aquera-ngx-smart-table.mjs +1664 -2107
  2. package/fesm2022/aquera-ngx-smart-table.mjs.map +1 -0
  3. package/package.json +8 -16
  4. package/types/aquera-ngx-smart-table.d.ts +5909 -0
  5. package/aquera-ngx-smart-table.d.ts +0 -5
  6. package/esm2020/aquera-ngx-smart-table.mjs +0 -5
  7. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +0 -63
  8. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +0 -115
  9. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +0 -206
  10. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +0 -125
  11. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +0 -105
  12. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +0 -132
  13. package/esm2020/lib/builder/definition-builder.module.mjs +0 -70
  14. package/esm2020/lib/builder/models/builder-state.interface.mjs +0 -5
  15. package/esm2020/lib/builder/services/definition-builder.service.mjs +0 -251
  16. package/esm2020/lib/builder/services/definition-export.service.mjs +0 -167
  17. package/esm2020/lib/builder/services/definition-import.service.mjs +0 -193
  18. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +0 -126
  19. package/esm2020/lib/builder/utils/config-validator.util.mjs +0 -165
  20. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +0 -206
  21. package/esm2020/lib/editors/index.mjs +0 -9
  22. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +0 -228
  23. package/esm2020/lib/editors/nile-calendar-editor.mjs +0 -211
  24. package/esm2020/lib/editors/nile-date-picker-editor.mjs +0 -188
  25. package/esm2020/lib/editors/nile-input-editor.mjs +0 -235
  26. package/esm2020/lib/editors/nile-select-editor.mjs +0 -419
  27. package/esm2020/lib/factories/column-config.factory.mjs +0 -231
  28. package/esm2020/lib/models/autosave-config.interface.mjs +0 -8
  29. package/esm2020/lib/models/base-column-config.class.mjs +0 -253
  30. package/esm2020/lib/models/cell-strategies.interface.mjs +0 -6
  31. package/esm2020/lib/models/cell-types.mjs +0 -147
  32. package/esm2020/lib/models/column-action.interface.mjs +0 -6
  33. package/esm2020/lib/models/column-config.interface.mjs +0 -43
  34. package/esm2020/lib/models/column-config.utils.mjs +0 -101
  35. package/esm2020/lib/models/row-action.interface.mjs +0 -5
  36. package/esm2020/lib/models/row-validator.interface.mjs +0 -2
  37. package/esm2020/lib/models/schema-validation.interface.mjs +0 -2
  38. package/esm2020/lib/models/sheet-action.interface.mjs +0 -5
  39. package/esm2020/lib/models/sheet-config.interface.mjs +0 -5
  40. package/esm2020/lib/models/table-config.interface.mjs +0 -107
  41. package/esm2020/lib/models/table-validator.interface.mjs +0 -2
  42. package/esm2020/lib/models/workbook-action.interface.mjs +0 -5
  43. package/esm2020/lib/models/workbook-config.interface.mjs +0 -5
  44. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +0 -24
  45. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +0 -397
  46. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +0 -103
  47. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +0 -383
  48. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +0 -232
  49. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +0 -97
  50. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +0 -157
  51. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +0 -87
  52. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +0 -167
  53. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +0 -165
  54. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +0 -112
  55. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +0 -1453
  56. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +0 -169
  57. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +0 -581
  58. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +0 -28
  59. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +0 -108
  60. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +0 -83
  61. package/esm2020/lib/renderer/models/cell-state.interface.mjs +0 -66
  62. package/esm2020/lib/renderer/models/cell.class.mjs +0 -389
  63. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +0 -7
  64. package/esm2020/lib/renderer/models/sheet-state.class.mjs +0 -90
  65. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +0 -5
  66. package/esm2020/lib/renderer/models/table-state.class.mjs +0 -871
  67. package/esm2020/lib/renderer/models/table-state.interface.mjs +0 -5
  68. package/esm2020/lib/renderer/models/table-types.mjs +0 -29
  69. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +0 -7
  70. package/esm2020/lib/renderer/models/workbook-state.class.mjs +0 -174
  71. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +0 -5
  72. package/esm2020/lib/renderer/models/z-index.enum.mjs +0 -55
  73. package/esm2020/lib/schemas/table-config.schema.mjs +0 -472
  74. package/esm2020/lib/services/autosave.service.mjs +0 -92
  75. package/esm2020/lib/services/custom-validation-rules.util.mjs +0 -124
  76. package/esm2020/lib/services/json-schema-validator.service.mjs +0 -216
  77. package/esm2020/lib/services/row-validation.service.mjs +0 -42
  78. package/esm2020/lib/services/validation-logger.service.mjs +0 -177
  79. package/esm2020/lib/services/virtual-scroll.service.mjs +0 -52
  80. package/esm2020/lib/shared/shared-table-components.module.mjs +0 -35
  81. package/esm2020/lib/smart-table.module.mjs +0 -124
  82. package/esm2020/lib/strategies/default-editors.mjs +0 -433
  83. package/esm2020/lib/strategies/default-formatters.mjs +0 -238
  84. package/esm2020/lib/strategies/default-validators.mjs +0 -327
  85. package/esm2020/public-api.mjs +0 -146
  86. package/fesm2015/aquera-ngx-smart-table.mjs +0 -12267
  87. package/fesm2015/aquera-ngx-smart-table.mjs.map +0 -1
  88. package/fesm2020/aquera-ngx-smart-table.mjs.map +0 -1
  89. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +0 -31
  90. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +0 -53
  91. package/lib/builder/components/column-editor/column-editor.component.d.ts +0 -69
  92. package/lib/builder/components/column-list/column-list.component.d.ts +0 -65
  93. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +0 -58
  94. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +0 -32
  95. package/lib/builder/definition-builder.module.d.ts +0 -15
  96. package/lib/builder/models/builder-state.interface.d.ts +0 -93
  97. package/lib/builder/services/definition-builder.service.d.ts +0 -80
  98. package/lib/builder/services/definition-export.service.d.ts +0 -59
  99. package/lib/builder/services/definition-import.service.d.ts +0 -31
  100. package/lib/builder/services/sample-data-generator.service.d.ts +0 -41
  101. package/lib/builder/utils/config-validator.util.d.ts +0 -32
  102. package/lib/builder/utils/typescript-generator.util.d.ts +0 -29
  103. package/lib/editors/index.d.ts +0 -8
  104. package/lib/editors/nile-autocomplete-editor.d.ts +0 -102
  105. package/lib/editors/nile-calendar-editor.d.ts +0 -88
  106. package/lib/editors/nile-date-picker-editor.d.ts +0 -97
  107. package/lib/editors/nile-input-editor.d.ts +0 -67
  108. package/lib/editors/nile-select-editor.d.ts +0 -110
  109. package/lib/factories/column-config.factory.d.ts +0 -73
  110. package/lib/models/autosave-config.interface.d.ts +0 -23
  111. package/lib/models/base-column-config.class.d.ts +0 -115
  112. package/lib/models/cell-strategies.interface.d.ts +0 -188
  113. package/lib/models/cell-types.d.ts +0 -337
  114. package/lib/models/column-action.interface.d.ts +0 -86
  115. package/lib/models/column-config.interface.d.ts +0 -272
  116. package/lib/models/column-config.utils.d.ts +0 -37
  117. package/lib/models/row-action.interface.d.ts +0 -86
  118. package/lib/models/row-validator.interface.d.ts +0 -37
  119. package/lib/models/schema-validation.interface.d.ts +0 -42
  120. package/lib/models/sheet-action.interface.d.ts +0 -59
  121. package/lib/models/sheet-config.interface.d.ts +0 -41
  122. package/lib/models/table-config.interface.d.ts +0 -251
  123. package/lib/models/table-validator.interface.d.ts +0 -40
  124. package/lib/models/workbook-action.interface.d.ts +0 -95
  125. package/lib/models/workbook-config.interface.d.ts +0 -107
  126. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +0 -9
  127. package/lib/renderer/components/st-cell/st-cell.component.d.ts +0 -69
  128. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +0 -39
  129. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +0 -139
  130. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +0 -81
  131. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +0 -44
  132. package/lib/renderer/components/st-header/st-header.component.d.ts +0 -93
  133. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +0 -42
  134. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +0 -67
  135. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +0 -98
  136. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +0 -58
  137. package/lib/renderer/components/st-table/st-table.component.d.ts +0 -380
  138. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +0 -77
  139. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +0 -275
  140. package/lib/renderer/directives/click-outside.directive.d.ts +0 -10
  141. package/lib/renderer/directives/st-column-resize.directive.d.ts +0 -44
  142. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +0 -19
  143. package/lib/renderer/models/cell-state.interface.d.ts +0 -118
  144. package/lib/renderer/models/cell.class.d.ts +0 -174
  145. package/lib/renderer/models/row-validation-state.interface.d.ts +0 -27
  146. package/lib/renderer/models/sheet-state.class.d.ts +0 -67
  147. package/lib/renderer/models/sheet-state.interface.d.ts +0 -55
  148. package/lib/renderer/models/table-state.class.d.ts +0 -320
  149. package/lib/renderer/models/table-state.interface.d.ts +0 -18
  150. package/lib/renderer/models/table-types.d.ts +0 -228
  151. package/lib/renderer/models/table-validation-state.interface.d.ts +0 -34
  152. package/lib/renderer/models/workbook-state.class.d.ts +0 -117
  153. package/lib/renderer/models/workbook-state.interface.d.ts +0 -71
  154. package/lib/renderer/models/z-index.enum.d.ts +0 -44
  155. package/lib/schemas/table-config.schema.d.ts +0 -455
  156. package/lib/services/autosave.service.d.ts +0 -73
  157. package/lib/services/custom-validation-rules.util.d.ts +0 -12
  158. package/lib/services/json-schema-validator.service.d.ts +0 -49
  159. package/lib/services/row-validation.service.d.ts +0 -17
  160. package/lib/services/validation-logger.service.d.ts +0 -87
  161. package/lib/services/virtual-scroll.service.d.ts +0 -44
  162. package/lib/shared/shared-table-components.module.d.ts +0 -9
  163. package/lib/smart-table.module.d.ts +0 -26
  164. package/lib/strategies/default-editors.d.ts +0 -109
  165. package/lib/strategies/default-formatters.d.ts +0 -116
  166. package/lib/strategies/default-validators.d.ts +0 -113
  167. package/public-api.d.ts +0 -70
  168. package/src/lib/builder/README.md +0 -30
  169. package/src/lib/editors/README.md +0 -303
  170. package/src/lib/renderer/components/st-column-filter/README.md +0 -286
@@ -1,251 +0,0 @@
1
- /**
2
- * Definition builder service
3
- * Manages builder state and column operations
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { BehaviorSubject } from 'rxjs';
7
- import { mergeTableConfig, DEFAULT_TABLE_CONFIG } from '../../models/table-config.interface';
8
- import { ColumnConfigFactory } from '../../factories/column-config.factory';
9
- import { CellDataType } from '../../models/cell-types';
10
- import * as i0 from "@angular/core";
11
- export class DefinitionBuilderService {
12
- constructor() {
13
- this.stateSubject = new BehaviorSubject(this.createInitialState());
14
- this.state$ = this.stateSubject.asObservable();
15
- }
16
- /**
17
- * Get current state
18
- */
19
- getState() {
20
- return { ...this.stateSubject.value };
21
- }
22
- /**
23
- * Create initial empty state
24
- */
25
- createInitialState() {
26
- return {
27
- tableConfig: {
28
- columns: [],
29
- ...DEFAULT_TABLE_CONFIG
30
- },
31
- selectedColumn: null,
32
- selectedColumnIndex: null,
33
- previewVisible: true,
34
- hasUnsavedChanges: false
35
- };
36
- }
37
- /**
38
- * Initialize with a TableConfig
39
- */
40
- initialize(config) {
41
- const mergedConfig = mergeTableConfig(config);
42
- this.updateState({
43
- tableConfig: mergedConfig,
44
- selectedColumn: null,
45
- selectedColumnIndex: null,
46
- hasUnsavedChanges: false,
47
- lastSavedConfig: { ...mergedConfig }
48
- });
49
- }
50
- /**
51
- * Create new definition (reset to empty)
52
- */
53
- newDefinition() {
54
- this.updateState(this.createInitialState());
55
- }
56
- /**
57
- * Add a new column
58
- */
59
- addColumn(type = CellDataType.STRING) {
60
- const key = this.generateUniqueKey('newColumn');
61
- let column;
62
- switch (type) {
63
- case CellDataType.STRING:
64
- column = ColumnConfigFactory.text(key);
65
- break;
66
- case CellDataType.NUMBER:
67
- column = ColumnConfigFactory.number(key);
68
- break;
69
- case CellDataType.DATE:
70
- column = ColumnConfigFactory.date(key);
71
- break;
72
- case CellDataType.BOOLEAN:
73
- column = ColumnConfigFactory.boolean(key);
74
- break;
75
- default:
76
- column = ColumnConfigFactory.text(key);
77
- }
78
- const state = this.getState();
79
- const newColumns = [...state.tableConfig.columns, column];
80
- this.updateTableConfig({ ...state.tableConfig, columns: newColumns });
81
- // Select the new column
82
- this.selectColumn(newColumns.length - 1);
83
- return column;
84
- }
85
- /**
86
- * Update a column at the given index
87
- */
88
- updateColumn(index, updates) {
89
- const state = this.getState();
90
- if (index < 0 || index >= state.tableConfig.columns.length) {
91
- return;
92
- }
93
- const columns = [...state.tableConfig.columns];
94
- columns[index] = { ...columns[index], ...updates };
95
- this.updateTableConfig({ ...state.tableConfig, columns });
96
- // Update selected column if it's the one being updated
97
- if (state.selectedColumnIndex === index) {
98
- this.selectColumn(index);
99
- }
100
- }
101
- /**
102
- * Delete a column at the given index
103
- */
104
- deleteColumn(index) {
105
- const state = this.getState();
106
- if (index < 0 || index >= state.tableConfig.columns.length) {
107
- return;
108
- }
109
- const columns = state.tableConfig.columns.filter((_, i) => i !== index);
110
- this.updateTableConfig({ ...state.tableConfig, columns });
111
- // Clear selection if deleted column was selected
112
- if (state.selectedColumnIndex === index) {
113
- this.clearSelection();
114
- }
115
- else if (state.selectedColumnIndex !== null && state.selectedColumnIndex > index) {
116
- // Adjust selection index if a column before the selected one was deleted
117
- this.selectColumn(state.selectedColumnIndex - 1);
118
- }
119
- }
120
- /**
121
- * Reorder columns
122
- */
123
- reorderColumns(fromIndex, toIndex) {
124
- const state = this.getState();
125
- const columns = [...state.tableConfig.columns];
126
- const [moved] = columns.splice(fromIndex, 1);
127
- columns.splice(toIndex, 0, moved);
128
- this.updateTableConfig({ ...state.tableConfig, columns });
129
- // Update selection if needed
130
- if (state.selectedColumnIndex !== null) {
131
- let newIndex = state.selectedColumnIndex;
132
- if (state.selectedColumnIndex === fromIndex) {
133
- newIndex = toIndex;
134
- }
135
- else if (fromIndex < state.selectedColumnIndex && toIndex >= state.selectedColumnIndex) {
136
- newIndex = state.selectedColumnIndex - 1;
137
- }
138
- else if (fromIndex > state.selectedColumnIndex && toIndex <= state.selectedColumnIndex) {
139
- newIndex = state.selectedColumnIndex + 1;
140
- }
141
- this.selectColumn(newIndex);
142
- }
143
- }
144
- /**
145
- * Select a column for editing
146
- */
147
- selectColumn(index) {
148
- const state = this.getState();
149
- if (index < 0 || index >= state.tableConfig.columns.length) {
150
- this.clearSelection();
151
- return;
152
- }
153
- this.updateState({
154
- selectedColumn: { ...state.tableConfig.columns[index] },
155
- selectedColumnIndex: index
156
- });
157
- }
158
- /**
159
- * Clear column selection
160
- */
161
- clearSelection() {
162
- this.updateState({
163
- selectedColumn: null,
164
- selectedColumnIndex: null
165
- });
166
- }
167
- /**
168
- * Update table configuration
169
- */
170
- updateTableConfig(config) {
171
- const state = this.getState();
172
- const mergedConfig = mergeTableConfig(config);
173
- this.updateState({
174
- tableConfig: mergedConfig,
175
- hasUnsavedChanges: !this.configsEqual(state.lastSavedConfig, mergedConfig)
176
- });
177
- }
178
- /**
179
- * Update table-level settings (pagination, sorting, etc.)
180
- */
181
- updateTableSettings(settings) {
182
- const state = this.getState();
183
- this.updateTableConfig({
184
- ...state.tableConfig,
185
- ...settings
186
- });
187
- }
188
- /**
189
- * Toggle preview visibility
190
- */
191
- togglePreview() {
192
- const state = this.getState();
193
- this.updateState({
194
- previewVisible: !state.previewVisible
195
- });
196
- }
197
- /**
198
- * Mark configuration as saved
199
- */
200
- markAsSaved() {
201
- const state = this.getState();
202
- this.updateState({
203
- hasUnsavedChanges: false,
204
- lastSavedConfig: { ...state.tableConfig }
205
- });
206
- }
207
- /**
208
- * Update state (internal)
209
- */
210
- updateState(updates) {
211
- const currentState = this.getState();
212
- const newState = { ...currentState, ...updates };
213
- this.stateSubject.next(newState);
214
- }
215
- /**
216
- * Generate unique column key
217
- */
218
- generateUniqueKey(baseKey) {
219
- const state = this.getState();
220
- const existingKeys = new Set(state.tableConfig.columns.map(col => col.key));
221
- if (!existingKeys.has(baseKey)) {
222
- return baseKey;
223
- }
224
- let counter = 1;
225
- let newKey = `${baseKey}${counter}`;
226
- while (existingKeys.has(newKey)) {
227
- counter++;
228
- newKey = `${baseKey}${counter}`;
229
- }
230
- return newKey;
231
- }
232
- /**
233
- * Compare two configs for equality (deep comparison)
234
- */
235
- configsEqual(config1, config2) {
236
- if (!config1 || !config2) {
237
- return config1 === config2;
238
- }
239
- // Simple comparison - in production, use a deep equality library
240
- return JSON.stringify(config1) === JSON.stringify(config2);
241
- }
242
- }
243
- DefinitionBuilderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
244
- DefinitionBuilderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, providedIn: 'root' });
245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderService, decorators: [{
246
- type: Injectable,
247
- args: [{
248
- providedIn: 'root'
249
- }]
250
- }] });
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2J1aWxkZXIvc2VydmljZXMvZGVmaW5pdGlvbi1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTFHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFLdkQsTUFBTSxPQUFPLHdCQUF3QjtJQUhyQztRQUlVLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNwRSxXQUFNLEdBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7S0FrUXJGO0lBaFFDOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU87WUFDTCxXQUFXLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsR0FBRyxvQkFBb0I7YUFDeEI7WUFDRCxjQUFjLEVBQUUsSUFBSTtZQUNwQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUs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LENBQUMsQ0FBQztJQUM3RCxDQUFDOztxSEFuUVUsd0JBQXdCO3lIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZpbml0aW9uIGJ1aWxkZXIgc2VydmljZVxuICogTWFuYWdlcyBidWlsZGVyIHN0YXRlIGFuZCBjb2x1bW4gb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGFibGVDb25maWcsIG1lcmdlVGFibGVDb25maWcsIERFRkFVTFRfVEFCTEVfQ09ORklHIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZ0ZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMvY29sdW1uLWNvbmZpZy5mYWN0b3J5JztcbmltcG9ydCB7IEJ1aWxkZXJTdGF0ZSB9IGZyb20gJy4uL21vZGVscy9idWlsZGVyLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERlZmluaXRpb25CdWlsZGVyU2VydmljZSB7XG4gIHByaXZhdGUgc3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCdWlsZGVyU3RhdGU+KHRoaXMuY3JlYXRlSW5pdGlhbFN0YXRlKCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGUkOiBPYnNlcnZhYmxlPEJ1aWxkZXJTdGF0ZT4gPSB0aGlzLnN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc3RhdGVcbiAgICovXG4gIGdldFN0YXRlKCk6IEJ1aWxkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5zdGF0ZVN1YmplY3QudmFsdWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5pdGlhbCBlbXB0eSBzdGF0ZVxuICAgKi9cbiAgY3JlYXRlSW5pdGlhbFN0YXRlKCk6IEJ1aWxkZXJTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlQ29uZmlnOiB7XG4gICAgICAgIGNvbHVtbnM6IFtdLFxuICAgICAgICAuLi5ERUZBVUxUX1RBQkxFX0NPTkZJR1xuICAgICAgfSxcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbCxcbiAgICAgIHByZXZpZXdWaXNpYmxlOiB0cnVlLFxuICAgICAgaGFzVW5zYXZlZENoYW5nZXM6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHdpdGggYSBUYWJsZUNvbmZpZ1xuICAgKi9cbiAgaW5pdGlhbGl6ZShjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgdGFibGVDb25maWc6IG1lcmdlZENvbmZpZyxcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbCxcbiAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzOiBmYWxzZSxcbiAgICAgIGxhc3RTYXZlZENvbmZpZzogeyAuLi5tZXJnZWRDb25maWcgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBuZXcgZGVmaW5pdGlvbiAocmVzZXQgdG8gZW1wdHkpXG4gICAqL1xuICBuZXdEZWZpbml0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU3RhdGUodGhpcy5jcmVhdGVJbml0aWFsU3RhdGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGNvbHVtblxuICAgKi9cbiAgYWRkQ29sdW1uKHR5cGU6IENlbGxEYXRhVHlwZSA9IENlbGxEYXRhVHlwZS5TVFJJTkcpOiBDb2x1bW5Db25maWcge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2VuZXJhdGVVbmlxdWVLZXkoJ25ld0NvbHVtbicpO1xuICAgIGxldCBjb2x1bW46IENvbHVtbkNvbmZpZztcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuU1RSSU5HOlxuICAgICAgICBjb2x1bW4gPSBDb2x1bW5Db25maWdGYWN0b3J5LnRleHQoa2V5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENlbGxEYXRhVHlwZS5OVU1CRVI6XG4gICAgICAgIGNvbHVtbiA9IENvbHVtbkNvbmZpZ0ZhY3RvcnkubnVtYmVyKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuREFURTpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5kYXRlKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDZWxsRGF0YVR5cGUuQk9PTEVBTjpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS5ib29sZWFuKGtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29sdW1uID0gQ29sdW1uQ29uZmlnRmFjdG9yeS50ZXh0KGtleSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbmV3Q29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zLCBjb2x1bW5dO1xuICAgIHRoaXMudXBkYXRlVGFibGVDb25maWcoeyAuLi5zdGF0ZS50YWJsZUNvbmZpZywgY29sdW1uczogbmV3Q29sdW1ucyB9KTtcblxuICAgIC8vIFNlbGVjdCB0aGUgbmV3IGNvbHVtblxuICAgIHRoaXMuc2VsZWN0Q29sdW1uKG5ld0NvbHVtbnMubGVuZ3RoIC0gMSk7XG5cbiAgICByZXR1cm4gY29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIGNvbHVtbiBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICovXG4gIHVwZGF0ZUNvbHVtbihpbmRleDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPENvbHVtbkNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zXTtcbiAgICBjb2x1bW5zW2luZGV4XSA9IHsgLi4uY29sdW1uc1tpbmRleF0sIC4uLnVwZGF0ZXMgfTtcblxuICAgIHRoaXMudXBkYXRlVGFibGVDb25maWcoeyAuLi5zdGF0ZS50YWJsZUNvbmZpZywgY29sdW1ucyB9KTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBjb2x1bW4gaWYgaXQncyB0aGUgb25lIGJlaW5nIHVwZGF0ZWRcbiAgICBpZiAoc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29sdW1uKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29sdW1uIGF0IHRoZSBnaXZlbiBpbmRleFxuICAgKi9cbiAgZGVsZXRlQ29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgdGhpcy51cGRhdGVUYWJsZUNvbmZpZyh7IC4uLnN0YXRlLnRhYmxlQ29uZmlnLCBjb2x1bW5zIH0pO1xuXG4gICAgLy8gQ2xlYXIgc2VsZWN0aW9uIGlmIGRlbGV0ZWQgY29sdW1uIHdhcyBzZWxlY3RlZFxuICAgIGlmIChzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ID09PSBpbmRleCkge1xuICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCAhPT0gbnVsbCAmJiBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgIC8vIEFkanVzdCBzZWxlY3Rpb24gaW5kZXggaWYgYSBjb2x1bW4gYmVmb3JlIHRoZSBzZWxlY3RlZCBvbmUgd2FzIGRlbGV0ZWRcbiAgICAgIHRoaXMuc2VsZWN0Q29sdW1uKHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggLSAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVvcmRlciBjb2x1bW5zXG4gICAqL1xuICByZW9yZGVyQ29sdW1ucyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgY29sdW1ucyA9IFsuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zXTtcbiAgICBjb25zdCBbbW92ZWRdID0gY29sdW1ucy5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICBjb2x1bW5zLnNwbGljZSh0b0luZGV4LCAwLCBtb3ZlZCk7XG5cbiAgICB0aGlzLnVwZGF0ZVRhYmxlQ29uZmlnKHsgLi4uc3RhdGUudGFibGVDb25maWcsIGNvbHVtbnMgfSk7XG5cbiAgICAvLyBVcGRhdGUgc2VsZWN0aW9uIGlmIG5lZWRlZFxuICAgIGlmIChzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4ICE9PSBudWxsKSB7XG4gICAgICBsZXQgbmV3SW5kZXggPSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4O1xuICAgICAgaWYgKHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggPT09IGZyb21JbmRleCkge1xuICAgICAgICBuZXdJbmRleCA9IHRvSW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA8IHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggJiYgdG9JbmRleCA+PSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4KSB7XG4gICAgICAgIG5ld0luZGV4ID0gc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCAtIDE7XG4gICAgICB9IGVsc2UgaWYgKGZyb21JbmRleCA+IHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXggJiYgdG9JbmRleCA8PSBzdGF0ZS5zZWxlY3RlZENvbHVtbkluZGV4KSB7XG4gICAgICAgIG5ld0luZGV4ID0gc3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleCArIDE7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdENvbHVtbihuZXdJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBhIGNvbHVtbiBmb3IgZWRpdGluZ1xuICAgKi9cbiAgc2VsZWN0Q29sdW1uKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICBzZWxlY3RlZENvbHVtbjogeyAuLi5zdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zW2luZGV4XSB9LFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogaW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBjb2x1bW4gc2VsZWN0aW9uXG4gICAqL1xuICBjbGVhclNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcbiAgICAgIHNlbGVjdGVkQ29sdW1uOiBudWxsLFxuICAgICAgc2VsZWN0ZWRDb2x1bW5JbmRleDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICB1cGRhdGVUYWJsZUNvbmZpZyhjb25maWc6IFRhYmxlQ29uZmlnKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gbWVyZ2VUYWJsZUNvbmZpZyhjb25maWcpO1xuICAgIFxuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgdGFibGVDb25maWc6IG1lcmdlZENvbmZpZyxcbiAgICAgIGhhc1Vuc2F2ZWRDaGFuZ2VzOiAhdGhpcy5jb25maWdzRXF1YWwoc3RhdGUubGFzdFNhdmVkQ29uZmlnLCBtZXJnZWRDb25maWcpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRhYmxlLWxldmVsIHNldHRpbmdzIChwYWdpbmF0aW9uLCBzb3J0aW5nLCBldGMuKVxuICAgKi9cbiAgdXBkYXRlVGFibGVTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxUYWJsZUNvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZVRhYmxlQ29uZmlnKHtcbiAgICAgIC4uLnN0YXRlLnRhYmxlQ29uZmlnLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgcHJldmlldyB2aXNpYmlsaXR5XG4gICAqL1xuICB0b2dnbGVQcmV2aWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xuICAgICAgcHJldmlld1Zpc2libGU6ICFzdGF0ZS5wcmV2aWV3VmlzaWJsZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgY29uZmlndXJhdGlvbiBhcyBzYXZlZFxuICAgKi9cbiAgbWFya0FzU2F2ZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICBoYXNVbnNhdmVkQ2hhbmdlczogZmFsc2UsXG4gICAgICBsYXN0U2F2ZWRDb25maWc6IHsgLi4uc3RhdGUudGFibGVDb25maWcgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdGF0ZSAoaW50ZXJuYWwpXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVN0YXRlKHVwZGF0ZXM6IFBhcnRpYWw8QnVpbGRlclN0YXRlPik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBuZXdTdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCAuLi51cGRhdGVzIH07XG4gICAgdGhpcy5zdGF0ZVN1YmplY3QubmV4dChuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdW5pcXVlIGNvbHVtbiBrZXlcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVVbmlxdWVLZXkoYmFzZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KHN0YXRlLnRhYmxlQ29uZmlnLmNvbHVtbnMubWFwKGNvbCA9PiBjb2wua2V5KSk7XG4gICAgXG4gICAgaWYgKCFleGlzdGluZ0tleXMuaGFzKGJhc2VLZXkpKSB7XG4gICAgICByZXR1cm4gYmFzZUtleTtcbiAgICB9XG5cbiAgICBsZXQgY291bnRlciA9IDE7XG4gICAgbGV0IG5ld0tleSA9IGAke2Jhc2VLZXl9JHtjb3VudGVyfWA7XG4gICAgd2hpbGUgKGV4aXN0aW5nS2V5cy5oYXMobmV3S2V5KSkge1xuICAgICAgY291bnRlcisrO1xuICAgICAgbmV3S2V5ID0gYCR7YmFzZUtleX0ke2NvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3S2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIGNvbmZpZ3MgZm9yIGVxdWFsaXR5IChkZWVwIGNvbXBhcmlzb24pXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3NFcXVhbChjb25maWcxPzogVGFibGVDb25maWcsIGNvbmZpZzI/OiBUYWJsZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICghY29uZmlnMSB8fCAhY29uZmlnMikge1xuICAgICAgcmV0dXJuIGNvbmZpZzEgPT09IGNvbmZpZzI7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIGNvbXBhcmlzb24gLSBpbiBwcm9kdWN0aW9uLCB1c2UgYSBkZWVwIGVxdWFsaXR5IGxpYnJhcnlcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29uZmlnMSkgPT09IEpTT04uc3RyaW5naWZ5KGNvbmZpZzIpO1xuICB9XG59XG5cbiJdfQ==
@@ -1,167 +0,0 @@
1
- /**
2
- * Definition export service
3
- * Handles exporting TableConfig to JSON or TypeScript
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { generateTypeScriptCode } from '../utils/typescript-generator.util';
7
- import * as i0 from "@angular/core";
8
- export class DefinitionExportService {
9
- /**
10
- * Export TableConfig to JSON string
11
- * @param config Table configuration
12
- * @param pretty Whether to format JSON with indentation
13
- * @returns JSON string
14
- */
15
- exportToJSON(config, pretty = true) {
16
- // Create a serializable version (remove functions, circular refs)
17
- const serializable = this.sanitizeForJSON(config);
18
- if (pretty) {
19
- return JSON.stringify(serializable, null, 2);
20
- }
21
- else {
22
- return JSON.stringify(serializable);
23
- }
24
- }
25
- /**
26
- * Export TableConfig to TypeScript code
27
- * @param config Table configuration
28
- * @param options Generation options
29
- * @returns TypeScript code string
30
- */
31
- exportToTypeScript(config, options = {}) {
32
- return generateTypeScriptCode(config, options);
33
- }
34
- /**
35
- * Download configuration as JSON file
36
- * @param config Table configuration
37
- * @param fileName File name (without extension)
38
- */
39
- downloadAsJSON(config, fileName = 'table-config') {
40
- const json = this.exportToJSON(config);
41
- this.downloadFile(json, `${fileName}.json`, 'application/json');
42
- }
43
- /**
44
- * Download configuration as TypeScript file
45
- * @param config Table configuration
46
- * @param fileName File name (without extension)
47
- * @param options Generation options
48
- */
49
- downloadAsTypeScript(config, fileName = 'table-config', options = {}) {
50
- const code = this.exportToTypeScript(config, options);
51
- this.downloadFile(code, `${fileName}.ts`, 'text/typescript');
52
- }
53
- /**
54
- * Save configuration to localStorage
55
- * @param config Table configuration
56
- * @param key Storage key
57
- */
58
- saveToLocalStorage(config, key = 'smart-table-definition') {
59
- try {
60
- const json = this.exportToJSON(config, false);
61
- localStorage.setItem(key, json);
62
- }
63
- catch (error) {
64
- console.error('Failed to save to localStorage:', error);
65
- throw error;
66
- }
67
- }
68
- /**
69
- * Load configuration from localStorage
70
- * @param key Storage key
71
- * @returns TableConfig or null if not found
72
- */
73
- loadFromLocalStorage(key = 'smart-table-definition') {
74
- try {
75
- const stored = localStorage.getItem(key);
76
- if (!stored) {
77
- return null;
78
- }
79
- return JSON.parse(stored);
80
- }
81
- catch (error) {
82
- console.error('Failed to load from localStorage:', error);
83
- return null;
84
- }
85
- }
86
- /**
87
- * Sanitize config for JSON serialization
88
- * Removes functions, circular references, and other non-serializable values
89
- */
90
- sanitizeForJSON(config) {
91
- const sanitized = {
92
- columns: config.columns.map(col => this.sanitizeColumn(col)),
93
- pagination: config.pagination,
94
- sorting: config.sorting,
95
- filtering: config.filtering,
96
- display: config.display,
97
- initialState: config.initialState
98
- };
99
- // Remove undefined values
100
- Object.keys(sanitized).forEach(key => {
101
- if (sanitized[key] === undefined) {
102
- delete sanitized[key];
103
- }
104
- });
105
- return sanitized;
106
- }
107
- /**
108
- * Sanitize column config for JSON serialization
109
- */
110
- sanitizeColumn(column) {
111
- const sanitized = {
112
- key: column.key,
113
- header: column.header,
114
- dataType: column.dataType,
115
- editable: column.editable,
116
- sortable: column.sortable,
117
- filterable: column.filterable,
118
- resizable: column.resizable,
119
- width: column.width,
120
- minWidth: column.minWidth,
121
- maxWidth: column.maxWidth,
122
- sticky: column.sticky,
123
- alignment: column.alignment,
124
- verticalAlignment: column.verticalAlignment,
125
- className: column.className,
126
- style: column.style,
127
- tooltip: column.tooltip,
128
- visible: column.visible,
129
- pinned: column.pinned,
130
- sortPriority: column.sortPriority,
131
- metadata: column.metadata
132
- };
133
- // Remove undefined values
134
- Object.keys(sanitized).forEach(key => {
135
- if (sanitized[key] === undefined) {
136
- delete sanitized[key];
137
- }
138
- });
139
- // Note: formatter, validator, editor, parser, hooks are functions
140
- // and cannot be serialized to JSON. They will need to be recreated
141
- // when importing, or stored separately as metadata.
142
- return sanitized;
143
- }
144
- /**
145
- * Download file helper
146
- */
147
- downloadFile(content, fileName, mimeType) {
148
- const blob = new Blob([content], { type: mimeType });
149
- const url = URL.createObjectURL(blob);
150
- const link = document.createElement('a');
151
- link.href = url;
152
- link.download = fileName;
153
- document.body.appendChild(link);
154
- link.click();
155
- document.body.removeChild(link);
156
- URL.revokeObjectURL(url);
157
- }
158
- }
159
- DefinitionExportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
160
- DefinitionExportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionExportService, providedIn: 'root' });
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionExportService, decorators: [{
162
- type: Injectable,
163
- args: [{
164
- providedIn: 'root'
165
- }]
166
- }] });
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1leHBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvYnVpbGRlci9zZXJ2aWNlcy9kZWZpbml0aW9uLWV4cG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLHNCQUFzQixFQUE4QixNQUFNLG9DQUFvQyxDQUFDOztBQUt4RyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLE1BQW1CLEVBQUUsU0FBa0IsSUFBSTtRQUN0RCxrRUFBa0U7UUFDbEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLE1BQU0sRUFBRTtZQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUFtQixFQUFFLFVBQXNDLEVBQUU7UUFDOUUsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsTUFBbUIsRUFBRSxXQUFtQixjQUFjO1FBQ25FLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxRQUFRLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG9CQUFvQixDQUNsQixNQUFtQixFQUNuQixXQUFtQixjQUFjLEVBQ2pDLFVBQXNDLEVBQUU7UUFFeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxrQkFBa0IsQ0FBQyxNQUFtQixFQUFFLE1BQWMsd0JBQXdCO1FBQzVFLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqQztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxNQUFNLEtBQUssQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxNQUFjLHdCQUF3QjtRQUN6RCxJQUFJO1lBQ0YsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNYLE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFnQixDQUFDO1NBQzFDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZSxDQUFDLE1BQW1CO1FBQ3pDLE1BQU0sU0FBUyxHQUFRO1lBQ3JCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtTQUNsQyxDQUFDO1FBRUYsMEJBQTBCO1FBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxNQUFXO1FBQ2hDLE1BQU0sU0FBUyxHQUFRO1lBQ3JCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtZQUNyQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtZQUMzQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7U0FDMUIsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFDbEUsbUVBQW1FO1FBQ25FLG9EQUFvRDtRQUVwRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsT0FBZSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7UUFDdEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7O29IQXJLVSx1QkFBdUI7d0hBQXZCLHVCQUF1QixjQUZ0QixNQUFNOzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmluaXRpb24gZXhwb3J0IHNlcnZpY2VcbiAqIEhhbmRsZXMgZXhwb3J0aW5nIFRhYmxlQ29uZmlnIHRvIEpTT04gb3IgVHlwZVNjcmlwdFxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXhwb3J0T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscy9idWlsZGVyLXN0YXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVR5cGVTY3JpcHRDb2RlLCBUeXBlU2NyaXB0R2VuZXJhdG9yT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHQtZ2VuZXJhdG9yLnV0aWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZWZpbml0aW9uRXhwb3J0U2VydmljZSB7XG4gIC8qKlxuICAgKiBFeHBvcnQgVGFibGVDb25maWcgdG8gSlNPTiBzdHJpbmdcbiAgICogQHBhcmFtIGNvbmZpZyBUYWJsZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcmV0dHkgV2hldGhlciB0byBmb3JtYXQgSlNPTiB3aXRoIGluZGVudGF0aW9uXG4gICAqIEByZXR1cm5zIEpTT04gc3RyaW5nXG4gICAqL1xuICBleHBvcnRUb0pTT04oY29uZmlnOiBUYWJsZUNvbmZpZywgcHJldHR5OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgLy8gQ3JlYXRlIGEgc2VyaWFsaXphYmxlIHZlcnNpb24gKHJlbW92ZSBmdW5jdGlvbnMsIGNpcmN1bGFyIHJlZnMpXG4gICAgY29uc3Qgc2VyaWFsaXphYmxlID0gdGhpcy5zYW5pdGl6ZUZvckpTT04oY29uZmlnKTtcblxuICAgIGlmIChwcmV0dHkpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzZXJpYWxpemFibGUsIG51bGwsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXphYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IFRhYmxlQ29uZmlnIHRvIFR5cGVTY3JpcHQgY29kZVxuICAgKiBAcGFyYW0gY29uZmlnIFRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgR2VuZXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIFR5cGVTY3JpcHQgY29kZSBzdHJpbmdcbiAgICovXG4gIGV4cG9ydFRvVHlwZVNjcmlwdChjb25maWc6IFRhYmxlQ29uZmlnLCBvcHRpb25zOiBUeXBlU2NyaXB0R2VuZXJhdG9yT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVUeXBlU2NyaXB0Q29kZShjb25maWcsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkIGNvbmZpZ3VyYXRpb24gYXMgSlNPTiBmaWxlXG4gICAqIEBwYXJhbSBjb25maWcgVGFibGUgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSBuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICovXG4gIGRvd25sb2FkQXNKU09OKGNvbmZpZzogVGFibGVDb25maWcsIGZpbGVOYW1lOiBzdHJpbmcgPSAndGFibGUtY29uZmlnJyk6IHZvaWQge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLmV4cG9ydFRvSlNPTihjb25maWcpO1xuICAgIHRoaXMuZG93bmxvYWRGaWxlKGpzb24sIGAke2ZpbGVOYW1lfS5qc29uYCwgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBjb25maWd1cmF0aW9uIGFzIFR5cGVTY3JpcHQgZmlsZVxuICAgKiBAcGFyYW0gY29uZmlnIFRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGZpbGVOYW1lIEZpbGUgbmFtZSAod2l0aG91dCBleHRlbnNpb24pXG4gICAqIEBwYXJhbSBvcHRpb25zIEdlbmVyYXRpb24gb3B0aW9uc1xuICAgKi9cbiAgZG93bmxvYWRBc1R5cGVTY3JpcHQoXG4gICAgY29uZmlnOiBUYWJsZUNvbmZpZyxcbiAgICBmaWxlTmFtZTogc3RyaW5nID0gJ3RhYmxlLWNvbmZpZycsXG4gICAgb3B0aW9uczogVHlwZVNjcmlwdEdlbmVyYXRvck9wdGlvbnMgPSB7fVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5leHBvcnRUb1R5cGVTY3JpcHQoY29uZmlnLCBvcHRpb25zKTtcbiAgICB0aGlzLmRvd25sb2FkRmlsZShjb2RlLCBgJHtmaWxlTmFtZX0udHNgLCAndGV4dC90eXBlc2NyaXB0Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGxvY2FsU3RvcmFnZVxuICAgKiBAcGFyYW0gY29uZmlnIFRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGtleSBTdG9yYWdlIGtleVxuICAgKi9cbiAgc2F2ZVRvTG9jYWxTdG9yYWdlKGNvbmZpZzogVGFibGVDb25maWcsIGtleTogc3RyaW5nID0gJ3NtYXJ0LXRhYmxlLWRlZmluaXRpb24nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGpzb24gPSB0aGlzLmV4cG9ydFRvSlNPTihjb25maWcsIGZhbHNlKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwganNvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzYXZlIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gbG9jYWxTdG9yYWdlXG4gICAqIEBwYXJhbSBrZXkgU3RvcmFnZSBrZXlcbiAgICogQHJldHVybnMgVGFibGVDb25maWcgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGxvYWRGcm9tTG9jYWxTdG9yYWdlKGtleTogc3RyaW5nID0gJ3NtYXJ0LXRhYmxlLWRlZmluaXRpb24nKTogVGFibGVDb25maWcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIGlmICghc3RvcmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpIGFzIFRhYmxlQ29uZmlnO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBmcm9tIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgY29uZmlnIGZvciBKU09OIHNlcmlhbGl6YXRpb25cbiAgICogUmVtb3ZlcyBmdW5jdGlvbnMsIGNpcmN1bGFyIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBub24tc2VyaWFsaXphYmxlIHZhbHVlc1xuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZUZvckpTT04oY29uZmlnOiBUYWJsZUNvbmZpZyk6IGFueSB7XG4gICAgY29uc3Qgc2FuaXRpemVkOiBhbnkgPSB7XG4gICAgICBjb2x1bW5zOiBjb25maWcuY29sdW1ucy5tYXAoY29sID0+IHRoaXMuc2FuaXRpemVDb2x1bW4oY29sKSksXG4gICAgICBwYWdpbmF0aW9uOiBjb25maWcucGFnaW5hdGlvbixcbiAgICAgIHNvcnRpbmc6IGNvbmZpZy5zb3J0aW5nLFxuICAgICAgZmlsdGVyaW5nOiBjb25maWcuZmlsdGVyaW5nLFxuICAgICAgZGlzcGxheTogY29uZmlnLmRpc3BsYXksXG4gICAgICBpbml0aWFsU3RhdGU6IGNvbmZpZy5pbml0aWFsU3RhdGVcbiAgICB9O1xuXG4gICAgLy8gUmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBPYmplY3Qua2V5cyhzYW5pdGl6ZWQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChzYW5pdGl6ZWRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBzYW5pdGl6ZWRba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgY29sdW1uIGNvbmZpZyBmb3IgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplQ29sdW1uKGNvbHVtbjogYW55KTogYW55IHtcbiAgICBjb25zdCBzYW5pdGl6ZWQ6IGFueSA9IHtcbiAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgIGhlYWRlcjogY29sdW1uLmhlYWRlcixcbiAgICAgIGRhdGFUeXBlOiBjb2x1bW4uZGF0YVR5cGUsXG4gICAgICBlZGl0YWJsZTogY29sdW1uLmVkaXRhYmxlLFxuICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZSxcbiAgICAgIGZpbHRlcmFibGU6IGNvbHVtbi5maWx0ZXJhYmxlLFxuICAgICAgcmVzaXphYmxlOiBjb2x1bW4ucmVzaXphYmxlLFxuICAgICAgd2lkdGg6IGNvbHVtbi53aWR0aCxcbiAgICAgIG1pbldpZHRoOiBjb2x1bW4ubWluV2lkdGgsXG4gICAgICBtYXhXaWR0aDogY29sdW1uLm1heFdpZHRoLFxuICAgICAgc3RpY2t5OiBjb2x1bW4uc3RpY2t5LFxuICAgICAgYWxpZ25tZW50OiBjb2x1bW4uYWxpZ25tZW50LFxuICAgICAgdmVydGljYWxBbGlnbm1lbnQ6IGNvbHVtbi52ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgIGNsYXNzTmFtZTogY29sdW1uLmNsYXNzTmFtZSxcbiAgICAgIHN0eWxlOiBjb2x1bW4uc3R5bGUsXG4gICAgICB0b29sdGlwOiBjb2x1bW4udG9vbHRpcCxcbiAgICAgIHZpc2libGU6IGNvbHVtbi52aXNpYmxlLFxuICAgICAgcGlubmVkOiBjb2x1bW4ucGlubmVkLFxuICAgICAgc29ydFByaW9yaXR5OiBjb2x1bW4uc29ydFByaW9yaXR5LFxuICAgICAgbWV0YWRhdGE6IGNvbHVtbi5tZXRhZGF0YVxuICAgIH07XG5cbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICAgIE9iamVjdC5rZXlzKHNhbml0aXplZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKHNhbml0aXplZFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHNhbml0aXplZFtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTm90ZTogZm9ybWF0dGVyLCB2YWxpZGF0b3IsIGVkaXRvciwgcGFyc2VyLCBob29rcyBhcmUgZnVuY3Rpb25zXG4gICAgLy8gYW5kIGNhbm5vdCBiZSBzZXJpYWxpemVkIHRvIEpTT04uIFRoZXkgd2lsbCBuZWVkIHRvIGJlIHJlY3JlYXRlZFxuICAgIC8vIHdoZW4gaW1wb3J0aW5nLCBvciBzdG9yZWQgc2VwYXJhdGVseSBhcyBtZXRhZGF0YS5cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWQgZmlsZSBoZWxwZXJcbiAgICovXG4gIHByaXZhdGUgZG93bmxvYWRGaWxlKGNvbnRlbnQ6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZywgbWltZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29udGVudF0sIHsgdHlwZTogbWltZVR5cGUgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICBsaW5rLmNsaWNrKCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gIH1cbn1cblxuIl19