@aquera/ngx-smart-table 0.0.2-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 (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Custom editor using NileAutoComplete from @aquera/nile-elements
3
+ * Provides real-time suggestions as users type in table cells
4
+ */
5
+ /**
6
+ * Custom editor that uses NileAutoComplete component
7
+ * @template T The value type (string by default)
8
+ */
9
+ export class NileAutoCompleteEditor {
10
+ constructor(options) {
11
+ this.options = options;
12
+ this.eventListeners = [];
13
+ if (!options.options || options.options.length === 0) {
14
+ console.warn('NileAutoCompleteEditor requires options array to be provided');
15
+ }
16
+ }
17
+ edit(context) {
18
+ if (!context.container) {
19
+ console.warn('NileAutoCompleteEditor requires a container element');
20
+ return;
21
+ }
22
+ // Create NileAutoComplete custom element using document.createElement
23
+ this.autocomplete = document.createElement('nile-autocomplete');
24
+ this.autocomplete.value = String(context.value ?? '');
25
+ this.autocomplete.className = 'st-cell-editor st-nile-autocomplete-editor';
26
+ // Apply inline styles for proper cell fitting
27
+ this.autocomplete.style.width = 'inherit';
28
+ this.autocomplete.style.height = 'inherit';
29
+ this.autocomplete.style.boxSizing = 'border-box';
30
+ // Apply all configuration options
31
+ this.applyOptions();
32
+ // Set allMenuItems property for autocomplete suggestions
33
+ this.setMenuItems();
34
+ // Set up event listeners
35
+ this.setupEventListeners(context);
36
+ // Clear container and append autocomplete
37
+ context.container.innerHTML = '';
38
+ context.container.appendChild(this.autocomplete);
39
+ // Auto focus
40
+ if (this.options?.autoFocus !== false) {
41
+ setTimeout(() => {
42
+ this.autocomplete?.focus();
43
+ }, 0);
44
+ }
45
+ }
46
+ /**
47
+ * Set allMenuItems property for autocomplete suggestions
48
+ * NileAutoComplete requires allMenuItems to be set as a property, not child elements
49
+ */
50
+ setMenuItems() {
51
+ if (!this.autocomplete)
52
+ return;
53
+ const options = this.options.options || [];
54
+ // Convert options to string array for allMenuItems
55
+ const menuItems = options.map(opt => {
56
+ if (typeof opt === 'string') {
57
+ return opt;
58
+ }
59
+ else {
60
+ // For AutoCompleteOption objects, use the label for display
61
+ return opt.label;
62
+ }
63
+ });
64
+ // Set the allMenuItems property directly on the element
65
+ this.autocomplete.allMenuItems = menuItems;
66
+ }
67
+ /**
68
+ * Apply all configuration options to the NileAutoComplete element
69
+ */
70
+ applyOptions() {
71
+ if (!this.autocomplete)
72
+ return;
73
+ // Basic properties
74
+ if (this.options?.placeholder) {
75
+ this.autocomplete.placeholder = this.options.placeholder;
76
+ }
77
+ if (this.options?.disabled) {
78
+ this.autocomplete.disabled = this.options.disabled;
79
+ }
80
+ // Note: Some properties may not be available on NileAutoComplete
81
+ // Setting via attributes as fallback
82
+ if (this.options?.helpText) {
83
+ this.autocomplete.setAttribute('help-text', this.options.helpText);
84
+ }
85
+ // Size (if supported by NileAutoComplete)
86
+ if (this.options?.size) {
87
+ this.autocomplete.setAttribute('size', this.options.size);
88
+ }
89
+ // Behavior options - using attributes for properties that may not exist
90
+ if (this.options?.clearable) {
91
+ this.autocomplete.setAttribute('clearable', String(this.options.clearable));
92
+ }
93
+ if (this.options?.required) {
94
+ this.autocomplete.setAttribute('required', String(this.options.required));
95
+ }
96
+ // Styling options
97
+ if (this.options?.filled !== undefined) {
98
+ this.autocomplete.setAttribute('filled', String(this.options.filled));
99
+ }
100
+ if (this.options?.pill) {
101
+ this.autocomplete.setAttribute('pill', String(this.options.pill));
102
+ }
103
+ // Visual states - using attributes for properties that may not exist
104
+ if (this.options?.warning) {
105
+ this.autocomplete.setAttribute('warning', String(this.options.warning));
106
+ }
107
+ if (this.options?.error) {
108
+ this.autocomplete.setAttribute('error', String(this.options.error));
109
+ }
110
+ if (this.options?.success) {
111
+ this.autocomplete.setAttribute('success', String(this.options.success));
112
+ }
113
+ if (this.options?.errorMessage) {
114
+ this.autocomplete.setAttribute('error-message', this.options.errorMessage);
115
+ }
116
+ // Autocomplete specific options
117
+ if (this.options?.minSearchLength !== undefined) {
118
+ this.autocomplete.setAttribute('min-search-length', String(this.options.minSearchLength));
119
+ }
120
+ if (this.options?.maxSuggestions !== undefined) {
121
+ this.autocomplete.setAttribute('max-suggestions', String(this.options.maxSuggestions));
122
+ }
123
+ if (this.options?.caseSensitive !== undefined) {
124
+ this.autocomplete.setAttribute('case-sensitive', String(this.options.caseSensitive));
125
+ }
126
+ // Advanced options
127
+ if (this.options?.hoist) {
128
+ this.autocomplete.setAttribute('hoist', String(this.options.hoist));
129
+ }
130
+ if (this.options?.placement) {
131
+ this.autocomplete.setAttribute('placement', this.options.placement);
132
+ }
133
+ // Set portal attribute for proper dropdown rendering
134
+ this.autocomplete.setAttribute('portal', 'true');
135
+ }
136
+ /**
137
+ * Set up all event listeners with proper cleanup tracking
138
+ */
139
+ setupEventListeners(context) {
140
+ if (!this.autocomplete)
141
+ return;
142
+ const validateOnSave = this.options?.validateOnSave !== false;
143
+ // Handle keyboard events (keydown is not replaced by custom events)
144
+ const keydownHandler = (e) => {
145
+ const keyEvent = e;
146
+ if (keyEvent.key === 'Enter') {
147
+ keyEvent.preventDefault();
148
+ keyEvent.stopPropagation();
149
+ this.saveValue(context, validateOnSave);
150
+ }
151
+ else if (keyEvent.key === 'Escape') {
152
+ keyEvent.preventDefault();
153
+ keyEvent.stopPropagation();
154
+ context.onCancel();
155
+ }
156
+ else if (keyEvent.key === 'Tab') {
157
+ keyEvent.preventDefault();
158
+ keyEvent.stopPropagation();
159
+ this.saveValue(context, validateOnSave);
160
+ }
161
+ };
162
+ this.autocomplete.addEventListener('keydown', keydownHandler);
163
+ this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
164
+ // Use nile-complete custom event for when user selects an autocomplete suggestion
165
+ const completeHandler = (e) => {
166
+ const customEvent = e;
167
+ // Save the selected value from autocomplete
168
+ if (customEvent.detail && customEvent.detail.value !== undefined) {
169
+ context.onSave(this.parseValue(customEvent.detail.value));
170
+ }
171
+ };
172
+ this.autocomplete.addEventListener('nile-complete', completeHandler);
173
+ this.eventListeners.push({ event: 'nile-complete', handler: completeHandler });
174
+ // Use native blur event (NileAutoComplete doesn't have nile-blur)
175
+ const blurHandler = (e) => {
176
+ const customEvent = e;
177
+ // Get current value directly from the component
178
+ const currentValue = customEvent.detail?.value ?? '';
179
+ // Save on blur - TableState coordination ensures only one cell is editing at a time
180
+ context.onSave(this.parseValue(currentValue));
181
+ };
182
+ this.autocomplete.addEventListener('blur', blurHandler);
183
+ this.eventListeners.push({ event: 'blur', handler: blurHandler });
184
+ // Use native input event for real-time value updates (NileAutoComplete doesn't have nile-input)
185
+ const inputHandler = () => {
186
+ const currentValue = this.autocomplete?.value ?? '';
187
+ context.onChange(this.parseValue(currentValue));
188
+ };
189
+ this.autocomplete.addEventListener('input', inputHandler);
190
+ this.eventListeners.push({ event: 'input', handler: inputHandler });
191
+ }
192
+ /**
193
+ * Save value with optional validation
194
+ */
195
+ saveValue(context, validate) {
196
+ if (!this.autocomplete)
197
+ return;
198
+ // Note: NileAutoComplete may not have validation methods
199
+ // Validation should be handled by the validator strategy instead
200
+ context.onSave(this.getCurrentValue());
201
+ }
202
+ /**
203
+ * Parse value to appropriate type
204
+ */
205
+ parseValue(value) {
206
+ return value;
207
+ }
208
+ destroy() {
209
+ // Remove all event listeners
210
+ if (this.autocomplete) {
211
+ this.eventListeners.forEach(({ event, handler }) => {
212
+ this.autocomplete?.removeEventListener(event, handler);
213
+ });
214
+ this.eventListeners = [];
215
+ this.autocomplete.remove();
216
+ this.autocomplete = undefined;
217
+ }
218
+ }
219
+ focus() {
220
+ this.autocomplete?.focus();
221
+ }
222
+ getCurrentValue() {
223
+ if (!this.autocomplete)
224
+ return '';
225
+ return (this.autocomplete.value ?? '');
226
+ }
227
+ }
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1hdXRvY29tcGxldGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9lZGl0b3JzL25pbGUtYXV0b2NvbXBsZXRlLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFtRkg7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUlqQyxZQUE2QixPQUFzQztRQUF0QyxZQUFPLEdBQVAsT0FBTyxDQUErQjtRQUYzRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFHNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztTQUM5RTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsT0FBNkI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3BFLE9BQU87U0FDUjtRQUVELHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyw0Q0FBNEMsQ0FBQztRQUUzRSw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQyxZ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SUFDekQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVBdXRvQ29tcGxldGUgZnJvbSBAYXF1ZXJhL25pbGUtZWxlbWVudHNcbiAqIFByb3ZpZGVzIHJlYWwtdGltZSBzdWdnZXN0aW9ucyBhcyB1c2VycyB0eXBlIGluIHRhYmxlIGNlbGxzXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5cbi8qKlxuICogQXV0b2NvbXBsZXRlIG9wdGlvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0NvbXBsZXRlT3B0aW9uIHtcbiAgLyoqIFRoZSBvcHRpb24ncyB2YWx1ZSAqL1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiogRGlzcGxheSBsYWJlbCBmb3IgdGhlIG9wdGlvbiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgb3B0aW9uIGlzIGRpc2FibGVkICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUF1dG9Db21wbGV0ZUVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVBdXRvQ29tcGxldGVFZGl0b3JPcHRpb25zIHtcbiAgLy8gT3B0aW9ucyBjb25maWd1cmF0aW9uIChSRVFVSVJFRClcbiAgLyoqIEFycmF5IG9mIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9ucyAtIHN1cHBvcnRzIGJvdGggc2ltcGxlIHN0cmluZyBhcnJheSBvciBkZXRhaWxlZCBBdXRvQ29tcGxldGVPcHRpb24gb2JqZWN0cyAqL1xuICBvcHRpb25zOiBBdXRvQ29tcGxldGVPcHRpb25bXSB8IHN0cmluZ1tdO1xuICBcbiAgLy8gQmFzaWMgcHJvcGVydGllc1xuICAvKiogUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IGFzIGEgaGludCB3aGVuIHRoZSBzZWFyY2ggaXMgZW1wdHkgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBEaXNhYmxlIHRoZSBhdXRvY29tcGxldGUgY29udHJvbCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBIZWxwIHRleHQgdG8gZGlzcGxheSBiZWxvdyB0aGUgY29udHJvbCAqL1xuICBoZWxwVGV4dD86IHN0cmluZztcbiAgLyoqIFNpemUgb2YgdGhlIGF1dG9jb21wbGV0ZSBjb250cm9sICovXG4gIHNpemU/OiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuICBcbiAgLy8gQmVoYXZpb3Igb3B0aW9uc1xuICAvKiogQWRkcyBjbGVhciBidXR0b24gd2hlbiB2YWx1ZSBpcyBub3QgZW1wdHkgKi9cbiAgY2xlYXJhYmxlPzogYm9vbGVhbjtcbiAgLyoqIE1ha2UgdGhlIGF1dG9jb21wbGV0ZSByZXF1aXJlZCAqL1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKiBBdXRvLWZvY3VzIHRoZSBpbnB1dCB3aGVuIGVkaXRvciBvcGVucyAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuICAvKiogU2VsZWN0IGFsbCB0ZXh0IHdoZW4gZm9jdXNlZCAqL1xuICBzZWxlY3RPbkZvY3VzPzogYm9vbGVhbjtcbiAgXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIFdhcm5pbmcgc3RhdGUgc3R5bGluZyAqL1xuICB3YXJuaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIHN0YXRlIHN0eWxpbmcgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogU3VjY2VzcyBzdGF0ZSBzdHlsaW5nICovXG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgXG4gIC8vIEF1dG9jb21wbGV0ZSBzcGVjaWZpYyBvcHRpb25zXG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSBzaG93aW5nIHN1Z2dlc3Rpb25zICovXG4gIG1pblNlYXJjaExlbmd0aD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRvIHNob3cgKi9cbiAgbWF4U3VnZ2VzdGlvbnM/OiBudW1iZXI7XG4gIC8qKiBDYXNlLXNlbnNpdGl2ZSBtYXRjaGluZyAqL1xuICBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbjtcbiAgLyoqIEZpbHRlciBtb2RlIGZvciBtYXRjaGluZyBzdWdnZXN0aW9ucyAqL1xuICBmaWx0ZXJNb2RlPzogJ3N0YXJ0c1dpdGgnIHwgJ2NvbnRhaW5zJyB8ICdjdXN0b20nO1xuICAvKiogQ3VzdG9tIGZpbHRlciBmdW5jdGlvbiBmb3IgbWF0Y2hpbmcgKi9cbiAgY3VzdG9tRmlsdGVyPzogKGlucHV0OiBzdHJpbmcsIG9wdGlvbjogQXV0b0NvbXBsZXRlT3B0aW9uKSA9PiBib29sZWFuO1xuICBcbiAgLy8gU3R5bGluZyBvcHRpb25zXG4gIC8qKiBEcmF3cyBhIGZpbGxlZCBhdXRvY29tcGxldGUgc3R5bGUgKi9cbiAgZmlsbGVkPzogYm9vbGVhbjtcbiAgLyoqIFBpbGwtc3R5bGUgd2l0aCByb3VuZGVkIGVkZ2VzICovXG4gIHBpbGw/OiBib29sZWFuO1xuICBcbiAgLy8gQWR2YW5jZWQgb3B0aW9uc1xuICAvKiogVXNlIGZpeGVkIHBvc2l0aW9uaW5nIHRvIHByZXZlbnQgY2xpcHBpbmcgKi9cbiAgaG9pc3Q/OiBib29sZWFuO1xuICAvKiogUGxhY2VtZW50IG9mIHRoZSBzdWdnZXN0aW9ucyBkcm9wZG93biAqL1xuICBwbGFjZW1lbnQ/OiAndG9wJyB8ICdib3R0b20nO1xuICBcbiAgLy8gVmFsaWRhdGlvblxuICAvKiogVmFsaWRhdGUgYmVmb3JlIHNhdmluZyAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgdmFsaWRhdGVPblNhdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEN1c3RvbSBlZGl0b3IgdGhhdCB1c2VzIE5pbGVBdXRvQ29tcGxldGUgY29tcG9uZW50XG4gKiBAdGVtcGxhdGUgVCBUaGUgdmFsdWUgdHlwZSAoc3RyaW5nIGJ5IGRlZmF1bHQpXG4gKi9cbmV4cG9ydCBjbGFzcyBOaWxlQXV0b0NvbXBsZXRlRWRpdG9yPFQgPSBzdHJpbmc+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIHByaXZhdGUgYXV0b2NvbXBsZXRlPzogYW55O1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE5pbGVBdXRvQ29tcGxldGVFZGl0b3JPcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLm9wdGlvbnMgfHwgb3B0aW9ucy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlQXV0b0NvbXBsZXRlRWRpdG9yIHJlcXVpcmVzIG9wdGlvbnMgYXJyYXkgdG8gYmUgcHJvdmlkZWQnKTtcbiAgICB9XG4gIH1cblxuICBlZGl0KGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LmNvbnRhaW5lcikge1xuICAgICAgY29uc29sZS53YXJuKCdOaWxlQXV0b0NvbXBsZXRlRWRpdG9yIHJlcXVpcmVzIGEgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgTmlsZUF1dG9Db21wbGV0ZSBjdXN0b20gZWxlbWVudCB1c2luZyBkb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICAgdGhpcy5hdXRvY29tcGxldGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWF1dG9jb21wbGV0ZScpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLnZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUgPz8gJycpO1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1uaWxlLWF1dG9jb21wbGV0ZS1lZGl0b3InO1xuICAgIFxuICAgIC8vIEFwcGx5IGlubGluZSBzdHlsZXMgZm9yIHByb3BlciBjZWxsIGZpdHRpbmdcbiAgICB0aGlzLmF1dG9jb21wbGV0ZS5zdHlsZS53aWR0aCA9ICdpbmhlcml0JztcbiAgICB0aGlzLmF1dG9jb21wbGV0ZS5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5hdXRvY29tcGxldGUuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuICAgIFxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gU2V0IGFsbE1lbnVJdGVtcyBwcm9wZXJ0eSBmb3IgYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25zXG4gICAgdGhpcy5zZXRNZW51SXRlbXMoKTtcblxuICAgIC8vIFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dCk7XG5cbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBhdXRvY29tcGxldGVcbiAgICBjb250ZXh0LmNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcbiAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmF1dG9jb21wbGV0ZSk7XG5cbiAgICAvLyBBdXRvIGZvY3VzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYXV0b0ZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGxNZW51SXRlbXMgcHJvcGVydHkgZm9yIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uc1xuICAgKiBOaWxlQXV0b0NvbXBsZXRlIHJlcXVpcmVzIGFsbE1lbnVJdGVtcyB0byBiZSBzZXQgYXMgYSBwcm9wZXJ0eSwgbm90IGNoaWxkIGVsZW1lbnRzXG4gICAqL1xuICBwcml2YXRlIHNldE1lbnVJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLm9wdGlvbnMgfHwgW107XG4gICAgXG4gICAgLy8gQ29udmVydCBvcHRpb25zIHRvIHN0cmluZyBhcnJheSBmb3IgYWxsTWVudUl0ZW1zXG4gICAgY29uc3QgbWVudUl0ZW1zOiBzdHJpbmdbXSA9IG9wdGlvbnMubWFwKG9wdCA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG9wdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBBdXRvQ29tcGxldGVPcHRpb24gb2JqZWN0cywgdXNlIHRoZSBsYWJlbCBmb3IgZGlzcGxheVxuICAgICAgICByZXR1cm4gb3B0LmxhYmVsO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU2V0IHRoZSBhbGxNZW51SXRlbXMgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIGVsZW1lbnRcbiAgICAodGhpcy5hdXRvY29tcGxldGUgYXMgYW55KS5hbGxNZW51SXRlbXMgPSBtZW51SXRlbXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB0aGUgTmlsZUF1dG9Db21wbGV0ZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIGFwcGx5T3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47XG5cbiAgICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5kaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBTb21lIHByb3BlcnRpZXMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gTmlsZUF1dG9Db21wbGV0ZVxuICAgIC8vIFNldHRpbmcgdmlhIGF0dHJpYnV0ZXMgYXMgZmFsbGJhY2tcbiAgICBpZiAodGhpcy5vcHRpb25zPy5oZWxwVGV4dCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdoZWxwLXRleHQnLCB0aGlzLm9wdGlvbnMuaGVscFRleHQpO1xuICAgIH1cblxuICAgIC8vIFNpemUgKGlmIHN1cHBvcnRlZCBieSBOaWxlQXV0b0NvbXBsZXRlKVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNpemUpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgnc2l6ZScsIHRoaXMub3B0aW9ucy5zaXplKTtcbiAgICB9XG5cbiAgICAvLyBCZWhhdmlvciBvcHRpb25zIC0gdXNpbmcgYXR0cmlidXRlcyBmb3IgcHJvcGVydGllcyB0aGF0IG1heSBub3QgZXhpc3RcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jbGVhcmFibGUpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgnY2xlYXJhYmxlJywgU3RyaW5nKHRoaXMub3B0aW9ucy5jbGVhcmFibGUpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsIFN0cmluZyh0aGlzLm9wdGlvbnMucmVxdWlyZWQpKTtcbiAgICB9XG5cbiAgICAvLyBTdHlsaW5nIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5maWxsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdmaWxsZWQnLCBTdHJpbmcodGhpcy5vcHRpb25zLmZpbGxlZCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBpbGwpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgncGlsbCcsIFN0cmluZyh0aGlzLm9wdGlvbnMucGlsbCkpO1xuICAgIH1cblxuICAgIC8vIFZpc3VhbCBzdGF0ZXMgLSB1c2luZyBhdHRyaWJ1dGVzIGZvciBwcm9wZXJ0aWVzIHRoYXQgbWF5IG5vdCBleGlzdFxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lndhcm5pbmcpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgnd2FybmluZycsIFN0cmluZyh0aGlzLm9wdGlvbnMud2FybmluZykpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5zZXRBdHRyaWJ1dGUoJ2Vycm9yJywgU3RyaW5nKHRoaXMub3B0aW9ucy5lcnJvcikpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgnc3VjY2VzcycsIFN0cmluZyh0aGlzLm9wdGlvbnMuc3VjY2VzcykpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdlcnJvci1tZXNzYWdlJywgdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gQXV0b2NvbXBsZXRlIHNwZWNpZmljIG9wdGlvbnNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5taW5TZWFyY2hMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdtaW4tc2VhcmNoLWxlbmd0aCcsIFN0cmluZyh0aGlzLm9wdGlvbnMubWluU2VhcmNoTGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ubWF4U3VnZ2VzdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdtYXgtc3VnZ2VzdGlvbnMnLCBTdHJpbmcodGhpcy5vcHRpb25zLm1heFN1Z2dlc3Rpb25zKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY2FzZVNlbnNpdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5zZXRBdHRyaWJ1dGUoJ2Nhc2Utc2Vuc2l0aXZlJywgU3RyaW5nKHRoaXMub3B0aW9ucy5jYXNlU2Vuc2l0aXZlKSk7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZWQgb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmhvaXN0KSB7XG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5zZXRBdHRyaWJ1dGUoJ2hvaXN0JywgU3RyaW5nKHRoaXMub3B0aW9ucy5ob2lzdCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlbWVudCkge1xuICAgICAgdGhpcy5hdXRvY29tcGxldGUuc2V0QXR0cmlidXRlKCdwbGFjZW1lbnQnLCB0aGlzLm9wdGlvbnMucGxhY2VtZW50KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgcG9ydGFsIGF0dHJpYnV0ZSBmb3IgcHJvcGVyIGRyb3Bkb3duIHJlbmRlcmluZ1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLnNldEF0dHJpYnV0ZSgncG9ydGFsJywgJ3RydWUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9uU2F2ZSA9IHRoaXMub3B0aW9ucz8udmFsaWRhdGVPblNhdmUgIT09IGZhbHNlO1xuXG4gICAgLy8gSGFuZGxlIGtleWJvYXJkIGV2ZW50cyAoa2V5ZG93biBpcyBub3QgcmVwbGFjZWQgYnkgY3VzdG9tIGV2ZW50cylcbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3Qga2V5RXZlbnQgPSBlIGFzIEtleWJvYXJkRXZlbnQ7XG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9IGVsc2UgaWYgKGtleUV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnRleHQub25DYW5jZWwoKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5hdXRvY29tcGxldGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWNvbXBsZXRlIGN1c3RvbSBldmVudCBmb3Igd2hlbiB1c2VyIHNlbGVjdHMgYW4gYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb25cbiAgICBjb25zdCBjb21wbGV0ZUhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIC8vIFNhdmUgdGhlIHNlbGVjdGVkIHZhbHVlIGZyb20gYXV0b2NvbXBsZXRlXG4gICAgICBpZiAoY3VzdG9tRXZlbnQuZGV0YWlsICYmIGN1c3RvbUV2ZW50LmRldGFpbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZShjdXN0b21FdmVudC5kZXRhaWwudmFsdWUpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY29tcGxldGUnLCBjb21wbGV0ZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jb21wbGV0ZScsIGhhbmRsZXI6IGNvbXBsZXRlSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuYXRpdmUgYmx1ciBldmVudCAoTmlsZUF1dG9Db21wbGV0ZSBkb2Vzbid0IGhhdmUgbmlsZS1ibHVyKVxuICAgIGNvbnN0IGJsdXJIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICAvLyBHZXQgY3VycmVudCB2YWx1ZSBkaXJlY3RseSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1c3RvbUV2ZW50LmRldGFpbD8udmFsdWUgPz8gJyc7XG4gICAgICAvLyBTYXZlIG9uIGJsdXIgLSBUYWJsZVN0YXRlIGNvb3JkaW5hdGlvbiBlbnN1cmVzIG9ubHkgb25lIGNlbGwgaXMgZWRpdGluZyBhdCBhIHRpbWVcbiAgICAgIGNvbnRleHQub25TYXZlKHRoaXMucGFyc2VWYWx1ZShjdXJyZW50VmFsdWUpKTtcbiAgICB9O1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG5cbiAgICAvLyBVc2UgbmF0aXZlIGlucHV0IGV2ZW50IGZvciByZWFsLXRpbWUgdmFsdWUgdXBkYXRlcyAoTmlsZUF1dG9Db21wbGV0ZSBkb2Vzbid0IGhhdmUgbmlsZS1pbnB1dClcbiAgICBjb25zdCBpbnB1dEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmF1dG9jb21wbGV0ZT8udmFsdWUgPz8gJyc7XG4gICAgICBjb250ZXh0Lm9uQ2hhbmdlKHRoaXMucGFyc2VWYWx1ZShjdXJyZW50VmFsdWUpKTtcbiAgICB9O1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaW5wdXRIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2lucHV0JywgaGFuZGxlcjogaW5wdXRIYW5kbGVyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSByZXR1cm47XG5cbiAgICAvLyBOb3RlOiBOaWxlQXV0b0NvbXBsZXRlIG1heSBub3QgaGF2ZSB2YWxpZGF0aW9uIG1ldGhvZHNcbiAgICAvLyBWYWxpZGF0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB2YWxpZGF0b3Igc3RyYXRlZ3kgaW5zdGVhZFxuICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICBpZiAodGhpcy5hdXRvY29tcGxldGUpIHtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoeyBldmVudCwgaGFuZGxlciB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZS5yZW1vdmUoKTtcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b2NvbXBsZXRlPy5mb2N1cygpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IFQge1xuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHJldHVybiAnJyBhcyB1bmtub3duIGFzIFQ7XG4gICAgcmV0dXJuICh0aGlzLmF1dG9jb21wbGV0ZS52YWx1ZSA/PyAnJykgYXMgdW5rbm93biBhcyBUO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Custom editor using NileCalendar from @aquera/nile-elements
3
+ * Provides date selection functionality for table cells
4
+ */
5
+ /**
6
+ * Custom editor that uses NileCalendar component for date selection
7
+ * @template T The value type (string by default, formatted as YYYY-MM-DD)
8
+ */
9
+ export class NileCalendarEditor {
10
+ constructor(options) {
11
+ this.options = options;
12
+ this.eventListeners = [];
13
+ }
14
+ edit(context) {
15
+ if (!context.container) {
16
+ console.warn('NileCalendarEditor requires a container element');
17
+ return;
18
+ }
19
+ // Create NileCalendar custom element using document.createElement
20
+ this.calendar = document.createElement('nile-calendar');
21
+ // Set initial value (NileCalendar expects Date object)
22
+ if (context.value) {
23
+ const dateValue = String(context.value);
24
+ // Convert string to Date object
25
+ const date = new Date(dateValue);
26
+ if (!isNaN(date.getTime())) {
27
+ this.calendar.value = date;
28
+ }
29
+ }
30
+ this.calendar.className = 'st-cell-editor st-nile-calendar-editor';
31
+ // Apply inline styles for proper cell fitting
32
+ this.calendar.style.width = 'inherit';
33
+ this.calendar.style.height = 'inherit';
34
+ this.calendar.style.boxSizing = 'border-box';
35
+ // Apply all configuration options
36
+ this.applyOptions();
37
+ // Set up event listeners
38
+ this.setupEventListeners(context);
39
+ // Clear container and append calendar
40
+ context.container.innerHTML = '';
41
+ context.container.appendChild(this.calendar);
42
+ // Auto focus
43
+ if (this.options?.autoFocus !== false) {
44
+ setTimeout(() => {
45
+ this.calendar?.focus();
46
+ }, 0);
47
+ }
48
+ }
49
+ /**
50
+ * Apply all configuration options to the NileCalendar element
51
+ */
52
+ applyOptions() {
53
+ if (!this.calendar)
54
+ return;
55
+ // Date format (default: ISO format)
56
+ const dateFormat = this.options?.dateFormat || 'YYYY-MM-DD';
57
+ this.calendar.setAttribute('dateFormat', dateFormat);
58
+ // Basic properties
59
+ if (this.options?.disabled) {
60
+ this.calendar.setAttribute('disabled', String(this.options.disabled));
61
+ }
62
+ if (this.options?.placeholder) {
63
+ this.calendar.setAttribute('placeholder', this.options.placeholder);
64
+ }
65
+ if (this.options?.helpText) {
66
+ this.calendar.setAttribute('help-text', this.options.helpText);
67
+ }
68
+ // Behavior options
69
+ if (this.options?.allowClear) {
70
+ this.calendar.setAttribute('allowClear', String(this.options.allowClear));
71
+ }
72
+ if (this.options?.doubleClickUnselect) {
73
+ this.calendar.setAttribute('doubleClickUnselect', String(this.options.doubleClickUnselect));
74
+ }
75
+ if (this.options?.showMonthDropdown) {
76
+ this.calendar.setAttribute('showMonthDropdown', String(this.options.showMonthDropdown));
77
+ }
78
+ if (this.options?.showYearDropdown) {
79
+ this.calendar.setAttribute('showYearDropdown', String(this.options.showYearDropdown));
80
+ }
81
+ if (this.options?.showManualInputs) {
82
+ this.calendar.setAttribute('showManualInputs', String(this.options.showManualInputs));
83
+ }
84
+ // Year range
85
+ if (this.options?.startYear) {
86
+ this.calendar.setAttribute('startYear', String(this.options.startYear));
87
+ }
88
+ if (this.options?.endYear) {
89
+ this.calendar.setAttribute('endYear', String(this.options.endYear));
90
+ }
91
+ // Allowed dates range
92
+ if (this.options?.allowedDates) {
93
+ this.calendar.setAttribute('allowedDates', JSON.stringify(this.options.allowedDates));
94
+ }
95
+ // Visual states - using attributes for properties that may not exist
96
+ if (this.options?.warning) {
97
+ this.calendar.setAttribute('warning', String(this.options.warning));
98
+ }
99
+ if (this.options?.error) {
100
+ this.calendar.setAttribute('error', String(this.options.error));
101
+ }
102
+ if (this.options?.success) {
103
+ this.calendar.setAttribute('success', String(this.options.success));
104
+ }
105
+ if (this.options?.errorMessage) {
106
+ this.calendar.setAttribute('error-message', this.options.errorMessage);
107
+ }
108
+ // Size
109
+ if (this.options?.size) {
110
+ this.calendar.setAttribute('size', this.options.size);
111
+ }
112
+ // Portal rendering (default: true)
113
+ if (this.options?.portal !== false) {
114
+ this.calendar.setAttribute('portal', 'true');
115
+ }
116
+ }
117
+ /**
118
+ * Set up all event listeners with proper cleanup tracking
119
+ */
120
+ setupEventListeners(context) {
121
+ if (!this.calendar)
122
+ return;
123
+ const validateOnSave = this.options?.validateOnSave !== false;
124
+ // Handle keyboard events (keydown is not replaced by custom events)
125
+ const keydownHandler = (e) => {
126
+ const keyEvent = e;
127
+ if (keyEvent.key === 'Enter') {
128
+ keyEvent.preventDefault();
129
+ keyEvent.stopPropagation();
130
+ this.saveValue(context, validateOnSave);
131
+ }
132
+ else if (keyEvent.key === 'Escape') {
133
+ keyEvent.preventDefault();
134
+ keyEvent.stopPropagation();
135
+ context.onCancel();
136
+ }
137
+ else if (keyEvent.key === 'Tab') {
138
+ keyEvent.preventDefault();
139
+ keyEvent.stopPropagation();
140
+ this.saveValue(context, validateOnSave);
141
+ }
142
+ };
143
+ this.calendar.addEventListener('keydown', keydownHandler);
144
+ this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
145
+ // Use nile-change custom event for date selection
146
+ const changeHandler = (e) => {
147
+ const customEvent = e;
148
+ context.onSave(this.parseValue(customEvent.detail.value));
149
+ };
150
+ this.calendar.addEventListener('nile-change', changeHandler);
151
+ this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
152
+ // Use nile-blur custom event (save on blur)
153
+ const blurHandler = (e) => {
154
+ const customEvent = e;
155
+ // Note: NileCalendar may not have validation methods
156
+ // Validation should be handled by the validator strategy instead
157
+ context.onSave(this.parseValue(customEvent.detail.value));
158
+ };
159
+ this.calendar.addEventListener('nile-blur', blurHandler);
160
+ this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
161
+ // Handle clear button if enabled
162
+ if (this.options?.allowClear) {
163
+ const clearHandler = (e) => {
164
+ context.onSave(this.parseValue(''));
165
+ };
166
+ this.calendar.addEventListener('nile-clear', clearHandler);
167
+ this.eventListeners.push({ event: 'nile-clear', handler: clearHandler });
168
+ }
169
+ }
170
+ /**
171
+ * Save value with optional validation
172
+ */
173
+ saveValue(context, validate) {
174
+ if (!this.calendar)
175
+ return;
176
+ // Note: NileCalendar may not have validation methods
177
+ // Validation should be handled by the validator strategy instead
178
+ context.onSave(this.getCurrentValue());
179
+ }
180
+ /**
181
+ * Parse value to appropriate type
182
+ */
183
+ parseValue(value) {
184
+ // Value is already in the correct format from nile-calendar
185
+ return (value || '');
186
+ }
187
+ destroy() {
188
+ // Remove all event listeners
189
+ if (this.calendar) {
190
+ this.eventListeners.forEach(({ event, handler }) => {
191
+ this.calendar?.removeEventListener(event, handler);
192
+ });
193
+ this.eventListeners = [];
194
+ this.calendar.remove();
195
+ this.calendar = undefined;
196
+ }
197
+ }
198
+ focus() {
199
+ this.calendar?.focus();
200
+ }
201
+ getCurrentValue() {
202
+ if (!this.calendar)
203
+ return '';
204
+ // NileCalendar.value is a Date object, convert to ISO string format
205
+ if (this.calendar.value instanceof Date) {
206
+ const year = this.calendar.value.getFullYear();
207
+ const month = String(this.calendar.value.getMonth() + 1).padStart(2, '0');
208
+ const day = String(this.calendar.value.getDate()).padStart(2, '0');
209
+ return `${year}-${month}-${day}`;
210
+ }
211
+ return '';
212
+ }
213
+ }
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jYWxlbmRhci1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2VkaXRvcnMvbmlsZS1jYWxlbmRhci1lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBdUVIOzs7R0FHRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFJN0IsWUFBNkIsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFGeEQsbUJBQWMsR0FBcUQsRUFBRSxDQUFDO0lBRVgsQ0FBQztJQUVwRSxJQUFJLENBQUMsT0FBNkI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ2hFLE9BQU87U0FDUjtRQUVELGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFeEQsdURBQXVEO1FBQ3ZELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNqQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLGdDQUFnQztZQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7YUFDNUI7U0FDRjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLHdDQUF3QyxDQUFDO1FBRW5FLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUks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c3RvbSBlZGl0b3IgdXNpbmcgTmlsZUNhbGVuZGFyIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBQcm92aWRlcyBkYXRlIHNlbGVjdGlvbiBmdW5jdGlvbmFsaXR5IGZvciB0YWJsZSBjZWxsc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIERhdGUgcmFuZ2UgY29uZmlndXJhdGlvbiBmb3IgcmVzdHJpY3RpbmcgYWxsb3dlZCBkYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsbG93ZWREYXRlc1JhbmdlIHtcbiAgLyoqIFN0YXJ0IGRhdGUgaW4gSVNPIGZvcm1hdCAoWVlZWS1NTS1ERCkgKi9cbiAgc3RhcnREYXRlPzogc3RyaW5nO1xuICAvKiogRW5kIGRhdGUgaW4gSVNPIGZvcm1hdCAoWVlZWS1NTS1ERCkgKi9cbiAgZW5kRGF0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNhbGVuZGFyRWRpdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmlsZUNhbGVuZGFyRWRpdG9yT3B0aW9ucyB7XG4gIC8vIEJhc2ljIHByb3BlcnRpZXNcbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRhdGUgaXMgc2VsZWN0ZWQgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBEaXNhYmxlIHRoZSBjYWxlbmRhciBjb250cm9sICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEhlbHAgdGV4dCB0byBkaXNwbGF5IGJlbG93IHRoZSBjb250cm9sICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBcbiAgLy8gRGF0ZSBjb25maWd1cmF0aW9uXG4gIC8qKiBEYXRlIGZvcm1hdCBmb3IgZGlzcGxheSAoZGVmYXVsdDogJ1lZWVktTU0tREQnKSAqL1xuICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAvKiogU3RhcnQgeWVhciBmb3IgeWVhciBkcm9wZG93biAqL1xuICBzdGFydFllYXI/OiBudW1iZXI7XG4gIC8qKiBFbmQgeWVhciBmb3IgeWVhciBkcm9wZG93biAqL1xuICBlbmRZZWFyPzogbnVtYmVyO1xuICAvKiogRGF0ZSByYW5nZSByZXN0cmljdGlvbnMgKi9cbiAgYWxsb3dlZERhdGVzPzogQWxsb3dlZERhdGVzUmFuZ2U7XG4gIFxuICAvLyBCZWhhdmlvciBvcHRpb25zXG4gIC8qKiBTaG93IGNsZWFyIGJ1dHRvbiBmb3IgcmVtb3ZpbmcgZGF0ZSAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IGRvdWJsZS1jbGljayB0byB1bnNlbGVjdCBkYXRlICovXG4gIGRvdWJsZUNsaWNrVW5zZWxlY3Q/OiBib29sZWFuO1xuICAvKiogU2hvdyBtb250aCBzZWxlY3Rpb24gZHJvcGRvd24gKi9cbiAgc2hvd01vbnRoRHJvcGRvd24/OiBib29sZWFuO1xuICAvKiogU2hvdyB5ZWFyIHNlbGVjdGlvbiBkcm9wZG93biAqL1xuICBzaG93WWVhckRyb3Bkb3duPzogYm9vbGVhbjtcbiAgLyoqIEFsbG93IG1hbnVhbCBkYXRlIGlucHV0IHZpYSB0ZXh0IGZpZWxkcyAqL1xuICBzaG93TWFudWFsSW5wdXRzPzogYm9vbGVhbjtcbiAgLyoqIEF1dG8tZm9jdXMgdGhlIGNhbGVuZGFyIHdoZW4gZWRpdG9yIG9wZW5zICovXG4gIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gIFxuICAvLyBWaXN1YWwgc3RhdGVzXG4gIC8qKiBXYXJuaW5nIHN0YXRlIHN0eWxpbmcgKi9cbiAgd2FybmluZz86IGJvb2xlYW47XG4gIC8qKiBFcnJvciBzdGF0ZSBzdHlsaW5nICovXG4gIGVycm9yPzogYm9vbGVhbjtcbiAgLyoqIFN1Y2Nlc3Mgc3RhdGUgc3R5bGluZyAqL1xuICBzdWNjZXNzPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIFxuICAvLyBTdHlsaW5nXG4gIC8qKiBTaXplIG9mIHRoZSBjYWxlbmRhciBjb250cm9sICovXG4gIHNpemU/OiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuICBcbiAgLy8gQWR2YW5jZWQgb3B0aW9uc1xuICAvKiogVXNlIHBvcnRhbCBmb3IgZHJvcGRvd24gcmVuZGVyaW5nIHRvIHByZXZlbnQgY2xpcHBpbmcgKi9cbiAgcG9ydGFsPzogYm9vbGVhbjtcbiAgLyoqIFZhbGlkYXRlIGJlZm9yZSBzYXZpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIHZhbGlkYXRlT25TYXZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlQ2FsZW5kYXIgY29tcG9uZW50IGZvciBkYXRlIHNlbGVjdGlvblxuICogQHRlbXBsYXRlIFQgVGhlIHZhbHVlIHR5cGUgKHN0cmluZyBieSBkZWZhdWx0LCBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERClcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVDYWxlbmRhckVkaXRvcjxUID0gc3RyaW5nPiBpbXBsZW1lbnRzIENlbGxFZGl0b3I8VD4ge1xuICBwcml2YXRlIGNhbGVuZGFyPzogYW55O1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM/OiBOaWxlQ2FsZW5kYXJFZGl0b3JPcHRpb25zKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVDYWxlbmRhckVkaXRvciByZXF1aXJlcyBhIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIE5pbGVDYWxlbmRhciBjdXN0b20gZWxlbWVudCB1c2luZyBkb2N1bWVudC5jcmVhdGVFbGVtZW50XG4gICAgdGhpcy5jYWxlbmRhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY2FsZW5kYXInKTtcbiAgICBcbiAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSAoTmlsZUNhbGVuZGFyIGV4cGVjdHMgRGF0ZSBvYmplY3QpXG4gICAgaWYgKGNvbnRleHQudmFsdWUpIHtcbiAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IFN0cmluZyhjb250ZXh0LnZhbHVlKTtcbiAgICAgIC8vIENvbnZlcnQgc3RyaW5nIHRvIERhdGUgb2JqZWN0XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZGF0ZVZhbHVlKTtcbiAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXIudmFsdWUgPSBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmNhbGVuZGFyLmNsYXNzTmFtZSA9ICdzdC1jZWxsLWVkaXRvciBzdC1uaWxlLWNhbGVuZGFyLWVkaXRvcic7XG4gICAgXG4gICAgLy8gQXBwbHkgaW5saW5lIHN0eWxlcyBmb3IgcHJvcGVyIGNlbGwgZml0dGluZ1xuICAgIHRoaXMuY2FsZW5kYXIuc3R5bGUud2lkdGggPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5jYWxlbmRhci5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgdGhpcy5jYWxlbmRhci5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG4gICAgXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcbiAgICBcbiAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBjYWxlbmRhclxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FsZW5kYXIpO1xuICAgIFxuICAgIC8vIEF1dG8gZm9jdXNcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxlbmRhcj8uZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbGwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHRoZSBOaWxlQ2FsZW5kYXIgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyKSByZXR1cm47XG4gICAgXG4gICAgLy8gRGF0ZSBmb3JtYXQgKGRlZmF1bHQ6IElTTyBmb3JtYXQpXG4gICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRoaXMub3B0aW9ucz8uZGF0ZUZvcm1hdCB8fCAnWVlZWS1NTS1ERCc7XG4gICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2RhdGVGb3JtYXQnLCBkYXRlRm9ybWF0KTtcbiAgICBcbiAgICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIFN0cmluZyh0aGlzLm9wdGlvbnMuZGlzYWJsZWQpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicsIHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmhlbHBUZXh0KSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnaGVscC10ZXh0JywgdGhpcy5vcHRpb25zLmhlbHBUZXh0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQmVoYXZpb3Igb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93Q2xlYXIpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdhbGxvd0NsZWFyJywgU3RyaW5nKHRoaXMub3B0aW9ucy5hbGxvd0NsZWFyKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRvdWJsZUNsaWNrVW5zZWxlY3QpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdkb3VibGVDbGlja1Vuc2VsZWN0JywgU3RyaW5nKHRoaXMub3B0aW9ucy5kb3VibGVDbGlja1Vuc2VsZWN0KSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNob3dNb250aERyb3Bkb3duKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnc2hvd01vbnRoRHJvcGRvd24nLCBTdHJpbmcodGhpcy5vcHRpb25zLnNob3dNb250aERyb3Bkb3duKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNob3dZZWFyRHJvcGRvd24pIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzaG93WWVhckRyb3Bkb3duJywgU3RyaW5nKHRoaXMub3B0aW9ucy5zaG93WWVhckRyb3Bkb3duKSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnNob3dNYW51YWxJbnB1dHMpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzaG93TWFudWFsSW5wdXRzJywgU3RyaW5nKHRoaXMub3B0aW9ucy5zaG93TWFudWFsSW5wdXRzKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFllYXIgcmFuZ2VcbiAgICBpZiAodGhpcy5vcHRpb25zPy5zdGFydFllYXIpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdzdGFydFllYXInLCBTdHJpbmcodGhpcy5vcHRpb25zLnN0YXJ0WWVhcikpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5lbmRZZWFyKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnZW5kWWVhcicsIFN0cmluZyh0aGlzLm9wdGlvbnMuZW5kWWVhcikpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBbGxvd2VkIGRhdGVzIHJhbmdlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uYWxsb3dlZERhdGVzKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnYWxsb3dlZERhdGVzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLmFsbG93ZWREYXRlcykpO1xuICAgIH1cbiAgICBcbiAgICAvLyBWaXN1YWwgc3RhdGVzIC0gdXNpbmcgYXR0cmlidXRlcyBmb3IgcHJvcGVydGllcyB0aGF0IG1heSBub3QgZXhpc3RcbiAgICBpZiAodGhpcy5vcHRpb25zPy53YXJuaW5nKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnd2FybmluZycsIFN0cmluZyh0aGlzLm9wdGlvbnMud2FybmluZykpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgdGhpcy5jYWxlbmRhci5zZXRBdHRyaWJ1dGUoJ2Vycm9yJywgU3RyaW5nKHRoaXMub3B0aW9ucy5lcnJvcikpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5zdWNjZXNzKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnc3VjY2VzcycsIFN0cmluZyh0aGlzLm9wdGlvbnMuc3VjY2VzcykpO1xuICAgIH1cbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zPy5lcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXIuc2V0QXR0cmlidXRlKCdlcnJvci1tZXNzYWdlJywgdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpemVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5zaXplKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgnc2l6ZScsIHRoaXMub3B0aW9ucy5zaXplKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUG9ydGFsIHJlbmRlcmluZyAoZGVmYXVsdDogdHJ1ZSlcbiAgICBpZiAodGhpcy5vcHRpb25zPy5wb3J0YWwgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyLnNldEF0dHJpYnV0ZSgncG9ydGFsJywgJ3RydWUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGFsbCBldmVudCBsaXN0ZW5lcnMgd2l0aCBwcm9wZXIgY2xlYW51cCB0cmFja2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50TGlzdGVuZXJzKGNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0PFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdmFsaWRhdGVPblNhdmUgPSB0aGlzLm9wdGlvbnM/LnZhbGlkYXRlT25TYXZlICE9PSBmYWxzZTtcbiAgICBcbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzIChrZXlkb3duIGlzIG5vdCByZXBsYWNlZCBieSBjdXN0b20gZXZlbnRzKVxuICAgIGNvbnN0IGtleWRvd25IYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBrZXlFdmVudCA9IGUgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGlmIChrZXlFdmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAga2V5RXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfSBlbHNlIGlmIChrZXlFdmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmNhbGVuZGFyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlkb3duSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICdrZXlkb3duJywgaGFuZGxlcjoga2V5ZG93bkhhbmRsZXIgfSk7XG4gICAgXG4gICAgLy8gVXNlIG5pbGUtY2hhbmdlIGN1c3RvbSBldmVudCBmb3IgZGF0ZSBzZWxlY3Rpb25cbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUoY3VzdG9tRXZlbnQuZGV0YWlsLnZhbHVlKSk7XG4gICAgfTtcbiAgICB0aGlzLmNhbGVuZGFyLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgY2hhbmdlSGFuZGxlcik7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWNoYW5nZScsIGhhbmRsZXI6IGNoYW5nZUhhbmRsZXIgfSk7XG4gICAgXG4gICAgLy8gVXNlIG5pbGUtYmx1ciBjdXN0b20gZXZlbnQgKHNhdmUgb24gYmx1cilcbiAgICBjb25zdCBibHVySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgLy8gTm90ZTogTmlsZUNhbGVuZGFyIG1heSBub3QgaGF2ZSB2YWxpZGF0aW9uIG1ldGhvZHNcbiAgICAgIC8vIFZhbGlkYXRpb24gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHZhbGlkYXRvciBzdHJhdGVneSBpbnN0ZWFkXG4gICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUoY3VzdG9tRXZlbnQuZGV0YWlsLnZhbHVlKSk7XG4gICAgfTtcbiAgICB0aGlzLmNhbGVuZGFyLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtYmx1cicsIGJsdXJIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtYmx1cicsIGhhbmRsZXI6IGJsdXJIYW5kbGVyIH0pO1xuICAgIFxuICAgIC8vIEhhbmRsZSBjbGVhciBidXR0b24gaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmFsbG93Q2xlYXIpIHtcbiAgICAgIGNvbnN0IGNsZWFySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUoJycpKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmNhbGVuZGFyLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2xlYXInLCBjbGVhckhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWNsZWFyJywgaGFuZGxlcjogY2xlYXJIYW5kbGVyIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHZhbHVlIHdpdGggb3B0aW9uYWwgdmFsaWRhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzYXZlVmFsdWUoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4sIHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbGVuZGFyKSByZXR1cm47XG4gICAgXG4gICAgLy8gTm90ZTogTmlsZUNhbGVuZGFyIG1heSBub3QgaGF2ZSB2YWxpZGF0aW9uIG1ldGhvZHNcbiAgICAvLyBWYWxpZGF0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB2YWxpZGF0b3Igc3RyYXRlZ3kgaW5zdGVhZFxuICAgIGNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHZhbHVlIHRvIGFwcHJvcHJpYXRlIHR5cGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogc3RyaW5nKTogVCB7XG4gICAgLy8gVmFsdWUgaXMgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBmb3JtYXQgZnJvbSBuaWxlLWNhbGVuZGFyXG4gICAgcmV0dXJuICh2YWx1ZSB8fCAnJykgYXMgdW5rbm93biBhcyBUO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgIGlmICh0aGlzLmNhbGVuZGFyKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmNhbGVuZGFyPy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgXG4gICAgICB0aGlzLmNhbGVuZGFyLnJlbW92ZSgpO1xuICAgICAgdGhpcy5jYWxlbmRhciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyPy5mb2N1cygpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFZhbHVlKCk6IFQge1xuICAgIGlmICghdGhpcy5jYWxlbmRhcikgcmV0dXJuICcnIGFzIHVua25vd24gYXMgVDtcbiAgICBcbiAgICAvLyBOaWxlQ2FsZW5kYXIudmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgY29udmVydCB0byBJU08gc3RyaW5nIGZvcm1hdFxuICAgIGlmICh0aGlzLmNhbGVuZGFyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY2FsZW5kYXIudmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKHRoaXMuY2FsZW5kYXIudmFsdWUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICBjb25zdCBkYXkgPSBTdHJpbmcodGhpcy5jYWxlbmRhci52YWx1ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YCBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAnJyBhcyB1bmtub3duIGFzIFQ7XG4gIH1cbn1cbiJdfQ==