@aquera/ngx-smart-table 0.0.17-patch-0.1 → 0.0.17-patch-0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,619 @@
1
+ /**
2
+ * Custom editor using NileCodeEditor from @aquera/nile-elements
3
+ * This provides code editing capabilities with syntax highlighting for table cells
4
+ */
5
+ /**
6
+ * Inject global styles for nile-code-editor in table cells
7
+ */
8
+ let codeEditorStylesInjected = false;
9
+ function injectCodeEditorStyles() {
10
+ if (codeEditorStylesInjected)
11
+ return;
12
+ codeEditorStylesInjected = true;
13
+ const styleId = 'nile-code-editor-cell-styles';
14
+ if (document.getElementById(styleId))
15
+ return;
16
+ const style = document.createElement('style');
17
+ style.id = styleId;
18
+ style.textContent = `
19
+ /* Nile Code Editor cell styling */
20
+ nile-code-editor.st-cell-editor {
21
+ display: block;
22
+ width: 100%;
23
+ height: 100%;
24
+ font-size: inherit !important;
25
+ font-family: inherit !important;
26
+ line-height: inherit !important;
27
+ }
28
+ nile-code-editor.st-cell-editor::part(code-editor-base) {
29
+ border: none !important;
30
+ min-height: 100% !important;
31
+ background: transparent !important;
32
+ font-size: inherit !important;
33
+ font-family: inherit !important;
34
+ line-height: inherit !important;
35
+ }
36
+ /* Ensure proper sizing within table cell */
37
+ .st-nile-code-editor {
38
+ width: 100%;
39
+ height: 100%;
40
+ min-height: 28px;
41
+ font-size: inherit !important;
42
+ }
43
+ /* CodeMirror content should inherit font size */
44
+ nile-code-editor.st-cell-editor .cm-content,
45
+ nile-code-editor.st-cell-editor .cm-line {
46
+ font-size: inherit !important;
47
+ font-family: inherit !important;
48
+ line-height: inherit !important;
49
+ }
50
+ /* Container wrapper for editor + expand button */
51
+ .st-code-editor-wrapper {
52
+ display: flex;
53
+ align-items: center;
54
+ width: 100%;
55
+ height: 100%;
56
+ gap: 4px;
57
+ }
58
+ .st-code-editor-wrapper .st-code-editor-input {
59
+ flex: 1;
60
+ min-width: 0;
61
+ height: 100%;
62
+ }
63
+ .st-code-editor-wrapper .st-expand-button {
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ width: 24px;
68
+ height: 24px;
69
+ min-width: 24px;
70
+ padding: 0;
71
+ border: none;
72
+ background: transparent;
73
+ cursor: pointer;
74
+ color: var(--nile-color-neutral-500, #6b7280);
75
+ border-radius: 4px;
76
+ transition: all 0.2s;
77
+ }
78
+ .st-code-editor-wrapper .st-expand-button:hover {
79
+ background: var(--nile-color-neutral-100, #f3f4f6);
80
+ color: var(--nile-color-neutral-700, #374151);
81
+ }
82
+ /* Dialog code editor styling */
83
+ .st-code-editor-dialog::part(panel) {
84
+ max-height: var(--max-height, 80vh) !important;
85
+ overflow: hidden !important;
86
+ }
87
+ .st-code-editor-dialog::part(body) {
88
+ overflow: auto !important;
89
+ }
90
+ .st-code-editor-dialog nile-code-editor {
91
+ width: 100%;
92
+ display: block;
93
+ }
94
+ .st-code-editor-dialog nile-code-editor::part(code-editor-base) {
95
+ border: 1px solid var(--nile-color-neutral-200, #e5e7eb) !important;
96
+ border-radius: 4px !important;
97
+ overflow: auto !important;
98
+ min-height: var(--dialog-editor-min-height, 300px) !important;
99
+ }
100
+ .st-code-editor-dialog nile-code-editor .cm-editor {
101
+ min-height: var(--dialog-editor-min-height, 300px) !important;
102
+ }
103
+ .st-code-editor-dialog nile-code-editor .cm-content {
104
+ min-height: var(--dialog-editor-min-height, 300px) !important;
105
+ }
106
+ `;
107
+ document.head.appendChild(style);
108
+ }
109
+ /**
110
+ * Custom editor that uses NileCodeEditor component
111
+ * Provides code editing with syntax highlighting for table cells
112
+ * @template T The value type (typically string)
113
+ */
114
+ export class NileCodeEditor {
115
+ constructor(options) {
116
+ this.options = options;
117
+ this.eventListeners = [];
118
+ this.dialogOpen = false;
119
+ this.expandButtonClicked = false;
120
+ this.trackedValue = null;
121
+ }
122
+ edit(context) {
123
+ if (!context.container) {
124
+ console.warn('NileCodeEditor requires a container element');
125
+ return;
126
+ }
127
+ this.context = context;
128
+ this.trackedValue = null;
129
+ // Inject global styles once
130
+ injectCodeEditorStyles();
131
+ // Check if we should show expand button (default: true)
132
+ const showExpandButton = this.options?.showExpandButton !== false;
133
+ if (showExpandButton) {
134
+ // Create wrapper for editor + expand button
135
+ this.wrapper = document.createElement('div');
136
+ this.wrapper.className = 'st-code-editor-wrapper';
137
+ // Create the editor container
138
+ const editorContainer = document.createElement('div');
139
+ editorContainer.className = 'st-code-editor-input';
140
+ // Create NileCodeEditor custom element
141
+ this.editor = document.createElement('nile-code-editor');
142
+ this.editor.value = String(context.value ?? '');
143
+ this.editor.className = 'st-cell-editor st-nile-code-editor';
144
+ this.editor.style.width = '100%';
145
+ this.editor.style.height = '100%';
146
+ this.editor.style.boxSizing = 'border-box';
147
+ this.editor.noborder = this.options?.noborder !== false;
148
+ editorContainer.appendChild(this.editor);
149
+ this.wrapper.appendChild(editorContainer);
150
+ // Create expand button
151
+ this.expandButton = document.createElement('button');
152
+ this.expandButton.className = 'st-expand-button';
153
+ this.expandButton.type = 'button';
154
+ this.expandButton.title = 'Expand editor';
155
+ this.expandButton.innerHTML = '<nile-icon name="expand-06" size="16"></nile-icon>';
156
+ // Use mousedown to set flag BEFORE blur event fires
157
+ this.expandButton.addEventListener('mousedown', (e) => {
158
+ e.preventDefault();
159
+ e.stopPropagation();
160
+ this.expandButtonClicked = true;
161
+ });
162
+ this.expandButton.addEventListener('click', (e) => {
163
+ e.preventDefault();
164
+ e.stopPropagation();
165
+ this.openDialog();
166
+ });
167
+ this.wrapper.appendChild(this.expandButton);
168
+ // Clear container and append wrapper
169
+ context.container.innerHTML = '';
170
+ context.container.appendChild(this.wrapper);
171
+ }
172
+ else {
173
+ // Create NileCodeEditor custom element without wrapper
174
+ this.editor = document.createElement('nile-code-editor');
175
+ this.editor.value = String(context.value ?? '');
176
+ this.editor.className = 'st-cell-editor st-nile-code-editor';
177
+ this.editor.style.width = '100%';
178
+ this.editor.style.height = '100%';
179
+ this.editor.style.boxSizing = 'border-box';
180
+ this.editor.noborder = this.options?.noborder !== false;
181
+ // Clear container and append editor
182
+ context.container.innerHTML = '';
183
+ context.container.appendChild(this.editor);
184
+ }
185
+ // Apply all configuration options
186
+ this.applyOptions();
187
+ // Set up event listeners
188
+ this.setupEventListeners(context);
189
+ // Auto focus - need a slight delay for nile-code-editor to fully initialize
190
+ if (this.options?.autoFocus !== false) {
191
+ // Listen for the nile-after-init event which fires when editor is ready
192
+ const initHandler = () => {
193
+ this.editor?.removeEventListener('nile-after-init', initHandler);
194
+ this.focusEditor();
195
+ };
196
+ this.editor.addEventListener('nile-after-init', initHandler);
197
+ // Fallback: also try after a delay in case the event already fired
198
+ setTimeout(() => {
199
+ this.focusEditor();
200
+ }, 100);
201
+ }
202
+ }
203
+ /**
204
+ * Focus the editor and place cursor
205
+ */
206
+ focusEditor() {
207
+ if (!this.editor)
208
+ return;
209
+ try {
210
+ // Call the component's focus method
211
+ this.editor.focus();
212
+ // Try to directly focus the CodeMirror content area
213
+ const shadowRoot = this.editor.shadowRoot;
214
+ if (shadowRoot) {
215
+ const cmContent = shadowRoot.querySelector('.cm-content');
216
+ if (cmContent) {
217
+ cmContent.focus();
218
+ // Dispatch a click event to ensure cursor placement
219
+ cmContent.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
220
+ cmContent.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
221
+ }
222
+ }
223
+ }
224
+ catch (e) {
225
+ // Silently handle any errors
226
+ }
227
+ }
228
+ /**
229
+ * Open the full editor dialog
230
+ */
231
+ openDialog() {
232
+ if (this.dialogOpen)
233
+ return;
234
+ this.dialogOpen = true;
235
+ this.expandButtonClicked = false; // Reset flag now that dialog is opening
236
+ // Create dialog with configurable dimensions
237
+ const dialogWidth = this.options?.dialogWidth || '600px';
238
+ const dialogMaxHeight = this.options?.dialogMaxHeight || '80vh';
239
+ const dialogEditorHeight = this.options?.dialogEditorHeight || '300px';
240
+ const dialogTitle = this.options?.dialogTitle || 'Edit Code';
241
+ this.dialog = document.createElement('nile-dialog');
242
+ this.dialog.className = 'st-code-editor-dialog';
243
+ this.dialog.label = dialogTitle;
244
+ this.dialog.style.setProperty('--width', dialogWidth);
245
+ this.dialog.style.setProperty('--max-height', dialogMaxHeight);
246
+ // Create dialog content
247
+ const content = document.createElement('div');
248
+ content.style.padding = '16px';
249
+ content.style.maxHeight = `calc(${dialogMaxHeight} - 80px)`;
250
+ content.style.overflow = 'auto';
251
+ // Create full editor
252
+ this.dialogEditor = document.createElement('nile-code-editor');
253
+ const minLines = this.options?.dialogMinLines ?? 20;
254
+ const currentValue = this.editor?.value || '';
255
+ const currentLineCount = (currentValue.match(/\n/g) || []).length + 1;
256
+ const paddingLines = Math.max(0, minLines - currentLineCount);
257
+ this.dialogEditor.value = currentValue + '\n'.repeat(paddingLines);
258
+ this.dialogEditor.multiline = true;
259
+ this.dialogEditor.lineNumbersMultiline = true;
260
+ this.dialogEditor.hasScroller = true;
261
+ const lineHeightPx = 20;
262
+ const minHeightFromLines = `${minLines * lineHeightPx}px`;
263
+ this.dialogEditor.style.minHeight = `max(${dialogEditorHeight}, ${minHeightFromLines})`;
264
+ this.dialogEditor.style.maxHeight = `calc(${dialogMaxHeight} - 120px)`;
265
+ content.style.setProperty('--dialog-editor-min-height', `max(${dialogEditorHeight}, ${minHeightFromLines})`);
266
+ // Apply same options to dialog editor
267
+ if (this.options?.language) {
268
+ this.dialogEditor.language = this.options.language;
269
+ }
270
+ if (this.options?.placeholder) {
271
+ this.dialogEditor.placeholder = this.options.placeholder;
272
+ }
273
+ if (this.options?.tabCompletion !== undefined) {
274
+ this.dialogEditor.tabCompletion = this.options.tabCompletion;
275
+ }
276
+ if (this.options?.enableSearch !== undefined) {
277
+ this.dialogEditor.enableSearch = this.options.enableSearch;
278
+ }
279
+ if (this.options?.enableFoldGutters !== undefined) {
280
+ this.dialogEditor.enableFoldGutters = this.options.enableFoldGutters;
281
+ }
282
+ if (this.options?.customAutoCompletions) {
283
+ this.dialogEditor.customAutoCompletions = this.options.customAutoCompletions;
284
+ }
285
+ if (this.options?.customCompletionsPaths) {
286
+ this.dialogEditor.customCompletionsPaths = this.options.customCompletionsPaths;
287
+ }
288
+ if (this.options?.customThemeCSS) {
289
+ this.dialogEditor.customThemeCSS = this.options.customThemeCSS;
290
+ }
291
+ this.dialogEditor.expandable = false;
292
+ // Real-time sync: Update cell editor whenever dialog editor changes
293
+ this.dialogEditor.addEventListener('nile-change', (e) => {
294
+ const dialogValue = e.detail?.value || '';
295
+ this.trackedValue = dialogValue;
296
+ if (this.editor) {
297
+ this.editor.value = dialogValue;
298
+ }
299
+ if (this.context) {
300
+ this.context.onChange(dialogValue);
301
+ }
302
+ });
303
+ content.appendChild(this.dialogEditor);
304
+ this.dialog.appendChild(content);
305
+ // Handle dialog close events (clicking X button - stay in edit mode)
306
+ this.dialog.addEventListener('nile-request-close', (e) => {
307
+ const customEvent = e;
308
+ // Check if close was triggered by overlay click (clicking outside)
309
+ if (customEvent.detail?.source === 'overlay') {
310
+ // Clicking outside the dialog - save and exit edit mode
311
+ this.closeDialog(true);
312
+ }
313
+ else {
314
+ // Clicking X button - stay in edit mode
315
+ this.closeDialog(false);
316
+ }
317
+ });
318
+ // Handle Escape key in dialog - stay in edit mode
319
+ this.dialog.addEventListener('keydown', (e) => {
320
+ if (e.key === 'Escape') {
321
+ e.preventDefault();
322
+ e.stopPropagation();
323
+ this.closeDialog(false);
324
+ }
325
+ });
326
+ // Append to body and show
327
+ document.body.appendChild(this.dialog);
328
+ // Open dialog after a tick to ensure it's in the DOM
329
+ setTimeout(() => {
330
+ if (this.dialog) {
331
+ this.dialog.open = true;
332
+ // Focus the dialog editor
333
+ setTimeout(() => {
334
+ this.dialogEditor?.focus();
335
+ }, 100);
336
+ }
337
+ }, 0);
338
+ }
339
+ /**
340
+ * Close the dialog and optionally save/exit edit mode
341
+ */
342
+ closeDialog(saveAndExit = false) {
343
+ if (!this.dialogOpen)
344
+ return;
345
+ // Reset flag immediately so document click handler works
346
+ this.dialogOpen = false;
347
+ // Close and remove dialog
348
+ if (this.dialog) {
349
+ this.dialog.open = false;
350
+ const dialogRef = this.dialog;
351
+ const dialogEditorRef = this.dialogEditor;
352
+ this.dialog = undefined;
353
+ this.dialogEditor = undefined;
354
+ // Remove from DOM after animation
355
+ setTimeout(() => {
356
+ dialogRef?.remove();
357
+ }, 200);
358
+ if (saveAndExit && this.context) {
359
+ // Save and exit edit mode
360
+ this.context.onSave(this.getCurrentValue());
361
+ }
362
+ else {
363
+ // Refocus the cell editor to stay in edit mode
364
+ setTimeout(() => {
365
+ this.focusEditor();
366
+ }, 50);
367
+ }
368
+ }
369
+ }
370
+ /**
371
+ * Apply all configuration options to the NileCodeEditor element
372
+ */
373
+ applyOptions() {
374
+ if (!this.editor)
375
+ return;
376
+ // Language and syntax
377
+ if (this.options?.language) {
378
+ this.editor.language = this.options.language;
379
+ }
380
+ if (this.options?.disableSyntaxHighlighting) {
381
+ this.editor.disableSyntaxHighlighting = this.options.disableSyntaxHighlighting;
382
+ }
383
+ // Editor appearance
384
+ if (this.options?.placeholder) {
385
+ this.editor.placeholder = this.options.placeholder;
386
+ }
387
+ if (this.options?.lineNumbers !== undefined) {
388
+ this.editor.lineNumbers = this.options.lineNumbers;
389
+ }
390
+ if (this.options?.lineNumbersMultiline !== undefined) {
391
+ this.editor.lineNumbersMultiline = this.options.lineNumbersMultiline;
392
+ }
393
+ if (this.options?.multiline !== undefined) {
394
+ this.editor.multiline = this.options.multiline;
395
+ }
396
+ if (this.options?.defaultFont !== undefined) {
397
+ this.editor.defaultFont = this.options.defaultFont;
398
+ }
399
+ // Editor behavior
400
+ if (this.options?.readonly !== undefined) {
401
+ this.editor.readonly = this.options.readonly;
402
+ }
403
+ if (this.options?.disabled !== undefined) {
404
+ this.editor.disabled = this.options.disabled;
405
+ }
406
+ if (this.options?.tabCompletion !== undefined) {
407
+ this.editor.tabCompletion = this.options.tabCompletion;
408
+ }
409
+ if (this.options?.enableSearch !== undefined) {
410
+ this.editor.enableSearch = this.options.enableSearch;
411
+ }
412
+ if (this.options?.enableFoldGutters !== undefined) {
413
+ this.editor.enableFoldGutters = this.options.enableFoldGutters;
414
+ }
415
+ if (this.options?.hasScroller !== undefined) {
416
+ this.editor.hasScroller = this.options.hasScroller;
417
+ }
418
+ // Expandable - default to false for cell editing
419
+ this.editor.expandable = this.options?.expandable ?? false;
420
+ if (this.options?.expandIcon) {
421
+ this.editor.expandIcon = this.options.expandIcon;
422
+ }
423
+ // Autocompletion
424
+ if (this.options?.customAutoCompletions) {
425
+ this.editor.customAutoCompletions = this.options.customAutoCompletions;
426
+ }
427
+ if (this.options?.customCompletionsPaths) {
428
+ this.editor.customCompletionsPaths = this.options.customCompletionsPaths;
429
+ }
430
+ if (this.options?.allowVariableInCustomSuggestion !== undefined) {
431
+ this.editor.allowVariableInCustomSuggestion = this.options.allowVariableInCustomSuggestion;
432
+ }
433
+ if (this.options?.aboveCursor !== undefined) {
434
+ this.editor.aboveCursor = this.options.aboveCursor;
435
+ }
436
+ if (this.options?.autoCompleteStyle) {
437
+ this.editor.autoCompleteStyle = this.options.autoCompleteStyle;
438
+ }
439
+ // Change handling
440
+ if (this.options?.debounce !== undefined) {
441
+ this.editor.debounce = this.options.debounce;
442
+ }
443
+ if (this.options?.debounceTimeout !== undefined) {
444
+ this.editor.debounceTimeout = this.options.debounceTimeout;
445
+ }
446
+ // Visual states
447
+ if (this.options?.error !== undefined) {
448
+ this.editor.error = this.options.error;
449
+ }
450
+ if (this.options?.errorMessage) {
451
+ this.editor.errorMessage = this.options.errorMessage;
452
+ }
453
+ // Custom theme
454
+ if (this.options?.customThemeCSS) {
455
+ this.editor.customThemeCSS = this.options.customThemeCSS;
456
+ }
457
+ }
458
+ /**
459
+ * Set up all event listeners with proper cleanup tracking
460
+ */
461
+ setupEventListeners(context) {
462
+ if (!this.editor)
463
+ return;
464
+ const validateOnSave = this.options?.validateOnSave !== false;
465
+ // Handle keyboard events
466
+ const keydownHandler = (e) => {
467
+ const keyEvent = e;
468
+ // For single-line mode, Enter saves
469
+ if (!this.options?.multiline && keyEvent.key === 'Enter') {
470
+ keyEvent.preventDefault();
471
+ keyEvent.stopPropagation();
472
+ this.saveValue(context, validateOnSave);
473
+ }
474
+ // Escape cancels
475
+ if (keyEvent.key === 'Escape') {
476
+ keyEvent.preventDefault();
477
+ keyEvent.stopPropagation();
478
+ context.onCancel();
479
+ }
480
+ };
481
+ this.editor.addEventListener('keydown', keydownHandler);
482
+ this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
483
+ // Use nile-blur event for saving on blur
484
+ const blurHandler = () => {
485
+ // Don't save if dialog is open
486
+ if (this.dialogOpen) {
487
+ return;
488
+ }
489
+ // Don't save if expand button was clicked (mousedown sets this flag)
490
+ if (this.expandButtonClicked) {
491
+ // Reset flag - the click handler will open the dialog
492
+ this.expandButtonClicked = false;
493
+ return;
494
+ }
495
+ // Save and exit edit mode
496
+ this.saveValue(context, validateOnSave);
497
+ };
498
+ this.editor.addEventListener('nile-blur', blurHandler);
499
+ this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
500
+ // Document-level mousedown handler to detect clicks outside the editor
501
+ this.documentClickHandler = (e) => {
502
+ // Don't process if dialog is open or expand button was clicked
503
+ if (this.dialogOpen || this.expandButtonClicked) {
504
+ return;
505
+ }
506
+ // Use composedPath to handle Shadow DOM boundaries
507
+ const path = e.composedPath();
508
+ // Check if any element in the path is our wrapper, editor, or expand button
509
+ for (const element of path) {
510
+ if (element === this.wrapper || element === this.editor || element === this.expandButton) {
511
+ return;
512
+ }
513
+ // Also check if it's the container (the cell)
514
+ if (element === context.container) {
515
+ return;
516
+ }
517
+ }
518
+ // Click is outside - save and exit
519
+ this.saveValue(context, validateOnSave);
520
+ };
521
+ // Add with a small delay to avoid capturing the initial click that opened the editor
522
+ setTimeout(() => {
523
+ document.addEventListener('mousedown', this.documentClickHandler, true);
524
+ }, 50);
525
+ // Real-time value updates using nile-change
526
+ const changeHandler = (e) => {
527
+ const customEvent = e;
528
+ const newValue = customEvent.detail?.value ?? '';
529
+ this.trackedValue = newValue;
530
+ context.onChange(newValue);
531
+ };
532
+ this.editor.addEventListener('nile-change', changeHandler);
533
+ this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
534
+ // Handle expand event if expandable
535
+ if (this.options?.expandable) {
536
+ const expandHandler = () => {
537
+ // Emit a custom event that the parent can listen to
538
+ const expandEvent = new CustomEvent('st-code-editor-expand', {
539
+ bubbles: true,
540
+ detail: { value: this.getCurrentValue() }
541
+ });
542
+ this.editor?.dispatchEvent(expandEvent);
543
+ };
544
+ this.editor.addEventListener('nile-expand', expandHandler);
545
+ this.eventListeners.push({ event: 'nile-expand', handler: expandHandler });
546
+ }
547
+ }
548
+ /**
549
+ * Save value with optional validation
550
+ */
551
+ saveValue(context, validate) {
552
+ if (!this.editor)
553
+ return;
554
+ // Code editor doesn't have built-in validation like input
555
+ // But we can check for error state
556
+ if (validate && this.options?.error) {
557
+ return;
558
+ }
559
+ const value = this.getCurrentValue();
560
+ context.onSave(value);
561
+ }
562
+ destroy() {
563
+ // Remove document click handler
564
+ if (this.documentClickHandler) {
565
+ document.removeEventListener('mousedown', this.documentClickHandler, true);
566
+ this.documentClickHandler = undefined;
567
+ }
568
+ // Close dialog if open
569
+ if (this.dialogOpen && this.dialog) {
570
+ this.dialog.open = false;
571
+ this.dialog.remove();
572
+ this.dialog = undefined;
573
+ this.dialogEditor = undefined;
574
+ this.dialogOpen = false;
575
+ }
576
+ // Remove all event listeners
577
+ if (this.editor) {
578
+ this.eventListeners.forEach(({ event, handler }) => {
579
+ this.editor?.removeEventListener(event, handler);
580
+ });
581
+ this.eventListeners = [];
582
+ this.editor.remove();
583
+ this.editor = undefined;
584
+ }
585
+ // Remove wrapper if exists
586
+ if (this.wrapper) {
587
+ this.wrapper.remove();
588
+ this.wrapper = undefined;
589
+ }
590
+ // Clear expand button reference
591
+ this.expandButton = undefined;
592
+ this.context = undefined;
593
+ this.expandButtonClicked = false;
594
+ }
595
+ focus() {
596
+ this.editor?.focus();
597
+ }
598
+ getCurrentValue() {
599
+ if (!this.editor)
600
+ return '';
601
+ const value = (this.trackedValue !== null ? this.trackedValue : this.editor.value ?? '');
602
+ return value.replace(/\n+$/, '');
603
+ }
604
+ /**
605
+ * Set value programmatically
606
+ */
607
+ setValue(value) {
608
+ if (this.editor) {
609
+ this.editor.value = String(value ?? '');
610
+ }
611
+ }
612
+ /**
613
+ * Get the CodeMirror instance (if needed for advanced usage)
614
+ */
615
+ getEditorInstance() {
616
+ return this.editor;
617
+ }
618
+ }
619
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1jb2RlLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvZWRpdG9ycy9uaWxlLWNvZGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQXFISDs7R0FFRztBQUNILElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO0FBQ3JDLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksd0JBQXdCO1FBQUUsT0FBTztJQUNyQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsOEJBQThCLENBQUM7SUFDL0MsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU87SUFFN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0ZuQixDQUFDO0lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQWF6QixZQUE2QixPQUErQjtRQUEvQixZQUFPLEdBQVAsT0FBTyxDQUF3QjtRQVBwRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFNUIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO0lBRW9CLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQTZCO1FBQ2hDLElBQUksQ0FBQyxPQUFP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ZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXN0b20gZWRpdG9yIHVzaW5nIE5pbGVDb2RlRWRpdG9yIGZyb20gQGFxdWVyYS9uaWxlLWVsZW1lbnRzXG4gKiBUaGlzIHByb3ZpZGVzIGNvZGUgZWRpdGluZyBjYXBhYmlsaXRpZXMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciB0YWJsZSBjZWxsc1xuICovXG5cbmltcG9ydCB7IENlbGxFZGl0b3IsIENlbGxFZGl0b3JDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzL2NlbGwtc3RyYXRlZ2llcy5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEF1dG9jb21wbGV0aW9uIGl0ZW0gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGVFZGl0b3JDb21wbGV0aW9uIHtcbiAgLyoqIFRoZSBjb21wbGV0aW9uIGxhYmVsIHNob3duIGluIGRyb3Bkb3duICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBUaGUgdmFsdWUgdG8gaW5zZXJ0ICovXG4gIHZhbHVlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgZGVzY3JpcHRpb24gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF1dG9jb21wbGV0ZSBzdHlsZSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0NvbXBsZXRlU3R5bGUge1xuICAvKiogV2lkdGggb2YgdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biAqL1xuICB3aWR0aD86IHN0cmluZztcbiAgLyoqIEVuYWJsZSBtdWx0aWxpbmUgY29udGVudCBpbiBhdXRvY29tcGxldGUgKi9cbiAgbXVsdGlsaW5lPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZUNvZGVFZGl0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOaWxlQ29kZUVkaXRvck9wdGlvbnMge1xuICAvLyBMYW5ndWFnZSBhbmQgc3ludGF4XG4gIC8qKiBMYW5ndWFnZSBtb2RlIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nICovXG4gIGxhbmd1YWdlPzogJ2phdmFzY3JpcHQnIHwgJ3NxbCcgfCAnanNvbicgfCAnaHRtbCc7XG4gIC8qKiBEaXNhYmxlIHN5bnRheCBoaWdobGlnaHRpbmcgKi9cbiAgZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZz86IGJvb2xlYW47XG5cbiAgLy8gRWRpdG9yIGFwcGVhcmFuY2VcbiAgLyoqIFBsYWNlaG9sZGVyIHRleHQgd2hlbiBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqIFNob3cgbGluZSBudW1iZXJzIChzaW5nbGUtbGluZSBtb2RlKSAqL1xuICBsaW5lTnVtYmVycz86IGJvb2xlYW47XG4gIC8qKiBTaG93IGxpbmUgbnVtYmVycyBpbiBtdWx0aWxpbmUgbW9kZSAqL1xuICBsaW5lTnVtYmVyc011bHRpbGluZT86IGJvb2xlYW47XG4gIC8qKiBBbGxvdyBtdWx0aS1saW5lIGVkaXRpbmcgKi9cbiAgbXVsdGlsaW5lPzogYm9vbGVhbjtcbiAgLyoqIFJlbmRlciB3aXRob3V0IGJvcmRlciAqL1xuICBub2JvcmRlcj86IGJvb2xlYW47XG4gIC8qKiBVc2UgZGVmYXVsdCBmb250IGluc3RlYWQgb2YgaW5oZXJpdCAqL1xuICBkZWZhdWx0Rm9udD86IGJvb2xlYW47XG5cbiAgLy8gRWRpdG9yIGJlaGF2aW9yXG4gIC8qKiBBdXRvIGZvY3VzIG9uIGVkaXQgKi9cbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgLyoqIFJlYWQtb25seSBtb2RlICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcbiAgLyoqIERpc2FibGVkIHN0YXRlICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBUYWItdG8tY29tcGxldGUgKi9cbiAgdGFiQ29tcGxldGlvbj86IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgc2VhcmNoIGtleW1hcCAqL1xuICBlbmFibGVTZWFyY2g/OiBib29sZWFuO1xuICAvKiogU2hvdyBjb2RlIGZvbGRpbmcgZ3V0dGVycyAqL1xuICBlbmFibGVGb2xkR3V0dGVycz86IGJvb2xlYW47XG4gIC8qKiBJbnRlcm5hbCBzY3JvbGwgY29udGFpbmVyICovXG4gIGhhc1Njcm9sbGVyPzogYm9vbGVhbjtcbiAgLyoqIFNob3cgZXhwYW5kIGNvbnRyb2wgKG5hdGl2ZSBuaWxlLWNvZGUtZWRpdG9yIGV4cGFuZCkgKi9cbiAgZXhwYW5kYWJsZT86IGJvb2xlYW47XG4gIC8qKiBJY29uIGZvciBleHBhbmQgY29udHJvbCAqL1xuICBleHBhbmRJY29uPzogc3RyaW5nO1xuICBcbiAgLy8gRGlhbG9nIGV4cGFuZCBmZWF0dXJlXG4gIC8qKiBTaG93IGV4cGFuZCBidXR0b24gdG8gb3BlbiBmdWxsIGVkaXRvciBkaWFsb2cgKGRlZmF1bHQ6IHRydWUpICovXG4gIHNob3dFeHBhbmRCdXR0b24/OiBib29sZWFuO1xuICAvKiogRGlhbG9nIHRpdGxlIChkZWZhdWx0OiAnRWRpdCBDb2RlJykgKi9cbiAgZGlhbG9nVGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBEaWFsb2cgd2lkdGggKGRlZmF1bHQ6ICc2MDBweCcpICovXG4gIGRpYWxvZ1dpZHRoPzogc3RyaW5nO1xuICAvKiogRGlhbG9nIG1heCBoZWlnaHQgKGRlZmF1bHQ6ICc4MHZoJykgKi9cbiAgZGlhbG9nTWF4SGVpZ2h0Pzogc3RyaW5nO1xuICAvKiogRGlhbG9nIGVkaXRvciBtaW4gaGVpZ2h0IChkZWZhdWx0OiAnMzAwcHgnKSAqL1xuICBkaWFsb2dFZGl0b3JIZWlnaHQ/OiBzdHJpbmc7XG4gIC8qKiBNaW5pbXVtIG51bWJlciBvZiB2aXNpYmxlIGxpbmVzIGluIHRoZSBkaWFsb2cgZWRpdG9yIChkZWZhdWx0OiAyMCkgKi9cbiAgZGlhbG9nTWluTGluZXM/OiBudW1iZXI7XG5cbiAgLy8gQXV0b2NvbXBsZXRpb25cbiAgLyoqIElubGluZSBjb21wbGV0aW9uIGRhdGFzZXQgKi9cbiAgY3VzdG9tQXV0b0NvbXBsZXRpb25zPzogUmVjb3JkPHN0cmluZywgQ29kZUVkaXRvckNvbXBsZXRpb25bXT4gfCBDb2RlRWRpdG9yQ29tcGxldGlvbltdO1xuICAvKiogUGF0aHMgdG8gZmV0Y2ggY29tcGxldGlvbiBkYXRhc2V0cyBmcm9tICovXG4gIGN1c3RvbUNvbXBsZXRpb25zUGF0aHM/OiBzdHJpbmdbXTtcbiAgLyoqIEVuYWJsZSB2YXJpYWJsZXMgaW4gc3VnZ2VzdGlvbnMgKi9cbiAgYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbj86IGJvb2xlYW47XG4gIC8qKiBTaG93IGF1dG9jb21wbGV0ZSBhYm92ZSBjdXJzb3IgKi9cbiAgYWJvdmVDdXJzb3I/OiBib29sZWFuO1xuICAvKiogU3R5bGUgY29uZmlnIGZvciBhdXRvY29tcGxldGUgZHJvcGRvd24gKi9cbiAgYXV0b0NvbXBsZXRlU3R5bGU/OiBBdXRvQ29tcGxldGVTdHlsZTtcblxuICAvLyBDaGFuZ2UgaGFuZGxpbmdcbiAgLyoqIERlYm91bmNlIGNoYW5nZSBldmVudHMgKi9cbiAgZGVib3VuY2U/OiBib29sZWFuO1xuICAvKiogRGVib3VuY2UgZGVsYXkgaW4gbXMgKi9cbiAgZGVib3VuY2VUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIEVycm9yIHN0YXRlICovXG4gIGVycm9yPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLy8gQ3VzdG9tIHRoZW1lXG4gIC8qKiBDdXN0b20gdGhlbWUgQ1NTIG9iamVjdCAqL1xuICBjdXN0b21UaGVtZUNTUz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8vIFZhbGlkYXRpb24gYmVoYXZpb3JcbiAgLyoqIFZhbGlkYXRlIGJlZm9yZSBzYXZpbmcgKGRlZmF1bHQ6IHRydWUpICovXG4gIHZhbGlkYXRlT25TYXZlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmplY3QgZ2xvYmFsIHN0eWxlcyBmb3IgbmlsZS1jb2RlLWVkaXRvciBpbiB0YWJsZSBjZWxsc1xuICovXG5sZXQgY29kZUVkaXRvclN0eWxlc0luamVjdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbmplY3RDb2RlRWRpdG9yU3R5bGVzKCk6IHZvaWQge1xuICBpZiAoY29kZUVkaXRvclN0eWxlc0luamVjdGVkKSByZXR1cm47XG4gIGNvZGVFZGl0b3JTdHlsZXNJbmplY3RlZCA9IHRydWU7XG5cbiAgY29uc3Qgc3R5bGVJZCA9ICduaWxlLWNvZGUtZWRpdG9yLWNlbGwtc3R5bGVzJztcbiAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpKSByZXR1cm47XG5cbiAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICBzdHlsZS5pZCA9IHN0eWxlSWQ7XG4gIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgIC8qIE5pbGUgQ29kZSBFZGl0b3IgY2VsbCBzdHlsaW5nICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICB9XG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBFbnN1cmUgcHJvcGVyIHNpemluZyB3aXRoaW4gdGFibGUgY2VsbCAqL1xuICAgIC5zdC1uaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbWluLWhlaWdodDogMjhweDtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgIH1cbiAgICAvKiBDb2RlTWlycm9yIGNvbnRlbnQgc2hvdWxkIGluaGVyaXQgZm9udCBzaXplICovXG4gICAgbmlsZS1jb2RlLWVkaXRvci5zdC1jZWxsLWVkaXRvciAuY20tY29udGVudCxcbiAgICBuaWxlLWNvZGUtZWRpdG9yLnN0LWNlbGwtZWRpdG9yIC5jbS1saW5lIHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC8qIENvbnRhaW5lciB3cmFwcGVyIGZvciBlZGl0b3IgKyBleHBhbmQgYnV0dG9uICovXG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGdhcDogNHB4O1xuICAgIH1cbiAgICAuc3QtY29kZS1lZGl0b3Itd3JhcHBlciAuc3QtY29kZS1lZGl0b3ItaW5wdXQge1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLXdyYXBwZXIgLnN0LWV4cGFuZC1idXR0b24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgbWluLXdpZHRoOiAyNHB4O1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgY29sb3I6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC01MDAsICM2YjcyODApO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci13cmFwcGVyIC5zdC1leHBhbmQtYnV0dG9uOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC0xMDAsICNmM2Y0ZjYpO1xuICAgICAgY29sb3I6IHZhcigtLW5pbGUtY29sb3ItbmV1dHJhbC03MDAsICMzNzQxNTEpO1xuICAgIH1cbiAgICAvKiBEaWFsb2cgY29kZSBlZGl0b3Igc3R5bGluZyAqL1xuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQocGFuZWwpIHtcbiAgICAgIG1heC1oZWlnaHQ6IHZhcigtLW1heC1oZWlnaHQsIDgwdmgpICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2c6OnBhcnQoYm9keSkge1xuICAgICAgb3ZlcmZsb3c6IGF1dG8gIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5zdC1jb2RlLWVkaXRvci1kaWFsb2cgbmlsZS1jb2RlLWVkaXRvcjo6cGFydChjb2RlLWVkaXRvci1iYXNlKSB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1uaWxlLWNvbG9yLW5ldXRyYWwtMjAwLCAjZTVlN2ViKSAhaW1wb3J0YW50O1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gICAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50O1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIC5jbS1lZGl0b3Ige1xuICAgICAgbWluLWhlaWdodDogdmFyKC0tZGlhbG9nLWVkaXRvci1taW4taGVpZ2h0LCAzMDBweCkgIWltcG9ydGFudDtcbiAgICB9XG4gICAgLnN0LWNvZGUtZWRpdG9yLWRpYWxvZyBuaWxlLWNvZGUtZWRpdG9yIC5jbS1jb250ZW50IHtcbiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWRpYWxvZy1lZGl0b3ItbWluLWhlaWdodCwgMzAwcHgpICFpbXBvcnRhbnQ7XG4gICAgfVxuICBgO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlQ29kZUVkaXRvciBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGNvZGUgZWRpdGluZyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIHRhYmxlIGNlbGxzXG4gKiBAdGVtcGxhdGUgVCBUaGUgdmFsdWUgdHlwZSAodHlwaWNhbGx5IHN0cmluZylcbiAqL1xuZXhwb3J0IGNsYXNzIE5pbGVDb2RlRWRpdG9yPFQgPSBzdHJpbmc+IGltcGxlbWVudHMgQ2VsbEVkaXRvcjxUPiB7XG4gIHByaXZhdGUgZWRpdG9yPzogYW55O1xuICBwcml2YXRlIHdyYXBwZXI/OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSBleHBhbmRCdXR0b24/OiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgcHJpdmF0ZSBkaWFsb2c/OiBhbnk7XG4gIHByaXZhdGUgZGlhbG9nRWRpdG9yPzogYW55O1xuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBBcnJheTx7IGV2ZW50OiBzdHJpbmc7IGhhbmRsZXI6IEV2ZW50TGlzdGVuZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBjb250ZXh0PzogQ2VsbEVkaXRvckNvbnRleHQ8VD47XG4gIHByaXZhdGUgZGlhbG9nT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkb2N1bWVudENsaWNrSGFuZGxlcj86IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIHRyYWNrZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zPzogTmlsZUNvZGVFZGl0b3JPcHRpb25zKSB7fVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVDb2RlRWRpdG9yIHJlcXVpcmVzIGEgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMudHJhY2tlZFZhbHVlID0gbnVsbDtcblxuICAgIC8vIEluamVjdCBnbG9iYWwgc3R5bGVzIG9uY2VcbiAgICBpbmplY3RDb2RlRWRpdG9yU3R5bGVzKCk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBleHBhbmQgYnV0dG9uIChkZWZhdWx0OiB0cnVlKVxuICAgIGNvbnN0IHNob3dFeHBhbmRCdXR0b24gPSB0aGlzLm9wdGlvbnM/LnNob3dFeHBhbmRCdXR0b24gIT09IGZhbHNlO1xuXG4gICAgaWYgKHNob3dFeHBhbmRCdXR0b24pIHtcbiAgICAgIC8vIENyZWF0ZSB3cmFwcGVyIGZvciBlZGl0b3IgKyBleHBhbmQgYnV0dG9uXG4gICAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMud3JhcHBlci5jbGFzc05hbWUgPSAnc3QtY29kZS1lZGl0b3Itd3JhcHBlcic7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgZWRpdG9yIGNvbnRhaW5lclxuICAgICAgY29uc3QgZWRpdG9yQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBlZGl0b3JDb250YWluZXIuY2xhc3NOYW1lID0gJ3N0LWNvZGUtZWRpdG9yLWlucHV0JztcblxuICAgICAgLy8gQ3JlYXRlIE5pbGVDb2RlRWRpdG9yIGN1c3RvbSBlbGVtZW50XG4gICAgICB0aGlzLmVkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUgPz8gJycpO1xuICAgICAgdGhpcy5lZGl0b3IuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY29kZS1lZGl0b3InO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgICB0aGlzLmVkaXRvci5ub2JvcmRlciA9IHRoaXMub3B0aW9ucz8ubm9ib3JkZXIgIT09IGZhbHNlO1xuXG4gICAgICBlZGl0b3JDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKGVkaXRvckNvbnRhaW5lcik7XG5cbiAgICAgIC8vIENyZWF0ZSBleHBhbmQgYnV0dG9uXG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uY2xhc3NOYW1lID0gJ3N0LWV4cGFuZC1idXR0b24nO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24udGl0bGUgPSAnRXhwYW5kIGVkaXRvcic7XG4gICAgICB0aGlzLmV4cGFuZEJ1dHRvbi5pbm5lckhUTUwgPSAnPG5pbGUtaWNvbiBuYW1lPVwiZXhwYW5kLTA2XCIgc2l6ZT1cIjE2XCI+PC9uaWxlLWljb24+JztcbiAgICAgIFxuICAgICAgLy8gVXNlIG1vdXNlZG93biB0byBzZXQgZmxhZyBCRUZPUkUgYmx1ciBldmVudCBmaXJlc1xuICAgICAgdGhpcy5leHBhbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRoaXMuZXhwYW5kQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm9wZW5EaWFsb2coKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuZXhwYW5kQnV0dG9uKTtcblxuICAgICAgLy8gQ2xlYXIgY29udGFpbmVyIGFuZCBhcHBlbmQgd3JhcHBlclxuICAgICAgY29udGV4dC5jb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgICBjb250ZXh0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgTmlsZUNvZGVFZGl0b3IgY3VzdG9tIGVsZW1lbnQgd2l0aG91dCB3cmFwcGVyXG4gICAgICB0aGlzLmVkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICAgIHRoaXMuZWRpdG9yLnZhbHVlID0gU3RyaW5nKGNvbnRleHQudmFsdWUgPz8gJycpO1xuICAgICAgdGhpcy5lZGl0b3IuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yIHN0LW5pbGUtY29kZS1lZGl0b3InO1xuICAgICAgdGhpcy5lZGl0b3Iuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICB0aGlzLmVkaXRvci5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgICB0aGlzLmVkaXRvci5ub2JvcmRlciA9IHRoaXMub3B0aW9ucz8ubm9ib3JkZXIgIT09IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb250YWluZXIgYW5kIGFwcGVuZCBlZGl0b3JcbiAgICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgY29udGV4dC5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5lZGl0b3IpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmFwcGx5T3B0aW9ucygpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIEF1dG8gZm9jdXMgLSBuZWVkIGEgc2xpZ2h0IGRlbGF5IGZvciBuaWxlLWNvZGUtZWRpdG9yIHRvIGZ1bGx5IGluaXRpYWxpemVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvRm9jdXMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHRoZSBuaWxlLWFmdGVyLWluaXQgZXZlbnQgd2hpY2ggZmlyZXMgd2hlbiBlZGl0b3IgaXMgcmVhZHlcbiAgICAgIGNvbnN0IGluaXRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgICB0aGlzLmZvY3VzRWRpdG9yKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1hZnRlci1pbml0JywgaW5pdEhhbmRsZXIpO1xuICAgICAgXG4gICAgICAvLyBGYWxsYmFjazogYWxzbyB0cnkgYWZ0ZXIgYSBkZWxheSBpbiBjYXNlIHRoZSBldmVudCBhbHJlYWR5IGZpcmVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgY3Vyc29yXG4gICAqL1xuICBwcml2YXRlIGZvY3VzRWRpdG9yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ2FsbCB0aGUgY29tcG9uZW50J3MgZm9jdXMgbWV0aG9kXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZGlyZWN0bHkgZm9jdXMgdGhlIENvZGVNaXJyb3IgY29udGVudCBhcmVhXG4gICAgICBjb25zdCBzaGFkb3dSb290ID0gdGhpcy5lZGl0b3Iuc2hhZG93Um9vdDtcbiAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgIGNvbnN0IGNtQ29udGVudCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNtLWNvbnRlbnQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKGNtQ29udGVudCkge1xuICAgICAgICAgIGNtQ29udGVudC5mb2N1cygpO1xuICAgICAgICAgIC8vIERpc3BhdGNoIGEgY2xpY2sgZXZlbnQgdG8gZW5zdXJlIGN1cnNvciBwbGFjZW1lbnRcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2Vkb3duJywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICBjbUNvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2V1cCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTaWxlbnRseSBoYW5kbGUgYW55IGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBmdWxsIGVkaXRvciBkaWFsb2dcbiAgICovXG4gIHByaXZhdGUgb3BlbkRpYWxvZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSByZXR1cm47XG4gICAgdGhpcy5kaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTsgLy8gUmVzZXQgZmxhZyBub3cgdGhhdCBkaWFsb2cgaXMgb3BlbmluZ1xuXG4gICAgLy8gQ3JlYXRlIGRpYWxvZyB3aXRoIGNvbmZpZ3VyYWJsZSBkaW1lbnNpb25zXG4gICAgY29uc3QgZGlhbG9nV2lkdGggPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1dpZHRoIHx8ICc2MDBweCc7XG4gICAgY29uc3QgZGlhbG9nTWF4SGVpZ2h0ID0gdGhpcy5vcHRpb25zPy5kaWFsb2dNYXhIZWlnaHQgfHwgJzgwdmgnO1xuICAgIGNvbnN0IGRpYWxvZ0VkaXRvckhlaWdodCA9IHRoaXMub3B0aW9ucz8uZGlhbG9nRWRpdG9ySGVpZ2h0IHx8ICczMDBweCc7XG4gICAgY29uc3QgZGlhbG9nVGl0bGUgPSB0aGlzLm9wdGlvbnM/LmRpYWxvZ1RpdGxlIHx8ICdFZGl0IENvZGUnO1xuXG4gICAgdGhpcy5kaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduaWxlLWRpYWxvZycpO1xuICAgIHRoaXMuZGlhbG9nLmNsYXNzTmFtZSA9ICdzdC1jb2RlLWVkaXRvci1kaWFsb2cnO1xuICAgIHRoaXMuZGlhbG9nLmxhYmVsID0gZGlhbG9nVGl0bGU7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0td2lkdGgnLCBkaWFsb2dXaWR0aCk7XG4gICAgdGhpcy5kaWFsb2cuc3R5bGUuc2V0UHJvcGVydHkoJy0tbWF4LWhlaWdodCcsIGRpYWxvZ01heEhlaWdodCk7XG5cbiAgICAvLyBDcmVhdGUgZGlhbG9nIGNvbnRlbnRcbiAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGVudC5zdHlsZS5wYWRkaW5nID0gJzE2cHgnO1xuICAgIGNvbnRlbnQuc3R5bGUubWF4SGVpZ2h0ID0gYGNhbGMoJHtkaWFsb2dNYXhIZWlnaHR9IC0gODBweClgO1xuICAgIGNvbnRlbnQuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG5cbiAgICAvLyBDcmVhdGUgZnVsbCBlZGl0b3JcbiAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtY29kZS1lZGl0b3InKTtcbiAgICBjb25zdCBtaW5MaW5lcyA9IHRoaXMub3B0aW9ucz8uZGlhbG9nTWluTGluZXMgPz8gMjA7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5lZGl0b3I/LnZhbHVlIHx8ICcnO1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lQ291bnQgPSAoY3VycmVudFZhbHVlLm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aCArIDE7XG4gICAgY29uc3QgcGFkZGluZ0xpbmVzID0gTWF0aC5tYXgoMCwgbWluTGluZXMgLSBjdXJyZW50TGluZUNvdW50KTtcbiAgICB0aGlzLmRpYWxvZ0VkaXRvci52YWx1ZSA9IGN1cnJlbnRWYWx1ZSArICdcXG4nLnJlcGVhdChwYWRkaW5nTGluZXMpO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLm11bHRpbGluZSA9IHRydWU7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3IubGluZU51bWJlcnNNdWx0aWxpbmUgPSB0cnVlO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmhhc1Njcm9sbGVyID0gdHJ1ZTtcbiAgICBjb25zdCBsaW5lSGVpZ2h0UHggPSAyMDtcbiAgICBjb25zdCBtaW5IZWlnaHRGcm9tTGluZXMgPSBgJHttaW5MaW5lcyAqIGxpbmVIZWlnaHRQeH1weGA7XG4gICAgdGhpcy5kaWFsb2dFZGl0b3Iuc3R5bGUubWluSGVpZ2h0ID0gYG1heCgke2RpYWxvZ0VkaXRvckhlaWdodH0sICR7bWluSGVpZ2h0RnJvbUxpbmVzfSlgO1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLnN0eWxlLm1heEhlaWdodCA9IGBjYWxjKCR7ZGlhbG9nTWF4SGVpZ2h0fSAtIDEyMHB4KWA7XG4gICAgY29udGVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1kaWFsb2ctZWRpdG9yLW1pbi1oZWlnaHQnLCBgbWF4KCR7ZGlhbG9nRWRpdG9ySGVpZ2h0fSwgJHttaW5IZWlnaHRGcm9tTGluZXN9KWApO1xuXG4gICAgLy8gQXBwbHkgc2FtZSBvcHRpb25zIHRvIGRpYWxvZyBlZGl0b3JcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5wbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8udGFiQ29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci50YWJDb21wbGV0aW9uID0gdGhpcy5vcHRpb25zLnRhYkNvbXBsZXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5lbmFibGVGb2xkR3V0dGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5lbmFibGVGb2xkR3V0dGVycyA9IHRoaXMub3B0aW9ucy5lbmFibGVGb2xkR3V0dGVycztcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21Db21wbGV0aW9uc1BhdGhzKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21Db21wbGV0aW9uc1BhdGhzID0gdGhpcy5vcHRpb25zLmN1c3RvbUNvbXBsZXRpb25zUGF0aHM7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbVRoZW1lQ1NTKSB7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvci5jdXN0b21UaGVtZUNTUyA9IHRoaXMub3B0aW9ucy5jdXN0b21UaGVtZUNTUztcbiAgICB9XG5cbiAgICB0aGlzLmRpYWxvZ0VkaXRvci5leHBhbmRhYmxlID0gZmFsc2U7XG5cbiAgICAvLyBSZWFsLXRpbWUgc3luYzogVXBkYXRlIGNlbGwgZWRpdG9yIHdoZW5ldmVyIGRpYWxvZyBlZGl0b3IgY2hhbmdlc1xuICAgIHRoaXMuZGlhbG9nRWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2hhbmdlJywgKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBkaWFsb2dWYWx1ZSA9IGUuZGV0YWlsPy52YWx1ZSB8fCAnJztcbiAgICAgIHRoaXMudHJhY2tlZFZhbHVlID0gZGlhbG9nVmFsdWU7XG4gICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgdGhpcy5lZGl0b3IudmFsdWUgPSBkaWFsb2dWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Lm9uQ2hhbmdlKGRpYWxvZ1ZhbHVlIGFzIFQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29udGVudC5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZ0VkaXRvcik7XG4gICAgdGhpcy5kaWFsb2cuYXBwZW5kQ2hpbGQoY29udGVudCk7XG5cbiAgICAvLyBIYW5kbGUgZGlhbG9nIGNsb3NlIGV2ZW50cyAoY2xpY2tpbmcgWCBidXR0b24gLSBzdGF5IGluIGVkaXQgbW9kZSlcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCduaWxlLXJlcXVlc3QtY2xvc2UnLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIC8vIENoZWNrIGlmIGNsb3NlIHdhcyB0cmlnZ2VyZWQgYnkgb3ZlcmxheSBjbGljayAoY2xpY2tpbmcgb3V0c2lkZSlcbiAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LnNvdXJjZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgIC8vIENsaWNraW5nIG91dHNpZGUgdGhlIGRpYWxvZyAtIHNhdmUgYW5kIGV4aXQgZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2codHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDbGlja2luZyBYIGJ1dHRvbiAtIHN0YXkgaW4gZWRpdCBtb2RlXG4gICAgICAgIHRoaXMuY2xvc2VEaWFsb2coZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEVzY2FwZSBrZXkgaW4gZGlhbG9nIC0gc3RheSBpbiBlZGl0IG1vZGVcbiAgICB0aGlzLmRpYWxvZy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGU6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCB0byBib2R5IGFuZCBzaG93XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpYWxvZyk7XG4gICAgXG4gICAgLy8gT3BlbiBkaWFsb2cgYWZ0ZXIgYSB0aWNrIHRvIGVuc3VyZSBpdCdzIGluIHRoZSBET01cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgLy8gRm9jdXMgdGhlIGRpYWxvZyBlZGl0b3JcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kaWFsb2dFZGl0b3I/LmZvY3VzKCk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGRpYWxvZyBhbmQgb3B0aW9uYWxseSBzYXZlL2V4aXQgZWRpdCBtb2RlXG4gICAqL1xuICBwcml2YXRlIGNsb3NlRGlhbG9nKHNhdmVBbmRFeGl0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlhbG9nT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gUmVzZXQgZmxhZyBpbW1lZGlhdGVseSBzbyBkb2N1bWVudCBjbGljayBoYW5kbGVyIHdvcmtzXG4gICAgdGhpcy5kaWFsb2dPcGVuID0gZmFsc2U7XG5cbiAgICAvLyBDbG9zZSBhbmQgcmVtb3ZlIGRpYWxvZ1xuICAgIGlmICh0aGlzLmRpYWxvZykge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbiA9IGZhbHNlO1xuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2c7XG4gICAgICBjb25zdCBkaWFsb2dFZGl0b3JSZWYgPSB0aGlzLmRpYWxvZ0VkaXRvcjtcbiAgICAgIHRoaXMuZGlhbG9nID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kaWFsb2dFZGl0b3IgPSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBhZnRlciBhbmltYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkaWFsb2dSZWY/LnJlbW92ZSgpO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIFxuICAgICAgaWYgKHNhdmVBbmRFeGl0ICYmIHRoaXMuY29udGV4dCkge1xuICAgICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgICB0aGlzLmNvbnRleHQub25TYXZlKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVmb2N1cyB0aGUgY2VsbCBlZGl0b3IgdG8gc3RheSBpbiBlZGl0IG1vZGVcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb2N1c0VkaXRvcigpO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVDb2RlRWRpdG9yIGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIC8vIExhbmd1YWdlIGFuZCBzeW50YXhcbiAgICBpZiAodGhpcy5vcHRpb25zPy5sYW5ndWFnZSkge1xuICAgICAgdGhpcy5lZGl0b3IubGFuZ3VhZ2UgPSB0aGlzLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZykge1xuICAgICAgdGhpcy5lZGl0b3IuZGlzYWJsZVN5bnRheEhpZ2hsaWdodGluZyA9IHRoaXMub3B0aW9ucy5kaXNhYmxlU3ludGF4SGlnaGxpZ2h0aW5nO1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBhcHBlYXJhbmNlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8ucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmxpbmVOdW1iZXJzTXVsdGlsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmxpbmVOdW1iZXJzTXVsdGlsaW5lID0gdGhpcy5vcHRpb25zLmxpbmVOdW1iZXJzTXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lm11bHRpbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5tdWx0aWxpbmUgPSB0aGlzLm9wdGlvbnMubXVsdGlsaW5lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRlZmF1bHRGb250ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlZmF1bHRGb250ID0gdGhpcy5vcHRpb25zLmRlZmF1bHRGb250O1xuICAgIH1cblxuICAgIC8vIEVkaXRvciBiZWhhdmlvclxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnJlYWRvbmx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnJlYWRvbmx5ID0gdGhpcy5vcHRpb25zLnJlYWRvbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LnRhYkNvbXBsZXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IudGFiQ29tcGxldGlvbiA9IHRoaXMub3B0aW9ucy50YWJDb21wbGV0aW9uO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZVNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5lbmFibGVTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZW5hYmxlU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVuYWJsZUZvbGRHdXR0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVuYWJsZUZvbGRHdXR0ZXJzID0gdGhpcy5vcHRpb25zLmVuYWJsZUZvbGRHdXR0ZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/Lmhhc1Njcm9sbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmhhc1Njcm9sbGVyID0gdGhpcy5vcHRpb25zLmhhc1Njcm9sbGVyO1xuICAgIH1cblxuICAgIC8vIEV4cGFuZGFibGUgLSBkZWZhdWx0IHRvIGZhbHNlIGZvciBjZWxsIGVkaXRpbmdcbiAgICB0aGlzLmVkaXRvci5leHBhbmRhYmxlID0gdGhpcy5vcHRpb25zPy5leHBhbmRhYmxlID8/IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kSWNvbikge1xuICAgICAgdGhpcy5lZGl0b3IuZXhwYW5kSWNvbiA9IHRoaXMub3B0aW9ucy5leHBhbmRJY29uO1xuICAgIH1cblxuICAgIC8vIEF1dG9jb21wbGV0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uY3VzdG9tQXV0b0NvbXBsZXRpb25zKSB7XG4gICAgICB0aGlzLmVkaXRvci5jdXN0b21BdXRvQ29tcGxldGlvbnMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0b0NvbXBsZXRpb25zO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmN1c3RvbUNvbXBsZXRpb25zUGF0aHMpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmN1c3RvbUNvbXBsZXRpb25zUGF0aHMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29tcGxldGlvbnNQYXRocztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hbGxvd1ZhcmlhYmxlSW5DdXN0b21TdWdnZXN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmFsbG93VmFyaWFibGVJbkN1c3RvbVN1Z2dlc3Rpb24gPSB0aGlzLm9wdGlvbnMuYWxsb3dWYXJpYWJsZUluQ3VzdG9tU3VnZ2VzdGlvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hYm92ZUN1cnNvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmVkaXRvci5hYm92ZUN1cnNvciA9IHRoaXMub3B0aW9ucy5hYm92ZUN1cnNvcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5hdXRvQ29tcGxldGVTdHlsZSkge1xuICAgICAgdGhpcy5lZGl0b3IuYXV0b0NvbXBsZXRlU3R5bGUgPSB0aGlzLm9wdGlvbnMuYXV0b0NvbXBsZXRlU3R5bGU7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGhhbmRsaW5nXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lZGl0b3IuZGVib3VuY2UgPSB0aGlzLm9wdGlvbnMuZGVib3VuY2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZGVib3VuY2VUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlYm91bmNlVGltZW91dCA9IHRoaXMub3B0aW9ucy5kZWJvdW5jZVRpbWVvdXQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnM/LmVycm9yTWVzc2FnZSkge1xuICAgICAgdGhpcy5lZGl0b3IuZXJyb3JNZXNzYWdlID0gdGhpcy5vcHRpb25zLmVycm9yTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBDdXN0b20gdGhlbWVcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jdXN0b21UaGVtZUNTUykge1xuICAgICAgdGhpcy5lZGl0b3IuY3VzdG9tVGhlbWVDU1MgPSB0aGlzLm9wdGlvbnMuY3VzdG9tVGhlbWVDU1M7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCBhbGwgZXZlbnQgbGlzdGVuZXJzIHdpdGggcHJvcGVyIGNsZWFudXAgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgIGNvbnN0IHZhbGlkYXRlT25TYXZlID0gdGhpcy5vcHRpb25zPy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGtleUV2ZW50ID0gZSBhcyBLZXlib2FyZEV2ZW50O1xuICAgICAgXG4gICAgICAvLyBGb3Igc2luZ2xlLWxpbmUgbW9kZSwgRW50ZXIgc2F2ZXNcbiAgICAgIGlmICghdGhpcy5vcHRpb25zPy5tdWx0aWxpbmUgJiYga2V5RXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnNhdmVWYWx1ZShjb250ZXh0LCB2YWxpZGF0ZU9uU2F2ZSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVzY2FwZSBjYW5jZWxzXG4gICAgICBpZiAoa2V5RXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgY29udGV4dC5vbkNhbmNlbCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ2tleWRvd24nLCBoYW5kbGVyOiBrZXlkb3duSGFuZGxlciB9KTtcblxuICAgIC8vIFVzZSBuaWxlLWJsdXIgZXZlbnQgZm9yIHNhdmluZyBvbiBibHVyXG4gICAgY29uc3QgYmx1ckhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAvLyBEb24ndCBzYXZlIGlmIGRpYWxvZyBpcyBvcGVuXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRG9uJ3Qgc2F2ZSBpZiBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkIChtb3VzZWRvd24gc2V0cyB0aGlzIGZsYWcpXG4gICAgICBpZiAodGhpcy5leHBhbmRCdXR0b25DbGlja2VkKSB7XG4gICAgICAgIC8vIFJlc2V0IGZsYWcgLSB0aGUgY2xpY2sgaGFuZGxlciB3aWxsIG9wZW4gdGhlIGRpYWxvZ1xuICAgICAgICB0aGlzLmV4cGFuZEJ1dHRvbkNsaWNrZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIGFuZCBleGl0IGVkaXQgbW9kZVxuICAgICAgdGhpcy5zYXZlVmFsdWUoY29udGV4dCwgdmFsaWRhdGVPblNhdmUpO1xuICAgIH07XG4gICAgdGhpcy5lZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1ibHVyJywgYmx1ckhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1ibHVyJywgaGFuZGxlcjogYmx1ckhhbmRsZXIgfSk7XG5cbiAgICAvLyBEb2N1bWVudC1sZXZlbCBtb3VzZWRvd24gaGFuZGxlciB0byBkZXRlY3QgY2xpY2tzIG91dHNpZGUgdGhlIGVkaXRvclxuICAgIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gRG9uJ3QgcHJvY2VzcyBpZiBkaWFsb2cgaXMgb3BlbiBvciBleHBhbmQgYnV0dG9uIHdhcyBjbGlja2VkXG4gICAgICBpZiAodGhpcy5kaWFsb2dPcGVuIHx8IHRoaXMuZXhwYW5kQnV0dG9uQ2xpY2tlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSBjb21wb3NlZFBhdGggdG8gaGFuZGxlIFNoYWRvdyBET00gYm91bmRhcmllc1xuICAgICAgY29uc3QgcGF0aCA9IGUuY29tcG9zZWRQYXRoKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGFueSBlbGVtZW50IGluIHRoZSBwYXRoIGlzIG91ciB3cmFwcGVyLCBlZGl0b3IsIG9yIGV4cGFuZCBidXR0b25cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwYXRoKSB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSB0aGlzLndyYXBwZXIgfHwgZWxlbWVudCA9PT0gdGhpcy5lZGl0b3IgfHwgZWxlbWVudCA9PT0gdGhpcy5leHBhbmRCdXR0b24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayBpZiBpdCdzIHRoZSBjb250YWluZXIgKHRoZSBjZWxsKVxuICAgICAgICBpZiAoZWxlbWVudCA9PT0gY29udGV4dC5jb250YWluZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2xpY2sgaXMgb3V0c2lkZSAtIHNhdmUgYW5kIGV4aXRcbiAgICAgIHRoaXMuc2F2ZVZhbHVlKGNvbnRleHQsIHZhbGlkYXRlT25TYXZlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHdpdGggYSBzbWFsbCBkZWxheSB0byBhdm9pZCBjYXB0dXJpbmcgdGhlIGluaXRpYWwgY2xpY2sgdGhhdCBvcGVuZWQgdGhlIGVkaXRvclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciEsIHRydWUpO1xuICAgIH0sIDUwKTtcblxuICAgIC8vIFJlYWwtdGltZSB2YWx1ZSB1cGRhdGVzIHVzaW5nIG5pbGUtY2hhbmdlXG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBlIGFzIEN1c3RvbUV2ZW50O1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjdXN0b21FdmVudC5kZXRhaWw/LnZhbHVlID8/ICcnO1xuICAgICAgdGhpcy50cmFja2VkVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGNvbnRleHQub25DaGFuZ2UobmV3VmFsdWUgYXMgVCk7XG4gICAgfTtcbiAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWNoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAnbmlsZS1jaGFuZ2UnLCBoYW5kbGVyOiBjaGFuZ2VIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGV4cGFuZCBldmVudCBpZiBleHBhbmRhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uZXhwYW5kYWJsZSkge1xuICAgICAgY29uc3QgZXhwYW5kSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgLy8gRW1pdCBhIGN1c3RvbSBldmVudCB0aGF0IHRoZSBwYXJlbnQgY2FuIGxpc3RlbiB0b1xuICAgICAgICBjb25zdCBleHBhbmRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnc3QtY29kZS1lZGl0b3ItZXhwYW5kJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7IHZhbHVlOiB0aGlzLmdldEN1cnJlbnRWYWx1ZSgpIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5kaXNwYXRjaEV2ZW50KGV4cGFuZEV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVkaXRvci5hZGRFdmVudExpc3RlbmVyKCduaWxlLWV4cGFuZCcsIGV4cGFuZEhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWV4cGFuZCcsIGhhbmRsZXI6IGV4cGFuZEhhbmRsZXIgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdmFsdWUgd2l0aCBvcHRpb25hbCB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNhdmVWYWx1ZShjb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dDxUPiwgdmFsaWRhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm47XG5cbiAgICAvLyBDb2RlIGVkaXRvciBkb2Vzbid0IGhhdmUgYnVpbHQtaW4gdmFsaWRhdGlvbiBsaWtlIGlucHV0XG4gICAgLy8gQnV0IHdlIGNhbiBjaGVjayBmb3IgZXJyb3Igc3RhdGVcbiAgICBpZiAodmFsaWRhdGUgJiYgdGhpcy5vcHRpb25zPy5lcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoKTtcbiAgICBjb250ZXh0Lm9uU2F2ZSh2YWx1ZSk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBjbGljayBoYW5kbGVyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuZG9jdW1lbnRDbGlja0hhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDbG9zZSBkaWFsb2cgaWYgb3BlblxuICAgIGlmICh0aGlzLmRpYWxvZ09wZW4gJiYgdGhpcy5kaWFsb2cpIHtcbiAgICAgIHRoaXMuZGlhbG9nLm9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgdGhpcy5kaWFsb2cgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ0VkaXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLmVkaXRvcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcblxuICAgICAgdGhpcy5lZGl0b3IucmVtb3ZlKCk7XG4gICAgICB0aGlzLmVkaXRvciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgd3JhcHBlciBpZiBleGlzdHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgZXhwYW5kIGJ1dHRvbiByZWZlcmVuY2VcbiAgICB0aGlzLmV4cGFuZEJ1dHRvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5leHBhbmRCdXR0b25DbGlja2VkID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvcj8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuZWRpdG9yKSByZXR1cm4gJycgYXMgdW5rbm93biBhcyBUO1xuICAgIGNvbnN0IHZhbHVlID0gKHRoaXMudHJhY2tlZFZhbHVlICE9PSBudWxsID8gdGhpcy50cmFja2VkVmFsdWUgOiB0aGlzLmVkaXRvci52YWx1ZSA/PyAnJykgYXMgc3RyaW5nO1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXG4rJC8sICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZhbHVlIHByb2dyYW1tYXRpY2FsbHlcbiAgICovXG4gIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci52YWx1ZSA9IFN0cmluZyh2YWx1ZSA/PyAnJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQ29kZU1pcnJvciBpbnN0YW5jZSAoaWYgbmVlZGVkIGZvciBhZHZhbmNlZCB1c2FnZSlcbiAgICovXG4gIGdldEVkaXRvckluc3RhbmNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xuICB9XG59XG4iXX0=