simpo-component-library 3.6.490 → 3.6.496

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 (32) hide show
  1. package/esm2022/lib/directive/background-directive.mjs +36 -31
  2. package/esm2022/lib/directive/letters-only.directive.mjs +28 -0
  3. package/esm2022/lib/directive/numbers-only.directive.mjs +28 -0
  4. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +4 -4
  5. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +4 -4
  6. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +9 -9
  7. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +4 -4
  8. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
  9. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +165 -38
  10. package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +33 -6
  11. package/esm2022/lib/sections/contact-us/contact-us.component.mjs +3 -3
  12. package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +3 -3
  13. package/esm2022/lib/sections/new-services/new-services.component.mjs +18 -5
  14. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
  15. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  16. package/esm2022/lib/services/rest.service.mjs +3 -2
  17. package/fesm2022/simpo-component-library.mjs +324 -103
  18. package/fesm2022/simpo-component-library.mjs.map +1 -1
  19. package/lib/directive/background-directive.d.ts +1 -0
  20. package/lib/directive/letters-only.directive.d.ts +9 -0
  21. package/lib/directive/numbers-only.directive.d.ts +9 -0
  22. package/lib/elements/text-editor/text-editor.component.d.ts +10 -0
  23. package/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.d.ts +13 -2
  24. package/lib/sections/new-services/new-services.component.d.ts +2 -0
  25. package/package.json +1 -1
  26. package/simpo-component-library-3.6.496.tgz +0 -0
  27. package/src/lib/styles/global-styles.css +0 -30
  28. package/simpo-component-library-3.6.486.tgz +0 -0
  29. package/simpo-component-library-3.6.487.tgz +0 -0
  30. package/simpo-component-library-3.6.488.tgz +0 -0
  31. package/simpo-component-library-3.6.489.tgz +0 -0
  32. package/simpo-component-library-3.6.490.tgz +0 -0
@@ -13,6 +13,7 @@ export class TextEditorComponent {
13
13
  this.editorService = editorService;
14
14
  this.platformId = platformId;
15
15
  this.ngZone = ngZone;
16
+ this.lastGradientSpan = null;
16
17
  this.value = '<p>Hello this is palash makhija</p>';
17
18
  this.valueChange = new EventEmitter();
18
19
  this.editable = false;
@@ -33,6 +34,7 @@ export class TextEditorComponent {
33
34
  };
34
35
  this.selectedColorType = 'SOLID';
35
36
  this.primaryColor = '#000000';
37
+ this.secondaryColor = '#bd5f5fff';
36
38
  this.savedRange = null;
37
39
  }
38
40
  ngOnInit() {
@@ -45,6 +47,53 @@ export class TextEditorComponent {
45
47
  document.removeEventListener('mousedown', this.hideToolbar.bind(this));
46
48
  }
47
49
  }
50
+ selectRange(range) {
51
+ const sel = window.getSelection();
52
+ if (!sel)
53
+ return;
54
+ sel.removeAllRanges();
55
+ sel.addRange(range);
56
+ }
57
+ markSelection() {
58
+ const sel = window.getSelection();
59
+ if (!sel || sel.rangeCount === 0)
60
+ return null;
61
+ const range = sel.getRangeAt(0).cloneRange();
62
+ const start = document.createElement('span');
63
+ const end = document.createElement('span');
64
+ start.setAttribute('data-sel-start', '1');
65
+ end.setAttribute('data-sel-end', '1');
66
+ start.style.display = 'inline-block';
67
+ start.style.width = '0';
68
+ start.style.height = '0';
69
+ end.style.display = 'inline-block';
70
+ end.style.width = '0';
71
+ end.style.height = '0';
72
+ const endRange = range.cloneRange();
73
+ endRange.collapse(false); // at end
74
+ endRange.insertNode(end);
75
+ const startRange = range.cloneRange();
76
+ startRange.collapse(true); // at start
77
+ startRange.insertNode(start);
78
+ return { start, end };
79
+ }
80
+ restoreSelectionFromMarkers(markers) {
81
+ if (!markers)
82
+ return;
83
+ const { start, end } = markers;
84
+ const sel = window.getSelection();
85
+ if (!sel)
86
+ return;
87
+ const newRange = document.createRange();
88
+ newRange.setStartAfter(start);
89
+ newRange.setEndBefore(end);
90
+ // Clean up markers
91
+ start.parentNode?.removeChild(start);
92
+ end.parentNode?.removeChild(end);
93
+ sel.removeAllRanges();
94
+ sel.addRange(newRange);
95
+ this.savedRange = newRange.cloneRange();
96
+ }
48
97
  showToolbar(event) {
49
98
  if (!isPlatformBrowser(this.platformId) || !this.editable)
50
99
  return;
@@ -78,13 +127,99 @@ export class TextEditorComponent {
78
127
  this.show = false;
79
128
  }
80
129
  }
130
+ rememberSelection(e) {
131
+ if (!isPlatformBrowser(this.platformId))
132
+ return;
133
+ const sel = window.getSelection();
134
+ if (sel && sel.rangeCount > 0) {
135
+ this.savedRange = sel.getRangeAt(0).cloneRange();
136
+ }
137
+ e.preventDefault();
138
+ }
139
+ getActiveRange() {
140
+ const sel = window.getSelection();
141
+ // Prefer saved clone, else live selection clone
142
+ const candidate = this.savedRange
143
+ ?? (sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null);
144
+ if (!candidate)
145
+ return null;
146
+ const range = ('cloneRange' in candidate) ? candidate.cloneRange() : candidate;
147
+ return range && !range.collapsed ? range : null;
148
+ }
149
+ setColorMode(mode) {
150
+ if (!isPlatformBrowser(this.platformId))
151
+ return;
152
+ this.selectedColorType = mode;
153
+ const markers = this.markSelection();
154
+ if (!markers)
155
+ return;
156
+ const markedRange = document.createRange();
157
+ markedRange.setStartAfter(markers.start);
158
+ markedRange.setEndBefore(markers.end);
159
+ if (mode === 'GRADIENT') {
160
+ const gradient = `linear-gradient(to right, ${this.primaryColor} 0%, ${this.secondaryColor} 100%)`;
161
+ this.wrapRangeWithGradient(markedRange, gradient);
162
+ markers.start.parentNode?.removeChild(markers.start);
163
+ markers.end.parentNode?.removeChild(markers.end);
164
+ const sel = window.getSelection();
165
+ if (sel && sel.rangeCount > 0)
166
+ this.savedRange = sel.getRangeAt(0).cloneRange();
167
+ this.valueChange.emit(this.editor.nativeElement.innerHTML);
168
+ return;
169
+ }
170
+ this.unwrapGradientInRange(markedRange);
171
+ this.restoreSelectionFromMarkers(markers);
172
+ this.setStyleWithCSS(true);
173
+ document.execCommand('foreColor', false, this.toolbarData.selectedColor || '#000000');
174
+ const sel = window.getSelection();
175
+ if (sel && sel.rangeCount > 0)
176
+ this.savedRange = sel.getRangeAt(0).cloneRange();
177
+ this.valueChange.emit(this.editor.nativeElement.innerHTML);
178
+ }
179
+ wrapRangeWithGradient(range, gradient) {
180
+ const span = document.createElement('span');
181
+ span.setAttribute('data-gradient', 'true');
182
+ span.style.backgroundImage = gradient;
183
+ span.style.backgroundClip = 'text';
184
+ span.style.webkitBackgroundClip = 'text';
185
+ span.style.webkitTextFillColor = 'transparent';
186
+ span.style.color = 'transparent';
187
+ const frag = range.extractContents();
188
+ span.appendChild(frag);
189
+ range.insertNode(span);
190
+ const sel = window.getSelection();
191
+ sel?.removeAllRanges();
192
+ const newRange = document.createRange();
193
+ newRange.selectNodeContents(span);
194
+ sel?.addRange(newRange);
195
+ this.lastGradientSpan = span;
196
+ }
197
+ unwrapGradientInRange(range) {
198
+ const root = this.editor?.nativeElement;
199
+ if (!root)
200
+ return;
201
+ const spans = Array.from(root.querySelectorAll('span[data-gradient="true"]'));
202
+ for (let i = spans.length - 1; i >= 0; i--) {
203
+ const span = spans[i];
204
+ try {
205
+ if (range.intersectsNode(span)) {
206
+ while (span.firstChild) {
207
+ span.parentNode?.insertBefore(span.firstChild, span);
208
+ }
209
+ span.parentNode?.removeChild(span);
210
+ }
211
+ }
212
+ catch (err) {
213
+ continue;
214
+ }
215
+ }
216
+ }
81
217
  hideToolbar(event) {
82
218
  if (!isPlatformBrowser(this.platformId) || !this.editable)
83
219
  return;
84
220
  const clickedInsideEditor = this.editor?.nativeElement.contains(event.target);
85
221
  const clickedInsideToolbar = this.toolbar?.nativeElement.contains(event.target);
86
222
  const clickedInsideSuggestion = this.suggestion?.nativeElement.contains(event.target);
87
- // Hide the toolbar if the click is outside both the editor and toolbar
88
223
  if (!clickedInsideEditor && !clickedInsideToolbar) {
89
224
  this.show = false;
90
225
  }
@@ -95,20 +230,6 @@ export class TextEditorComponent {
95
230
  formatText(command, value = '') {
96
231
  if (!isPlatformBrowser(this.platformId))
97
232
  return;
98
- // if (command === 'formatBlock') {
99
- // const selection = window.getSelection();
100
- // if (!selection || selection.rangeCount === 0) return;
101
- // const range = selection.getRangeAt(0);
102
- // const selectedText = selection.toString();
103
- // if (selectedText) {
104
- // const newElement = document.createElement(value);
105
- // newElement.textContent = selectedText;
106
- // range.deleteContents();
107
- // range.insertNode(newElement);
108
- // this.toolbarData.selectedHeading = value;
109
- // return;
110
- // }
111
- // }
112
233
  document.execCommand(command, false, value);
113
234
  if (command === 'bold')
114
235
  this.toolbarData.isBold = !this.toolbarData.isBold;
@@ -116,20 +237,41 @@ export class TextEditorComponent {
116
237
  this.toolbarData.isItalic = !this.toolbarData.isItalic;
117
238
  if (command === 'underline')
118
239
  this.toolbarData.isUnderlined = !this.toolbarData.isUnderlined;
119
- if (command === 'insertOrderedList' || command === 'insertUnorderedList')
240
+ if (command === 'insertOrderedList' || command === 'insertUnorderedList') {
120
241
  this.toolbarData.selectedList = command === this.toolbarData.selectedList ? '' : command;
242
+ this.updateFSforOL();
243
+ // Apply current size to the list wrapper and items
244
+ }
121
245
  if (command === 'justifyLeft' || command === 'justifyCenter' || command === 'justifyRight')
122
246
  this.toolbarData.selectedAlignment = command === this.toolbarData.selectedAlignment ? '' : command;
123
247
  if (command === 'formatBlock')
124
248
  this.toolbarData.selectedHeading = value;
125
249
  }
250
+ updateFSforOL() {
251
+ const cssSize = this.toolbarData.selectedSize;
252
+ if (cssSize) {
253
+ const sel = window.getSelection();
254
+ if (sel && sel.rangeCount > 0) {
255
+ const focus = sel.focusNode;
256
+ const baseEl = (focus.nodeType === Node.ELEMENT_NODE
257
+ ? focus
258
+ : focus.parentElement) || null;
259
+ const listEl = baseEl?.closest?.('ol, ul');
260
+ if (listEl) {
261
+ listEl.style.fontSize = cssSize;
262
+ listEl.querySelectorAll('li').forEach(li => {
263
+ li.style.fontSize = cssSize;
264
+ });
265
+ }
266
+ }
267
+ }
268
+ }
126
269
  setStyleWithCSS(enable) {
127
270
  try {
128
271
  document.execCommand('styleWithCSS', false, enable ? 'true' : 'false');
129
272
  }
130
273
  catch { /* some engines ignore */ }
131
274
  }
132
- // 2) Map UI sizes -> legacy steps (1..7) used by 'fontSize'
133
275
  toLegacyFontStep(cssSize) {
134
276
  const map = {
135
277
  '': 3,
@@ -142,7 +284,6 @@ export class TextEditorComponent {
142
284
  };
143
285
  return String(map.hasOwnProperty(cssSize) ? map[cssSize] : 3);
144
286
  }
145
- // 3) Optional normalization: convert any <font size="..."> produced by execCommand to <span style="font-size: cssSize">
146
287
  normalizeFontSizeToCss(cssSize) {
147
288
  const container = this.editor?.nativeElement;
148
289
  if (!container)
@@ -168,9 +309,7 @@ export class TextEditorComponent {
168
309
  if (range.collapsed)
169
310
  return;
170
311
  this.ngZone.runOutsideAngular(() => {
171
- // Ask engine to style with CSS where possible (string 'true'/'false')
172
312
  this.setStyleWithCSS(true);
173
- // Apply legacy step, then normalize to exact CSS size
174
313
  const step = this.toLegacyFontStep(cssSize);
175
314
  document.execCommand('fontSize', false, step);
176
315
  this.normalizeFontSizeToCss(cssSize);
@@ -192,13 +331,9 @@ export class TextEditorComponent {
192
331
  if (selection.getRangeAt(0).collapsed)
193
332
  return;
194
333
  this.ngZone.runOutsideAngular(() => {
195
- // Prefer CSS styling where supported
196
- this.setStyleWithCSS(true); // string 'true'/'false' required by execCommand typings [4]
197
- // Optional: clear any gradient wrappers in selection so the color shows
198
- // (gradient styles use -webkit-text-fill-color: transparent)
199
- // this.clearGradientInSelection(); // Uncomment if gradients were used before
200
- // Apply solid color to the selection
201
- document.execCommand('foreColor', false, color); // sets text color without inserting a span [1]
334
+ this.setStyleWithCSS(true);
335
+ // this.unwrapGradientInSelection();
336
+ document.execCommand('foreColor', false, color);
202
337
  setTimeout(() => {
203
338
  this.ngZone.run(() => {
204
339
  this.toolbarData.selectedColor = color;
@@ -276,17 +411,11 @@ export class TextEditorComponent {
276
411
  this.ngZone.runOutsideAngular(() => {
277
412
  // Restore previous selection first
278
413
  this.restoreSelection();
279
- // Wait a little for browser selection update before saving again and applying gradient
280
414
  setTimeout(() => {
281
- // Save current selection fresh, after restore has settled
282
415
  this.saveSelection();
283
- // Build the gradient string (fixed missing ')', and use 100% end stop)
284
416
  const gradient = `linear-gradient(to right, ${this.primaryColor} 0%, ${this.secondaryColor} 100%)`;
285
- // Apply or update the gradient styling
286
417
  this.applyGradientToText(gradient);
287
- // Restore the selection explicitly again after DOM mutation
288
418
  this.restoreSelection();
289
- // Emit updated HTML content after a short delay inside Angular zone (safe for change detection)
290
419
  setTimeout(() => {
291
420
  this.ngZone.run(() => {
292
421
  this.valueChange.emit(this.editor.nativeElement.innerHTML);
@@ -302,7 +431,6 @@ export class TextEditorComponent {
302
431
  const root = this.editor?.nativeElement;
303
432
  if (!root)
304
433
  return;
305
- // If a gradient span already exists in the editor, just update its background image and stop
306
434
  const existing = root.querySelector('span[data-gradient="true"]');
307
435
  if (existing) {
308
436
  existing.style.backgroundImage = gradientValue;
@@ -313,7 +441,6 @@ export class TextEditorComponent {
313
441
  const range = selection.getRangeAt(0);
314
442
  if (!range || range.collapsed)
315
443
  return;
316
- // Remove previous cleanup to avoid unwrapping; we want to keep the single wrapper
317
444
  const selectedContent = range.extractContents();
318
445
  const span = document.createElement('span');
319
446
  span.setAttribute('data-gradient', 'true'); // mark for future updates
@@ -382,7 +509,7 @@ export class TextEditorComponent {
382
509
  return this.value;
383
510
  }
384
511
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextEditorComponent, deps: [{ token: i1.ElementServiceService }, { token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
385
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TextEditorComponent, isStandalone: true, selector: "simpo-text-editor", inputs: { value: "value", editable: "editable", sectionId: "sectionId", label: "label" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "colorPicker", first: true, predicate: ["colorPicker"], descendants: true }, { propertyName: "parentElement", first: true, predicate: ["parentElement"], descendants: true }, { propertyName: "suggestion", first: true, predicate: ["suggestion"], descendants: true }], ngImport: i0, template: "<div class=\"editor-container\" [ngClass]=\"{'border': editable}\" #parentElement\r\n [class.d-none]=\"!editable && getText() == ''\">\r\n <div [contenteditable]=\"editable\" [(ngModel)]=\"value\" class=\"editable-text\" (mouseup)=\"showToolbar($event)\" #editor\r\n (ngModelChange)=\"updateText($event)\" (mousedown)=\"hideToolbar($event)\" (paste)=\"onPaste($event)\">\r\n </div>\r\n\r\n <div class=\"toolbar\" *ngIf=\"editable && show\" [ngStyle]=\"{'top.px': toolbarY}\"\r\n [style.right]=\"rightZero ? '0px' : 'auto'\" [style.left]=\"!rightZero ? '0px' : 'auto'\" #toolbar>\r\n <!-- <select class=\"tool\" (change)=\"onFormatChange($event)\" [(ngModel)]=\"toolbarData.selectedHeading\">\r\n <option value=\"H1\">Heading1</option>\r\n <option value=\"H2\">Heading2</option>\r\n <option value=\"H3\">Heading3</option>\r\n <option value=\"div\">Text</option>\r\n </select> -->\r\n\r\n <button class=\"tool\" (click)=\"formatText('bold')\" [ngClass]=\"{'selectedTool': toolbarData.isBold}\"><mat-icon>\r\n format_bold</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('italic')\" [ngClass]=\"{'selectedTool': toolbarData.isItalic}\"><mat-icon>\r\n format_italic</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('underline')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.isUnderlined}\"><mat-icon> format_underlined</mat-icon></button>\r\n\r\n <select class=\"tool\" (change)=\"changeFontSize($event)\" [(ngModel)]=\"toolbarData.selectedSize\">\r\n <option value=\"\" selected>Default</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1rem)\">Small</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1.25rem)\">Medium</option>\r\n <option value=\"clamp(1rem, 3vw, 1.5rem)\">Semi Large</option>\r\n <option value=\"clamp(1.25rem, 4vw, 2rem)\">Large</option>\r\n <option value=\"clamp(2rem, 5vw, 3rem)\">Extra Large</option>\r\n <option value=\"clamp(3.1rem, 7vw, 4.5rem)\">Huge</option>\r\n </select>\r\n\r\n <button class=\"tool\" (click)=\"formatText('insertOrderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertOrderedList'}\"><mat-icon>format_list_numbered</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('insertUnorderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertUnorderedList'}\"><mat-icon>\r\n format_list_bulleted</mat-icon></button>\r\n\r\n <button class=\"tool\" (click)=\"formatText('justifyLeft')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyLeft'}\"><mat-icon>\r\n format_align_left</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyCenter')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyCenter'}\"><mat-icon>\r\n format_align_center</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyRight')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyRight'}\"><mat-icon>\r\n format_align_right</mat-icon></button>\r\n\r\n <div class=\"colorType\">\r\n <button class=\"solid\" [ngClass]=\"{'solidColorSelected': selectedColorType === 'SOLID'}\"\r\n (click)=\"selectedColorType = 'SOLID'\">Solid</button>\r\n <button class=\"gradient\" [ngClass]=\"{'gradientColorSelected': selectedColorType === 'GRADIENT'}\"\r\n (click)=\"selectedColorType = 'GRADIENT'\">Gradient</button>\r\n </div>\r\n\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker()\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n <mat-icon>format_color_text</mat-icon>\r\n <input type=\"color\" #colorPicker class=\"hidden-color-picker\" (input)=\"changeColor($event)\"\r\n [(ngModel)]=\"toolbarData.selectedColor\">\r\n </button>\r\n\r\n <div class=\"colorType\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); primaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"primaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #primaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"primaryColor\">\r\n </button>\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); secondaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"secondaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #secondaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"secondaryColor\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"suggestion-box\" [ngStyle]=\"{'top.px': suggestionY}\" [style.right]=\"rightZero ? '0px' : 'auto'\"\r\n [style.left]=\"!rightZero ? '0px' : 'auto'\" *ngIf=\"editable && label && showSuggestion\" #suggestion>\r\n <div class=\"suggestion\" (click)=\"regenerateText()\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/887493c1742273970151Frame%201244831740.png\"\r\n alt=\"\">\r\n <div>\r\n <p class=\"name\">Regenerate Text</p>\r\n <p class=\"desc\">Get a fresh variation of a current text</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;display:inline-block;overflow:visible;width:100%}.editor-container div{outline:none}.editable-text{padding:4px;cursor:text}.toolbar{position:absolute;background:#fff;box-shadow:0 2px 5px #0003;display:flex;gap:5px;align-items:center;z-index:100000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:22px}.toolbar:hover{border:1px solid #ccc}.toolbar button{background:none;border:none;padding:5px 8px;cursor:pointer;font-weight:700;display:flex;align-items:center}.toolbar button:hover{background:#ddd}.toolbar select{padding:3px;border:none;outline:none;font-size:14px;font-weight:600;cursor:pointer}.toolbar input[type=color]{border:none;width:30px;height:30px;padding:0;cursor:pointer}.color-picker-btn{position:relative;background:none;border:none;cursor:pointer;padding:5px}.hidden-color-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer}.border,.border:hover{border:1px solid #E9E9E9!important;border-radius:8px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}p{margin-bottom:0rem!important}.suggestion-box{position:absolute;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #0003;z-index:10000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:10px}.suggestion{display:flex;gap:10px;width:307px;align-items:center;cursor:pointer}.suggestion img{border-radius:5px;width:32px;height:32px;background:#faf1fc;padding:3px}.suggestion .name{color:#000;font-family:var(--primary-font-family)}.suggestion .desc{color:#000;font-size:12px;color:#918585;font-family:var(--primary-font-family)}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:5px;height:35px}.colorType .solid{border-right:1px solid #E9E9E9;font-size:14px!important;font-family:Mulish}.colorType .gradient{font-size:14px!important;font-family:Mulish}.solidColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-left-radius:5px;border-bottom-left-radius:5px}.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-right-radius:5px;border-bottom-right-radius:5px}@media screen and (max-width: 475px){.toolbar{max-width:100%;flex-wrap:wrap;row-gap:15px}.tool{width:max-content!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ContenteditableValueAccessor, selector: "[contenteditable][ngModel]", inputs: ["contenteditable"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
512
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TextEditorComponent, isStandalone: true, selector: "simpo-text-editor", inputs: { value: "value", editable: "editable", sectionId: "sectionId", label: "label" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "editor", first: true, predicate: ["editor"], descendants: true }, { propertyName: "colorPicker", first: true, predicate: ["colorPicker"], descendants: true }, { propertyName: "parentElement", first: true, predicate: ["parentElement"], descendants: true }, { propertyName: "suggestion", first: true, predicate: ["suggestion"], descendants: true }], ngImport: i0, template: "<div class=\"editor-container\" [ngClass]=\"{'border': editable}\" #parentElement\r\n [class.d-none]=\"!editable && getText() == ''\">\r\n <div [contenteditable]=\"editable\" [(ngModel)]=\"value\" class=\"editable-text\" (mouseup)=\"showToolbar($event)\" #editor\r\n (ngModelChange)=\"updateText($event)\" (mousedown)=\"hideToolbar($event)\" (paste)=\"onPaste($event)\">\r\n </div>\r\n\r\n <div class=\"toolbar\" *ngIf=\"editable && show\" [ngStyle]=\"{'top.px': toolbarY}\"\r\n [style.right]=\"rightZero ? '0px' : 'auto'\" [style.left]=\"!rightZero ? '0px' : 'auto'\" #toolbar>\r\n <!-- <select class=\"tool\" (change)=\"onFormatChange($event)\" [(ngModel)]=\"toolbarData.selectedHeading\">\r\n <option value=\"H1\">Heading1</option>\r\n <option value=\"H2\">Heading2</option>\r\n <option value=\"H3\">Heading3</option>\r\n <option value=\"div\">Text</option>\r\n </select> -->\r\n\r\n <button class=\"tool\" (click)=\"formatText('bold')\" [ngClass]=\"{'selectedTool': toolbarData.isBold}\"><mat-icon>\r\n format_bold</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('italic')\" [ngClass]=\"{'selectedTool': toolbarData.isItalic}\"><mat-icon>\r\n format_italic</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('underline')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.isUnderlined}\"\r\n *ngIf=\"selectedColorType === 'SOLID'\"><mat-icon> format_underlined</mat-icon></button>\r\n\r\n <select class=\"tool\" (change)=\"changeFontSize($event)\" [(ngModel)]=\"toolbarData.selectedSize\">\r\n <option value=\"\" selected>Default</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1rem)\">Small</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1.25rem)\">Medium</option>\r\n <option value=\"clamp(1rem, 3vw, 1.5rem)\">Semi Large</option>\r\n <option value=\"clamp(1.25rem, 4vw, 2rem)\">Large</option>\r\n <option value=\"clamp(2rem, 5vw, 3rem)\">Extra Large</option>\r\n <option value=\"clamp(3.1rem, 7vw, 4.5rem)\">Huge</option>\r\n </select>\r\n\r\n <button class=\"tool\" (click)=\"formatText('insertOrderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertOrderedList'}\"><mat-icon>format_list_numbered</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('insertUnorderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertUnorderedList'}\"><mat-icon>\r\n format_list_bulleted</mat-icon></button>\r\n\r\n <button class=\"tool\" (click)=\"formatText('justifyLeft')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyLeft'}\"><mat-icon>\r\n format_align_left</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyCenter')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyCenter'}\"><mat-icon>\r\n format_align_center</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyRight')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyRight'}\"><mat-icon>\r\n format_align_right</mat-icon></button>\r\n\r\n <div class=\"colorType\">\r\n <button class=\"solid\" [ngClass]=\"{'solidColorSelected': selectedColorType === 'SOLID'}\"\r\n (mousedown)=\"rememberSelection($event)\" (click)=\"setColorMode('SOLID')\">\r\n Solid\r\n </button>\r\n <button class=\"gradient\" [ngClass]=\"{'gradientColorSelected': selectedColorType === 'GRADIENT'}\"\r\n (mousedown)=\"rememberSelection($event)\" (click)=\"setColorMode('GRADIENT')\">\r\n Gradient\r\n </button>\r\n </div>\r\n\r\n\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker()\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n <mat-icon>format_color_text</mat-icon>\r\n <input type=\"color\" #colorPicker class=\"hidden-color-picker\" (input)=\"changeColor($event)\"\r\n [(ngModel)]=\"toolbarData.selectedColor\">\r\n </button>\r\n\r\n <div class=\"colorType\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); primaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"primaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #primaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"primaryColor\">\r\n </button>\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); secondaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"secondaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #secondaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"secondaryColor\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"suggestion-box\" [ngStyle]=\"{'top.px': suggestionY}\" [style.right]=\"rightZero ? '0px' : 'auto'\"\r\n [style.left]=\"!rightZero ? '0px' : 'auto'\" *ngIf=\"editable && label && showSuggestion\" #suggestion>\r\n <div class=\"suggestion\" (click)=\"regenerateText()\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/887493c1742273970151Frame%201244831740.png\"\r\n alt=\"\">\r\n <div>\r\n <p class=\"name\">Regenerate Text</p>\r\n <p class=\"desc\">Get a fresh variation of a current text</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;display:inline-block;overflow:visible;width:100%}.editor-container div{outline:none}.editable-text{padding:4px;cursor:text}.toolbar{position:absolute;background:#fff;box-shadow:0 2px 5px #0003;display:flex;gap:5px;align-items:center;z-index:100000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:22px}.toolbar:hover{border:1px solid #ccc}.toolbar button{background:none;border:none;padding:5px 8px;cursor:pointer;font-weight:700;display:flex;align-items:center}.toolbar button:hover{background:#ddd}.toolbar select{padding:3px;border:none;outline:none;font-size:14px;font-weight:600;cursor:pointer}.toolbar input[type=color]{border:none;width:30px;height:30px;padding:0;cursor:pointer}.color-picker-btn{position:relative;background:none;border:none;cursor:pointer;padding:5px}.hidden-color-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer}.border,.border:hover{border:1px solid #E9E9E9!important;border-radius:8px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}p{margin-bottom:0rem!important}.suggestion-box{position:absolute;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #0003;z-index:10000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:10px}.suggestion{display:flex;gap:10px;width:307px;align-items:center;cursor:pointer}.suggestion img{border-radius:5px;width:32px;height:32px;background:#faf1fc;padding:3px}.suggestion .name{color:#000;font-family:var(--primary-font-family)}.suggestion .desc{color:#000;font-size:12px;color:#918585;font-family:var(--primary-font-family)}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:5px;height:35px}.colorType .solid{border-right:1px solid #E9E9E9;font-size:14px!important;font-family:Mulish}.colorType .gradient{font-size:14px!important;font-family:Mulish}.solidColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-left-radius:5px;border-bottom-left-radius:5px}.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-right-radius:5px;border-bottom-right-radius:5px}@media screen and (max-width: 475px){.toolbar{max-width:100%;flex-wrap:wrap;row-gap:15px}.tool{width:max-content!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ContenteditableValueAccessor, selector: "[contenteditable][ngModel]", inputs: ["contenteditable"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
386
513
  }
387
514
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TextEditorComponent, decorators: [{
388
515
  type: Component,
@@ -391,7 +518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
391
518
  FormsModule,
392
519
  ContenteditableValueAccessor,
393
520
  MatIconModule
394
- ], template: "<div class=\"editor-container\" [ngClass]=\"{'border': editable}\" #parentElement\r\n [class.d-none]=\"!editable && getText() == ''\">\r\n <div [contenteditable]=\"editable\" [(ngModel)]=\"value\" class=\"editable-text\" (mouseup)=\"showToolbar($event)\" #editor\r\n (ngModelChange)=\"updateText($event)\" (mousedown)=\"hideToolbar($event)\" (paste)=\"onPaste($event)\">\r\n </div>\r\n\r\n <div class=\"toolbar\" *ngIf=\"editable && show\" [ngStyle]=\"{'top.px': toolbarY}\"\r\n [style.right]=\"rightZero ? '0px' : 'auto'\" [style.left]=\"!rightZero ? '0px' : 'auto'\" #toolbar>\r\n <!-- <select class=\"tool\" (change)=\"onFormatChange($event)\" [(ngModel)]=\"toolbarData.selectedHeading\">\r\n <option value=\"H1\">Heading1</option>\r\n <option value=\"H2\">Heading2</option>\r\n <option value=\"H3\">Heading3</option>\r\n <option value=\"div\">Text</option>\r\n </select> -->\r\n\r\n <button class=\"tool\" (click)=\"formatText('bold')\" [ngClass]=\"{'selectedTool': toolbarData.isBold}\"><mat-icon>\r\n format_bold</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('italic')\" [ngClass]=\"{'selectedTool': toolbarData.isItalic}\"><mat-icon>\r\n format_italic</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('underline')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.isUnderlined}\"><mat-icon> format_underlined</mat-icon></button>\r\n\r\n <select class=\"tool\" (change)=\"changeFontSize($event)\" [(ngModel)]=\"toolbarData.selectedSize\">\r\n <option value=\"\" selected>Default</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1rem)\">Small</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1.25rem)\">Medium</option>\r\n <option value=\"clamp(1rem, 3vw, 1.5rem)\">Semi Large</option>\r\n <option value=\"clamp(1.25rem, 4vw, 2rem)\">Large</option>\r\n <option value=\"clamp(2rem, 5vw, 3rem)\">Extra Large</option>\r\n <option value=\"clamp(3.1rem, 7vw, 4.5rem)\">Huge</option>\r\n </select>\r\n\r\n <button class=\"tool\" (click)=\"formatText('insertOrderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertOrderedList'}\"><mat-icon>format_list_numbered</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('insertUnorderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertUnorderedList'}\"><mat-icon>\r\n format_list_bulleted</mat-icon></button>\r\n\r\n <button class=\"tool\" (click)=\"formatText('justifyLeft')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyLeft'}\"><mat-icon>\r\n format_align_left</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyCenter')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyCenter'}\"><mat-icon>\r\n format_align_center</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyRight')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyRight'}\"><mat-icon>\r\n format_align_right</mat-icon></button>\r\n\r\n <div class=\"colorType\">\r\n <button class=\"solid\" [ngClass]=\"{'solidColorSelected': selectedColorType === 'SOLID'}\"\r\n (click)=\"selectedColorType = 'SOLID'\">Solid</button>\r\n <button class=\"gradient\" [ngClass]=\"{'gradientColorSelected': selectedColorType === 'GRADIENT'}\"\r\n (click)=\"selectedColorType = 'GRADIENT'\">Gradient</button>\r\n </div>\r\n\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker()\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n <mat-icon>format_color_text</mat-icon>\r\n <input type=\"color\" #colorPicker class=\"hidden-color-picker\" (input)=\"changeColor($event)\"\r\n [(ngModel)]=\"toolbarData.selectedColor\">\r\n </button>\r\n\r\n <div class=\"colorType\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); primaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"primaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #primaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"primaryColor\">\r\n </button>\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); secondaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"secondaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #secondaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"secondaryColor\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"suggestion-box\" [ngStyle]=\"{'top.px': suggestionY}\" [style.right]=\"rightZero ? '0px' : 'auto'\"\r\n [style.left]=\"!rightZero ? '0px' : 'auto'\" *ngIf=\"editable && label && showSuggestion\" #suggestion>\r\n <div class=\"suggestion\" (click)=\"regenerateText()\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/887493c1742273970151Frame%201244831740.png\"\r\n alt=\"\">\r\n <div>\r\n <p class=\"name\">Regenerate Text</p>\r\n <p class=\"desc\">Get a fresh variation of a current text</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;display:inline-block;overflow:visible;width:100%}.editor-container div{outline:none}.editable-text{padding:4px;cursor:text}.toolbar{position:absolute;background:#fff;box-shadow:0 2px 5px #0003;display:flex;gap:5px;align-items:center;z-index:100000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:22px}.toolbar:hover{border:1px solid #ccc}.toolbar button{background:none;border:none;padding:5px 8px;cursor:pointer;font-weight:700;display:flex;align-items:center}.toolbar button:hover{background:#ddd}.toolbar select{padding:3px;border:none;outline:none;font-size:14px;font-weight:600;cursor:pointer}.toolbar input[type=color]{border:none;width:30px;height:30px;padding:0;cursor:pointer}.color-picker-btn{position:relative;background:none;border:none;cursor:pointer;padding:5px}.hidden-color-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer}.border,.border:hover{border:1px solid #E9E9E9!important;border-radius:8px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}p{margin-bottom:0rem!important}.suggestion-box{position:absolute;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #0003;z-index:10000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:10px}.suggestion{display:flex;gap:10px;width:307px;align-items:center;cursor:pointer}.suggestion img{border-radius:5px;width:32px;height:32px;background:#faf1fc;padding:3px}.suggestion .name{color:#000;font-family:var(--primary-font-family)}.suggestion .desc{color:#000;font-size:12px;color:#918585;font-family:var(--primary-font-family)}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:5px;height:35px}.colorType .solid{border-right:1px solid #E9E9E9;font-size:14px!important;font-family:Mulish}.colorType .gradient{font-size:14px!important;font-family:Mulish}.solidColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-left-radius:5px;border-bottom-left-radius:5px}.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-right-radius:5px;border-bottom-right-radius:5px}@media screen and (max-width: 475px){.toolbar{max-width:100%;flex-wrap:wrap;row-gap:15px}.tool{width:max-content!important}}\n"] }]
521
+ ], template: "<div class=\"editor-container\" [ngClass]=\"{'border': editable}\" #parentElement\r\n [class.d-none]=\"!editable && getText() == ''\">\r\n <div [contenteditable]=\"editable\" [(ngModel)]=\"value\" class=\"editable-text\" (mouseup)=\"showToolbar($event)\" #editor\r\n (ngModelChange)=\"updateText($event)\" (mousedown)=\"hideToolbar($event)\" (paste)=\"onPaste($event)\">\r\n </div>\r\n\r\n <div class=\"toolbar\" *ngIf=\"editable && show\" [ngStyle]=\"{'top.px': toolbarY}\"\r\n [style.right]=\"rightZero ? '0px' : 'auto'\" [style.left]=\"!rightZero ? '0px' : 'auto'\" #toolbar>\r\n <!-- <select class=\"tool\" (change)=\"onFormatChange($event)\" [(ngModel)]=\"toolbarData.selectedHeading\">\r\n <option value=\"H1\">Heading1</option>\r\n <option value=\"H2\">Heading2</option>\r\n <option value=\"H3\">Heading3</option>\r\n <option value=\"div\">Text</option>\r\n </select> -->\r\n\r\n <button class=\"tool\" (click)=\"formatText('bold')\" [ngClass]=\"{'selectedTool': toolbarData.isBold}\"><mat-icon>\r\n format_bold</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('italic')\" [ngClass]=\"{'selectedTool': toolbarData.isItalic}\"><mat-icon>\r\n format_italic</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('underline')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.isUnderlined}\"\r\n *ngIf=\"selectedColorType === 'SOLID'\"><mat-icon> format_underlined</mat-icon></button>\r\n\r\n <select class=\"tool\" (change)=\"changeFontSize($event)\" [(ngModel)]=\"toolbarData.selectedSize\">\r\n <option value=\"\" selected>Default</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1rem)\">Small</option>\r\n <option value=\"clamp(0.75rem, 2vw, 1.25rem)\">Medium</option>\r\n <option value=\"clamp(1rem, 3vw, 1.5rem)\">Semi Large</option>\r\n <option value=\"clamp(1.25rem, 4vw, 2rem)\">Large</option>\r\n <option value=\"clamp(2rem, 5vw, 3rem)\">Extra Large</option>\r\n <option value=\"clamp(3.1rem, 7vw, 4.5rem)\">Huge</option>\r\n </select>\r\n\r\n <button class=\"tool\" (click)=\"formatText('insertOrderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertOrderedList'}\"><mat-icon>format_list_numbered</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('insertUnorderedList')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedList === 'insertUnorderedList'}\"><mat-icon>\r\n format_list_bulleted</mat-icon></button>\r\n\r\n <button class=\"tool\" (click)=\"formatText('justifyLeft')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyLeft'}\"><mat-icon>\r\n format_align_left</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyCenter')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyCenter'}\"><mat-icon>\r\n format_align_center</mat-icon></button>\r\n <button class=\"tool\" (click)=\"formatText('justifyRight')\"\r\n [ngClass]=\"{'selectedTool': toolbarData.selectedAlignment === 'justifyRight'}\"><mat-icon>\r\n format_align_right</mat-icon></button>\r\n\r\n <div class=\"colorType\">\r\n <button class=\"solid\" [ngClass]=\"{'solidColorSelected': selectedColorType === 'SOLID'}\"\r\n (mousedown)=\"rememberSelection($event)\" (click)=\"setColorMode('SOLID')\">\r\n Solid\r\n </button>\r\n <button class=\"gradient\" [ngClass]=\"{'gradientColorSelected': selectedColorType === 'GRADIENT'}\"\r\n (mousedown)=\"rememberSelection($event)\" (click)=\"setColorMode('GRADIENT')\">\r\n Gradient\r\n </button>\r\n </div>\r\n\r\n\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker()\" *ngIf=\"selectedColorType === 'SOLID'\">\r\n <mat-icon>format_color_text</mat-icon>\r\n <input type=\"color\" #colorPicker class=\"hidden-color-picker\" (input)=\"changeColor($event)\"\r\n [(ngModel)]=\"toolbarData.selectedColor\">\r\n </button>\r\n\r\n <div class=\"colorType\" *ngIf=\"selectedColorType === 'GRADIENT'\">\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); primaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"primaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #primaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"primaryColor\">\r\n </button>\r\n <button class=\"tool color-picker-btn\" (click)=\"openColorPicker(); secondaryColorPicker.click()\">\r\n <mat-icon [style.color]=\"secondaryColor\">format_color_text</mat-icon>\r\n <input type=\"color\" #secondaryColorPicker class=\"hidden-color-picker\" (input)=\"changeGradientColor()\"\r\n [(ngModel)]=\"secondaryColor\">\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"suggestion-box\" [ngStyle]=\"{'top.px': suggestionY}\" [style.right]=\"rightZero ? '0px' : 'auto'\"\r\n [style.left]=\"!rightZero ? '0px' : 'auto'\" *ngIf=\"editable && label && showSuggestion\" #suggestion>\r\n <div class=\"suggestion\" (click)=\"regenerateText()\">\r\n <img src=\"https://prod-simpo.s3.ap-south-1.amazonaws.com/prod-images/887493c1742273970151Frame%201244831740.png\"\r\n alt=\"\">\r\n <div>\r\n <p class=\"name\">Regenerate Text</p>\r\n <p class=\"desc\">Get a fresh variation of a current text</p>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{font-family:var(--website-font-family)}mat-icon{font-family:Material Icons!important}.editor-container{position:relative;display:inline-block;overflow:visible;width:100%}.editor-container div{outline:none}.editable-text{padding:4px;cursor:text}.toolbar{position:absolute;background:#fff;box-shadow:0 2px 5px #0003;display:flex;gap:5px;align-items:center;z-index:100000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:22px}.toolbar:hover{border:1px solid #ccc}.toolbar button{background:none;border:none;padding:5px 8px;cursor:pointer;font-weight:700;display:flex;align-items:center}.toolbar button:hover{background:#ddd}.toolbar select{padding:3px;border:none;outline:none;font-size:14px;font-weight:600;cursor:pointer}.toolbar input[type=color]{border:none;width:30px;height:30px;padding:0;cursor:pointer}.color-picker-btn{position:relative;background:none;border:none;cursor:pointer;padding:5px}.hidden-color-picker{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;cursor:pointer}.border,.border:hover{border:1px solid #E9E9E9!important;border-radius:8px}.selectedTool{background:var(--primary-bg-color)!important;color:#fff;border-radius:5px}p{margin-bottom:0rem!important}.suggestion-box{position:absolute;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #0003;z-index:10000;box-shadow:#00000029 0 1px 4px;padding:5px 15px;border-radius:10px}.suggestion{display:flex;gap:10px;width:307px;align-items:center;cursor:pointer}.suggestion img{border-radius:5px;width:32px;height:32px;background:#faf1fc;padding:3px}.suggestion .name{color:#000;font-family:var(--primary-font-family)}.suggestion .desc{color:#000;font-size:12px;color:#918585;font-family:var(--primary-font-family)}.colorType{display:flex;border:1px solid #E9E9E9;border-radius:5px;height:35px}.colorType .solid{border-right:1px solid #E9E9E9;font-size:14px!important;font-family:Mulish}.colorType .gradient{font-size:14px!important;font-family:Mulish}.solidColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-left-radius:5px;border-bottom-left-radius:5px}.gradientColorSelected{background:var(--primary-bg-color)!important;color:#fff;border-top-right-radius:5px;border-bottom-right-radius:5px}@media screen and (max-width: 475px){.toolbar{max-width:100%;flex-wrap:wrap;row-gap:15px}.tool{width:max-content!important}}\n"] }]
395
522
  }], ctorParameters: () => [{ type: i1.ElementServiceService }, { type: Object, decorators: [{
396
523
  type: Inject,
397
524
  args: [PLATFORM_ID]
@@ -421,4 +548,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
421
548
  }], label: [{
422
549
  type: Input
423
550
  }] } });
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFnQnZELE1BQU0sT0FBTyxtQkFBbUI7SUFnQzlCLFlBQW9CLGFBQW9DLEVBQ3pCLFVBQWtCLEVBQ3ZDLE1BQWM7UUFGSixrQkFBYSxHQUFiLGFBQWEsQ0FBdUI7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUN2QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBM0JmLFVBQUssR0FBVyxxQ0FBcUMsQ0FBQztRQUNyRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDMUMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUluQyxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNiLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLGNBQVMs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dGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPdXRwdXQsIFBMQVRGT1JNX0lELCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb250ZW50ZWRpdGFibGVWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlL2NvbnRlbnRlZGl0YWJsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEVsZW1lbnRTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2VkaXRvci1zZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby10ZXh0LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENvbnRlbnRlZGl0YWJsZVZhbHVlQWNjZXNzb3IsXHJcbiAgICBNYXRJY29uTW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZXh0LWVkaXRvci5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGV4dEVkaXRvckNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicsIHsgc3RhdGljOiBmYWxzZSB9KSB0b29sYmFyITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdlZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdjb2xvclBpY2tlcicpIGNvbG9yUGlja2VyITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdwYXJlbnRFbGVtZW50JykgcGFyZW50RWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc3VnZ2VzdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KSBzdWdnZXN0aW9uITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICc8cD5IZWxsbyB0aGlzIGlzIHBhbGFzaCBtYWtoaWphPC9wPic7XHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWN0aW9uSWQ/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIHNob3cgPSBmYWxzZTtcclxuICB0b29sYmFyWSA9IDA7XHJcbiAgc3VnZ2VzdGlvblkgPSAwO1xyXG4gIHJpZ2h0WmVybzogYm9vbGVhbiA9IHRydWU7XHJcbiAgc2hvd1N1Z2dlc3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0b29sYmFyRGF0YTogYW55ID0ge1xyXG4gICAgc2VsZWN0ZWRIZWFkaW5nOiAnJyxcclxuICAgIGlzQm9sZDogZmFsc2UsXHJcbiAgICBpc0l0YWxpYzogZmFsc2UsXHJcbiAgICBpc1VuZGVybGluZWQ6IGZhbHNlLFxyXG4gICAgc2VsZWN0ZWRTaXplOiAnJyxcclxuICAgIHNlbGVjdGVkTGlzdDogJycsXHJcbiAgICBzZWxlY3RlZEFsaWdubWVudDogJycsXHJcbiAgICBzZWxlY3RlZENvbG9yOiAnIzAwMDAwMCdcclxuICB9XHJcbiAgc2VsZWN0ZWRDb2xvclR5cGU6ICdTT0xJRCcgfCAnR1JBRElFTlQnID0gJ1NPTElEJztcclxuICBwcmltYXJ5Q29sb3I6IHN0cmluZyA9ICcjMDAwMDAwJztcclxuICBzZWNvbmRhcnlDb2xvcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVsZW1lbnRTZXJ2aWNlU2VydmljZSxcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oaWRlVG9vbGJhci5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oaWRlVG9vbGJhci5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzaG93VG9vbGJhcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpIHx8ICF0aGlzLmVkaXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHBhcmVudFJlY3QgPSB0aGlzLnBhcmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHRvcEZyb21QYXJlbnQgPSByZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wO1xyXG5cclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3VnZ2VzdGlvblkgPSB0b3BGcm9tUGFyZW50ICsgMzA7XHJcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgICBjb25zdCB0b29sYmFyV2lkdGggPSA1NDE7XHJcblxyXG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICAgIGNvbnN0IHJpZ2h0UG9zaXRvbiA9IHZpZXdwb3J0V2lkdGggLSBwYXJlbnRSZWN0LmxlZnQ7XHJcbiAgICAgIGlmIChyaWdodFBvc2l0b24gKyB0b29sYmFyV2lkdGggPiB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5yaWdodFplcm8gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJpZ2h0WmVybyA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudG9vbGJhclkgPSB0b3BGcm9tUGFyZW50ICsgMzA7XHJcblxyXG4gICAgICB0aGlzLnJlRm9ybWF0dGluZ0RhdGEoKTtcclxuICAgICAgdGhpcy5yZWFkRm9ybWF0dGluZ1Byb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZGVUb29sYmFyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgfHwgIXRoaXMuZWRpdGFibGUpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlRWRpdG9yID0gdGhpcy5lZGl0b3I/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGVUb29sYmFyID0gdGhpcy50b29sYmFyPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XHJcbiAgICBjb25zdCBjbGlja2VkSW5zaWRlU3VnZ2VzdGlvbiA9IHRoaXMuc3VnZ2VzdGlvbj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG5cclxuICAgIC8vIEhpZGUgdGhlIHRvb2xiYXIgaWYgdGhlIGNsaWNrIGlzIG91dHNpZGUgYm90aCB0aGUgZWRpdG9yIGFuZCB0b29sYmFyXHJcbiAgICBpZiAoIWNsaWNrZWRJbnNpZGVFZGl0b3IgJiYgIWNsaWNrZWRJbnNpZGVUb29sYmFyKSB7XHJcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlRWRpdG9yICYmICFjbGlja2VkSW5zaWRlU3VnZ2VzdGlvbikge1xyXG4gICAgICB0aGlzLnNob3dTdWdnZXN0aW9uID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRUZXh0KGNvbW1hbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyA9ICcnKSB7XHJcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICAvLyAgIGlmIChjb21tYW5kID09PSAnZm9ybWF0QmxvY2snKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8gICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgLy8gICAgIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgIC8vICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodmFsdWUpO1xyXG4gICAgLy8gICAgICAgICBuZXdFbGVtZW50LnRleHRDb250ZW50ID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgIC8vICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuICAgIC8vICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShuZXdFbGVtZW50KTtcclxuXHJcbiAgICAvLyAgICAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRIZWFkaW5nID0gdmFsdWU7XHJcbiAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdmFsdWUpO1xyXG5cclxuICAgIGlmIChjb21tYW5kID09PSAnYm9sZCcpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuaXNCb2xkID0gIXRoaXMudG9vbGJhckRhdGEuaXNCb2xkO1xyXG4gICAgaWYgKGNvbW1hbmQgPT09ICdpdGFsaWMnKVxyXG4gICAgICB0aGlzLnRvb2xiYXJEYXRhLmlzSXRhbGljID0gIXRoaXMudG9vbGJhckRhdGEuaXNJdGFsaWM7XHJcbiAgICBpZiAoY29tbWFuZCA9PT0gJ3VuZGVybGluZScpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuaXNVbmRlcmxpbmVkID0gIXRoaXMudG9vbGJhckRhdGEuaXNVbmRlcmxpbmVkXHJcbiAgICBpZiAoY29tbWFuZCA9PT0gJ2luc2VydE9yZGVyZWRMaXN0JyB8fCBjb21tYW5kID09PSAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRMaXN0ID0gY29tbWFuZCA9PT0gdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZExpc3QgPyAnJyA6IGNvbW1hbmQ7XHJcbiAgICBpZiAoY29tbWFuZCA9PT0gJ2p1c3RpZnlMZWZ0JyB8fCBjb21tYW5kID09PSAnanVzdGlmeUNlbnRlcicgfHwgY29tbWFuZCA9PT0gJ2p1c3RpZnlSaWdodCcpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPSBjb21tYW5kID09PSB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQWxpZ25tZW50ID8gJycgOiBjb21tYW5kO1xyXG4gICAgaWYgKGNvbW1hbmQgPT09ICdmb3JtYXRCbG9jaycpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRIZWFkaW5nID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFN0eWxlV2l0aENTUyhlbmFibGU6IGJvb2xlYW4pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdzdHlsZVdpdGhDU1MnLCBmYWxzZSwgZW5hYmxlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XHJcbiAgICB9IGNhdGNoIHsgLyogc29tZSBlbmdpbmVzIGlnbm9yZSAqLyB9XHJcbiAgfVxyXG5cclxuICAvLyAyKSBNYXAgVUkgc2l6ZXMgLT4gbGVnYWN5IHN0ZXBzICgxLi43KSB1c2VkIGJ5ICdmb250U2l6ZSdcclxuICBwcml2YXRlIHRvTGVnYWN5Rm9udFN0ZXAoY3NzU2l6ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgICAgJyc6IDMsXHJcbiAgICAgICdjbGFtcCgwLjc1cmVtLCAydncsIDFyZW0pJzogMixcclxuICAgICAgJ2NsYW1wKDAuNzVyZW0sIDJ2dywgMS4yNXJlbSknOiAzLFxyXG4gICAgICAnY2xhbXAoMXJlbSwgM3Z3LCAxLjVyZW0pJzogNCxcclxuICAgICAgJ2NsYW1wKDEuMjVyZW0sIDR2dywgMnJlbSknOiA1LFxyXG4gICAgICAnY2xhbXAoMnJlbSwgNXZ3LCAzcmVtKSc6IDYsXHJcbiAgICAgICdjbGFtcCgzLjFyZW0sIDd2dywgNC41cmVtKSc6IDdcclxuICAgIH07XHJcbiAgICByZXR1cm4gU3RyaW5nKG1hcC5oYXNPd25Qcm9wZXJ0eShjc3NTaXplKSA/IG1hcFtjc3NTaXplXSA6IDMpO1xyXG4gIH1cclxuXHJcbiAgLy8gMykgT3B0aW9uYWwgbm9ybWFsaXphdGlvbjogY29udmVydCBhbnkgPGZvbnQgc2l6ZT1cIi4uLlwiPiBwcm9kdWNlZCBieSBleGVjQ29tbWFuZCB0byA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogY3NzU2l6ZVwiPlxyXG4gIHByaXZhdGUgbm9ybWFsaXplRm9udFNpemVUb0Nzcyhjc3NTaXplOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgPSB0aGlzLmVkaXRvcj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XHJcbiAgICBjb25zdCBmb250cyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdmb250W3NpemVdJyk7XHJcbiAgICBmb250cy5mb3JFYWNoKChmb250RWw6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICBpZiAoY3NzU2l6ZSkgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IGNzc1NpemU7XHJcbiAgICAgIHdoaWxlIChmb250RWwuZmlyc3RDaGlsZCkgc3Bhbi5hcHBlbmRDaGlsZChmb250RWwuZmlyc3RDaGlsZCk7XHJcbiAgICAgIGZvbnRFbC5wYXJlbnROb2RlPy5yZXBsYWNlQ2hpbGQoc3BhbiwgZm9udEVsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlRm9udFNpemUoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3NzU2l6ZSA9IGV2ZW50LnRhcmdldC52YWx1ZSBhcyBzdHJpbmc7XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAvLyBBc2sgZW5naW5lIHRvIHN0eWxlIHdpdGggQ1NTIHdoZXJlIHBvc3NpYmxlIChzdHJpbmcgJ3RydWUnLydmYWxzZScpXHJcbiAgICAgIHRoaXMuc2V0U3R5bGVXaXRoQ1NTKHRydWUpO1xyXG5cclxuICAgICAgLy8gQXBwbHkgbGVnYWN5IHN0ZXAsIHRoZW4gbm9ybWFsaXplIHRvIGV4YWN0IENTUyBzaXplXHJcbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnRvTGVnYWN5Rm9udFN0ZXAoY3NzU2l6ZSk7XHJcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb250U2l6ZScsIGZhbHNlLCBzdGVwKTtcclxuXHJcbiAgICAgIHRoaXMubm9ybWFsaXplRm9udFNpemVUb0Nzcyhjc3NTaXplKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkU2l6ZSA9IGNzc1NpemU7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNoYW5nZUNvbG9yKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlIGFzIHN0cmluZztcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcbiAgICBpZiAoc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29sbGFwc2VkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAvLyBQcmVmZXIgQ1NTIHN0eWxpbmcgd2hlcmUgc3VwcG9ydGVkXHJcbiAgICAgIHRoaXMuc2V0U3R5bGVXaXRoQ1NTKHRydWUpOyAvLyBzdHJpbmcgJ3RydWUnLydmYWxzZScgcmVxdWlyZWQgYnkgZXhlY0NvbW1hbmQgdHlwaW5ncyBbNF1cclxuXHJcbiAgICAgIC8vIE9wdGlvbmFsOiBjbGVhciBhbnkgZ3JhZGllbnQgd3JhcHBlcnMgaW4gc2VsZWN0aW9uIHNvIHRoZSBjb2xvciBzaG93c1xyXG4gICAgICAvLyAoZ3JhZGllbnQgc3R5bGVzIHVzZSAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogdHJhbnNwYXJlbnQpXHJcbiAgICAgIC8vIHRoaXMuY2xlYXJHcmFkaWVudEluU2VsZWN0aW9uKCk7IC8vIFVuY29tbWVudCBpZiBncmFkaWVudHMgd2VyZSB1c2VkIGJlZm9yZVxyXG5cclxuICAgICAgLy8gQXBwbHkgc29saWQgY29sb3IgdG8gdGhlIHNlbGVjdGlvblxyXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9yZUNvbG9yJywgZmFsc2UsIGNvbG9yKTsgLy8gc2V0cyB0ZXh0IGNvbG9yIHdpdGhvdXQgaW5zZXJ0aW5nIGEgc3BhbiBbMV1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQ29sb3IgPSBjb2xvcjtcclxuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUZXh0KGV2ZW50OiBFdmVudCkge1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKTtcclxuICB9XHJcblxyXG4gIG9uRm9ybWF0Q2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5mb3JtYXRUZXh0KCdmb3JtYXRCbG9jaycsIHNlbGVjdGVkVmFsdWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9wZW5Db2xvclBpY2tlcigpIHtcclxuICAgIHRoaXMuc2F2ZVNlbGVjdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcmVhZEZvcm1hdHRpbmdQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybjtcclxuICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8vIENoZWNrIGlmIG5vZGUgaXMgbnVsbFxyXG4gICAgaWYgKCFub2RlKSByZXR1cm47XHJcblxyXG4gICAgbGV0IGVsZW1lbnQgPSBub2RlLnBhcmVudEVsZW1lbnQ7XHJcbiAgICB3aGlsZSAoZWxlbWVudCkge1xyXG4gICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWU7XHJcblxyXG4gICAgICBpZiAobm9kZU5hbWUgPT09ICdIMScgfHwgbm9kZU5hbWUgPT09ICdIMicgfHwgbm9kZU5hbWUgPT09ICdIMycpIHtcclxuICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkSGVhZGluZyA9IG5vZGVOYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnQicgfHwgbm9kZU5hbWUgPT09ICdTVFJPTkcnKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5pc0JvbGQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnSScgfHwgbm9kZU5hbWUgPT09ICdFTScpIHtcclxuICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLmlzSXRhbGljID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ1UnKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5pc1VuZGVybGluZWQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnT0wnKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZExpc3QgPSAnaW5zZXJ0T3JkZXJlZExpc3QnO1xyXG4gICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAnVUwnKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZExpc3QgPSAnaW5zZXJ0VW5vcmRlcmVkTGlzdCc7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24pIHtcclxuICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQWxpZ25tZW50ID0gYGp1c3RpZnkke2VsZW1lbnQuc3R5bGUudGV4dEFsaWduLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24uc2xpY2UoMSl9YDtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnN0eWxlLmZvbnRTaXplKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZFNpemUgPSBlbGVtZW50LnN0eWxlLmZvbnRTaXplO1xyXG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc3R5bGUuY29sb3IpIHtcclxuICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQ29sb3IgPSBlbGVtZW50LnN0eWxlLmNvbG9yXHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVGb3JtYXR0aW5nRGF0YSgpIHtcclxuICAgIHRoaXMudG9vbGJhckRhdGEgPSB7XHJcbiAgICAgIHNlbGVjdGVkSGVhZGluZzogJycsXHJcbiAgICAgIGlzQm9sZDogZmFsc2UsXHJcbiAgICAgIGlzSXRhbGljOiBmYWxzZSxcclxuICAgICAgaXNVbmRlcmxpbmVkOiBmYWxzZSxcclxuICAgICAgc2VsZWN0ZWRTaXplOiAnJyxcclxuICAgICAgc2VsZWN0ZWRMaXN0OiAnJyxcclxuICAgICAgc2VsZWN0ZWRBbGlnbm1lbnQ6ICcnLFxyXG4gICAgICBzZWxlY3RlZENvbG9yOiAnJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlR3JhZGllbnRDb2xvcigpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24gZmlyc3RcclxuICAgICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAvLyBXYWl0IGEgbGl0dGxlIGZvciBicm93c2VyIHNlbGVjdGlvbiB1cGRhdGUgYmVmb3JlIHNhdmluZyBhZ2FpbiBhbmQgYXBwbHlpbmcgZ3JhZGllbnRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IHNlbGVjdGlvbiBmcmVzaCwgYWZ0ZXIgcmVzdG9yZSBoYXMgc2V0dGxlZFxyXG4gICAgICAgIHRoaXMuc2F2ZVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBCdWlsZCB0aGUgZ3JhZGllbnQgc3RyaW5nIChmaXhlZCBtaXNzaW5nICcpJywgYW5kIHVzZSAxMDAlIGVuZCBzdG9wKVxyXG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gYGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHt0aGlzLnByaW1hcnlDb2xvcn0gMCUsICR7dGhpcy5zZWNvbmRhcnlDb2xvcn0gMTAwJSlgO1xyXG5cclxuICAgICAgICAvLyBBcHBseSBvciB1cGRhdGUgdGhlIGdyYWRpZW50IHN0eWxpbmdcclxuICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRUb1RleHQoZ3JhZGllbnQpO1xyXG5cclxuICAgICAgICAvLyBSZXN0b3JlIHRoZSBzZWxlY3Rpb24gZXhwbGljaXRseSBhZ2FpbiBhZnRlciBET00gbXV0YXRpb25cclxuICAgICAgICB0aGlzLnJlc3RvcmVTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgLy8gRW1pdCB1cGRhdGVkIEhUTUwgY29udGVudCBhZnRlciBhIHNob3J0IGRlbGF5IGluc2lkZSBBbmd1bGFyIHpvbmUgKHNhZmUgZm9yIGNoYW5nZSBkZXRlY3Rpb24pXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgIH0sIDEwKTsgLy8gMTBtcyBkZWxheSAoYWRqdXN0YWJsZSBpZiBuZWVkZWQpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFwcGx5R3JhZGllbnRUb1RleHQoZ3JhZGllbnRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBjb25zdCByb290ID0gdGhpcy5lZGl0b3I/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXJvb3QpIHJldHVybjtcclxuXHJcbiAgICAvLyBJZiBhIGdyYWRpZW50IHNwYW4gYWxyZWFkeSBleGlzdHMgaW4gdGhlIGVkaXRvciwganVzdCB1cGRhdGUgaXRzIGJhY2tncm91bmQgaW1hZ2UgYW5kIHN0b3BcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdzcGFuW2RhdGEtZ3JhZGllbnQ9XCJ0cnVlXCJdJykgYXMgSFRNTFNwYW5FbGVtZW50IHwgbnVsbDtcclxuICAgIGlmIChleGlzdGluZykge1xyXG4gICAgICBleGlzdGluZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBncmFkaWVudFZhbHVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKCFyYW5nZSB8fCByYW5nZS5jb2xsYXBzZWQpIHJldHVybjtcclxuXHJcbiAgICAvLyBSZW1vdmUgcHJldmlvdXMgY2xlYW51cCB0byBhdm9pZCB1bndyYXBwaW5nOyB3ZSB3YW50IHRvIGtlZXAgdGhlIHNpbmdsZSB3cmFwcGVyXHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWRDb250ZW50ID0gcmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7XHJcblxyXG4gICAgY29uc3Qgc3BhbjogYW55ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtZ3JhZGllbnQnLCAndHJ1ZScpOyAvLyBtYXJrIGZvciBmdXR1cmUgdXBkYXRlc1xyXG4gICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBncmFkaWVudFZhbHVlO1xyXG4gICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9ICd0ZXh0JztcclxuICAgIHNwYW4uc3R5bGUud2Via2l0QmFja2dyb3VuZENsaXAgPSAndGV4dCc7XHJcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gJ3RyYW5zcGFyZW50JztcclxuICAgIHNwYW4uc3R5bGUud2Via2l0VGV4dEZpbGxDb2xvciA9ICd0cmFuc3BhcmVudCc7XHJcbiAgICBzcGFuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgLy8gZml4IGZyb20gaW5saW5lU2l6ZT0nYmxvY2snXHJcblxyXG4gICAgc3Bhbi5hcHBlbmRDaGlsZChzZWxlY3RlZENvbnRlbnQpO1xyXG4gICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuXHJcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBjb25zdCBuZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICBuZXdSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoc3Bhbik7XHJcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICByZWdlbmVyYXRlVGV4dCgpIHtcclxuICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICBidXNpbmVzc0lkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpLFxyXG4gICAgICBkYXRhSWQ6IHRoaXMuc2VjdGlvbklkLFxyXG4gICAgICBzdWJJbmR1c3RyeUlkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3ViSW5kdXN0cnlJZCcpLFxyXG4gICAgICBzdWdnZXN0ZWREYXRhVHlwZTogJ0NPTVBPTkVOVCcsXHJcbiAgICAgIHRvbmU6ICdQUk9GRVNTSU9OQUwnLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgbGFiZWw6IHRoaXMubGFiZWxcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVkaXRvclNlcnZpY2UucmVnZW5lcmF0ZVRleHQocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnZhbHVlID0gcmVzLmRhdGE7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlZFJhbmdlOiBSYW5nZSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgc2F2ZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMuc2F2ZWRSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzdG9yZVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNhdmVkUmFuZ2UpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHRoaXMuc2F2ZWRSYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IGh0bWwgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0L2h0bWwnKSB8fCAnJztcclxuICAgIGNvbnN0IGNsZWFuSHRtbCA9IHRoaXMuc3RyaXBTdHlsZXMoaHRtbCk7XHJcblxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgY2xlYW5IdG1sKTtcclxuICB9XHJcblxyXG4gIHN0cmlwU3R5bGVzKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcclxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbCgnKicpO1xyXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTsgLy8gUmVtb3ZlIGFsbCBpbmxpbmUgc3R5bGVzXHJcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsgLy8gT3B0aW9uYWxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRvYy5ib2R5LmlubmVySFRNTDtcclxuICB9XHJcblxyXG4gIGdldFRleHQoKSB7XHJcbiAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMudmFsdWU/LnJlcGxhY2UoLzxcXC8/W14+XSsoPnwkKS9nLCBcIlwiKT8ucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKSA/PyBcIlwiO1xyXG4gICAgaWYgKCF0ZXh0Q29udGVudCkge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieydib3JkZXInOiBlZGl0YWJsZX1cIiAjcGFyZW50RWxlbWVudFxyXG4gIFtjbGFzcy5kLW5vbmVdPVwiIWVkaXRhYmxlICYmIGdldFRleHQoKSA9PSAnJ1wiPlxyXG4gIDxkaXYgW2NvbnRlbnRlZGl0YWJsZV09XCJlZGl0YWJsZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBjbGFzcz1cImVkaXRhYmxlLXRleHRcIiAobW91c2V1cCk9XCJzaG93VG9vbGJhcigkZXZlbnQpXCIgI2VkaXRvclxyXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlVGV4dCgkZXZlbnQpXCIgKG1vdXNlZG93bik9XCJoaWRlVG9vbGJhcigkZXZlbnQpXCIgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiICpuZ0lmPVwiZWRpdGFibGUgJiYgc2hvd1wiIFtuZ1N0eWxlXT1cInsndG9wLnB4JzogdG9vbGJhcll9XCJcclxuICAgIFtzdHlsZS5yaWdodF09XCJyaWdodFplcm8gPyAnMHB4JyA6ICdhdXRvJ1wiIFtzdHlsZS5sZWZ0XT1cIiFyaWdodFplcm8gPyAnMHB4JyA6ICdhdXRvJ1wiICN0b29sYmFyPlxyXG4gICAgPCEtLSA8c2VsZWN0IGNsYXNzPVwidG9vbFwiIChjaGFuZ2UpPVwib25Gb3JtYXRDaGFuZ2UoJGV2ZW50KVwiIFsobmdNb2RlbCldPVwidG9vbGJhckRhdGEuc2VsZWN0ZWRIZWFkaW5nXCI+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJIMVwiPkhlYWRpbmcxPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJIMlwiPkhlYWRpbmcyPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJIM1wiPkhlYWRpbmczPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJkaXZcIj5UZXh0PC9vcHRpb24+XHJcbiAgICA8L3NlbGVjdD4gLS0+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnYm9sZCcpXCIgW25nQ2xhc3NdPVwieydzZWxlY3RlZFRvb2wnOiB0b29sYmFyRGF0YS5pc0JvbGR9XCI+PG1hdC1pY29uPlxyXG4gICAgICAgIGZvcm1hdF9ib2xkPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sXCIgKGNsaWNrKT1cImZvcm1hdFRleHQoJ2l0YWxpYycpXCIgW25nQ2xhc3NdPVwieydzZWxlY3RlZFRvb2wnOiB0b29sYmFyRGF0YS5pc0l0YWxpY31cIj48bWF0LWljb24+XHJcbiAgICAgICAgZm9ybWF0X2l0YWxpYzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCd1bmRlcmxpbmUnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuaXNVbmRlcmxpbmVkfVwiPjxtYXQtaWNvbj4gZm9ybWF0X3VuZGVybGluZWQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICAgIDxzZWxlY3QgY2xhc3M9XCJ0b29sXCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250U2l6ZSgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJ0b29sYmFyRGF0YS5zZWxlY3RlZFNpemVcIj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIHNlbGVjdGVkPkRlZmF1bHQ8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYW1wKDAuNzVyZW0sIDJ2dywgMXJlbSlcIj5TbWFsbDwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMC43NXJlbSwgMnZ3LCAxLjI1cmVtKVwiPk1lZGl1bTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMXJlbSwgM3Z3LCAxLjVyZW0pXCI+U2VtaSBMYXJnZTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMS4yNXJlbSwgNHZ3LCAycmVtKVwiPkxhcmdlPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJjbGFtcCgycmVtLCA1dncsIDNyZW0pXCI+RXh0cmEgTGFyZ2U8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYW1wKDMuMXJlbSwgN3Z3LCA0LjVyZW0pXCI+SHVnZTwvb3B0aW9uPlxyXG4gICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnaW5zZXJ0T3JkZXJlZExpc3QnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRMaXN0ID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnfVwiPjxtYXQtaWNvbj5mb3JtYXRfbGlzdF9udW1iZXJlZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkVG9vbCc6IHRvb2xiYXJEYXRhLnNlbGVjdGVkTGlzdCA9PT0gJ2luc2VydFVub3JkZXJlZExpc3QnfVwiPjxtYXQtaWNvbj5cclxuICAgICAgICBmb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+PC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnanVzdGlmeUxlZnQnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5TGVmdCd9XCI+PG1hdC1pY29uPlxyXG4gICAgICAgIGZvcm1hdF9hbGlnbl9sZWZ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sXCIgKGNsaWNrKT1cImZvcm1hdFRleHQoJ2p1c3RpZnlDZW50ZXInKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5Q2VudGVyJ31cIj48bWF0LWljb24+XHJcbiAgICAgICAgZm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCdqdXN0aWZ5UmlnaHQnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5UmlnaHQnfVwiPjxtYXQtaWNvbj5cclxuICAgICAgICBmb3JtYXRfYWxpZ25fcmlnaHQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNvbGlkXCIgW25nQ2xhc3NdPVwieydzb2xpZENvbG9yU2VsZWN0ZWQnOiBzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ31cIlxyXG4gICAgICAgIChjbGljayk9XCJzZWxlY3RlZENvbG9yVHlwZSA9ICdTT0xJRCdcIj5Tb2xpZDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZ3JhZGllbnRcIiBbbmdDbGFzc109XCJ7J2dyYWRpZW50Q29sb3JTZWxlY3RlZCc6IHNlbGVjdGVkQ29sb3JUeXBlID09PSAnR1JBRElFTlQnfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkQ29sb3JUeXBlID0gJ0dSQURJRU5UJ1wiPkdyYWRpZW50PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbCBjb2xvci1waWNrZXItYnRuXCIgKGNsaWNrKT1cIm9wZW5Db2xvclBpY2tlcigpXCIgKm5nSWY9XCJzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ1wiPlxyXG4gICAgICA8bWF0LWljb24+Zm9ybWF0X2NvbG9yX3RleHQ8L21hdC1pY29uPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgI2NvbG9yUGlja2VyIGNsYXNzPVwiaGlkZGVuLWNvbG9yLXBpY2tlclwiIChpbnB1dCk9XCJjaGFuZ2VDb2xvcigkZXZlbnQpXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRvb2xiYXJEYXRhLnNlbGVjdGVkQ29sb3JcIj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIiAqbmdJZj1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnR1JBRElFTlQnXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGNvbG9yLXBpY2tlci1idG5cIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCk7IHByaW1hcnlDb2xvclBpY2tlci5jbGljaygpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJwcmltYXJ5Q29sb3JcIj5mb3JtYXRfY29sb3JfdGV4dDwvbWF0LWljb24+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiICNwcmltYXJ5Q29sb3JQaWNrZXIgY2xhc3M9XCJoaWRkZW4tY29sb3ItcGlja2VyXCIgKGlucHV0KT1cImNoYW5nZUdyYWRpZW50Q29sb3IoKVwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByaW1hcnlDb2xvclwiPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgY29sb3ItcGlja2VyLWJ0blwiIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoKTsgc2Vjb25kYXJ5Q29sb3JQaWNrZXIuY2xpY2soKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwic2Vjb25kYXJ5Q29sb3JcIj5mb3JtYXRfY29sb3JfdGV4dDwvbWF0LWljb24+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiICNzZWNvbmRhcnlDb2xvclBpY2tlciBjbGFzcz1cImhpZGRlbi1jb2xvci1waWNrZXJcIiAoaW5wdXQpPVwiY2hhbmdlR3JhZGllbnRDb2xvcigpXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2Vjb25kYXJ5Q29sb3JcIj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tYm94XCIgW25nU3R5bGVdPVwieyd0b3AucHgnOiBzdWdnZXN0aW9uWX1cIiBbc3R5bGUucmlnaHRdPVwicmlnaHRaZXJvID8gJzBweCcgOiAnYXV0bydcIlxyXG4gICAgW3N0eWxlLmxlZnRdPVwiIXJpZ2h0WmVybyA/ICcwcHgnIDogJ2F1dG8nXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBsYWJlbCAmJiBzaG93U3VnZ2VzdGlvblwiICNzdWdnZXN0aW9uPlxyXG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb25cIiAoY2xpY2spPVwicmVnZW5lcmF0ZVRleHQoKVwiPlxyXG4gICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvODg3NDkzYzE3NDIyNzM5NzAxNTFGcmFtZSUyMDEyNDQ4MzE3NDAucG5nXCJcclxuICAgICAgICBhbHQ9XCJcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8cCBjbGFzcz1cIm5hbWVcIj5SZWdlbmVyYXRlIFRleHQ8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJkZXNjXCI+R2V0IGEgZnJlc2ggdmFyaWF0aW9uIG9mIGEgY3VycmVudCB0ZXh0PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
551
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy90ZXh0LWVkaXRvci90ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL3RleHQtZWRpdG9yL3RleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFldkQsTUFBTSxPQUFPLG1CQUFtQjtJQWlDOUIsWUFBb0IsYUFBb0MsRUFDekIsVUFBa0IsRUFDdkMsTUFBYztRQUZKLGtCQUFhLEdBQWIsYUFBYSxDQUF1QjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ3ZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUE3QmhCLHFCQUFnQixHQUEyQixJQUFJLENBQUM7UUFFL0MsVUFBSyxHQUFXLHFDQUFxQyxDQUFDO1FBQ3JELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMxQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBSW5DLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZ0JB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QUU7Z0JBQ0MsTUFBTTtzQkFBN0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNaLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDSSxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ2tCLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHakMsS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBOZ1pvbmUsIE91dHB1dCwgUExBVEZPUk1fSUQsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbnRlbnRlZGl0YWJsZVZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmUvY29udGVudGVkaXRhYmxlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IEVsZW1lbnRTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2VkaXRvci1zZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby10ZXh0LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIENvbnRlbnRlZGl0YWJsZVZhbHVlQWNjZXNzb3IsXHJcbiAgICBNYXRJY29uTW9kdWxlXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi90ZXh0LWVkaXRvci5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGV4dEVkaXRvckNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicsIHsgc3RhdGljOiBmYWxzZSB9KSB0b29sYmFyITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdlZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSkgZWRpdG9yITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdjb2xvclBpY2tlcicpIGNvbG9yUGlja2VyITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdwYXJlbnRFbGVtZW50JykgcGFyZW50RWxlbWVudCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc3VnZ2VzdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KSBzdWdnZXN0aW9uITogRWxlbWVudFJlZjtcclxuICBwcml2YXRlIGxhc3RHcmFkaWVudFNwYW46IEhUTUxTcGFuRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nID0gJzxwPkhlbGxvIHRoaXMgaXMgcGFsYXNoIG1ha2hpamE8L3A+JztcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlY3Rpb25JZD86IHN0cmluZztcclxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcclxuXHJcbiAgc2hvdyA9IGZhbHNlO1xyXG4gIHRvb2xiYXJZID0gMDtcclxuICBzdWdnZXN0aW9uWSA9IDA7XHJcbiAgcmlnaHRaZXJvOiBib29sZWFuID0gdHJ1ZTtcclxuICBzaG93U3VnZ2VzdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRvb2xiYXJEYXRhOiBhbnkgPSB7XHJcbiAgICBzZWxlY3RlZEhlYWRpbmc6ICcnLFxyXG4gICAgaXNCb2xkOiBmYWxzZSxcclxuICAgIGlzSXRhbGljOiBmYWxzZSxcclxuICAgIGlzVW5kZXJsaW5lZDogZmFsc2UsXHJcbiAgICBzZWxlY3RlZFNpemU6ICcnLFxyXG4gICAgc2VsZWN0ZWRMaXN0OiAnJyxcclxuICAgIHNlbGVjdGVkQWxpZ25tZW50OiAnJyxcclxuICAgIHNlbGVjdGVkQ29sb3I6ICcjMDAwMDAwJ1xyXG4gIH1cclxuICBzZWxlY3RlZENvbG9yVHlwZTogJ1NPTElEJyB8ICdHUkFESUVOVCcgPSAnU09MSUQnO1xyXG4gIHByaW1hcnlDb2xvcjogc3RyaW5nID0gJyMwMDAwMDAnO1xyXG4gIHNlY29uZGFyeUNvbG9yOiBhbnkgPSAnI2JkNWY1ZmZmJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBFbGVtZW50U2VydmljZVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGlkZVRvb2xiYXIuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGlkZVRvb2xiYXIuYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RSYW5nZShyYW5nZTogUmFuZ2UpIHtcclxuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsKSByZXR1cm47XHJcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXJrU2VsZWN0aW9uKCk6IHsgc3RhcnQ6IEhUTUxFbGVtZW50OyBlbmQ6IEhUTUxFbGVtZW50IH0gfCBudWxsIHtcclxuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsIHx8IHNlbC5yYW5nZUNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgY29uc3QgZW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgc3RhcnQuc2V0QXR0cmlidXRlKCdkYXRhLXNlbC1zdGFydCcsICcxJyk7XHJcbiAgICBlbmQuc2V0QXR0cmlidXRlKCdkYXRhLXNlbC1lbmQnLCAnMScpO1xyXG4gICAgc3RhcnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4gICAgc3RhcnQuc3R5bGUud2lkdGggPSAnMCc7XHJcbiAgICBzdGFydC5zdHlsZS5oZWlnaHQgPSAnMCc7XHJcbiAgICBlbmQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4gICAgZW5kLnN0eWxlLndpZHRoID0gJzAnO1xyXG4gICAgZW5kLnN0eWxlLmhlaWdodCA9ICcwJztcclxuXHJcbiAgICBjb25zdCBlbmRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcclxuICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gYXQgZW5kXHJcbiAgICBlbmRSYW5nZS5pbnNlcnROb2RlKGVuZCk7XHJcblxyXG4gICAgY29uc3Qgc3RhcnRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcclxuICAgIHN0YXJ0UmFuZ2UuY29sbGFwc2UodHJ1ZSk7IC8vIGF0IHN0YXJ0XHJcbiAgICBzdGFydFJhbmdlLmluc2VydE5vZGUoc3RhcnQpO1xyXG5cclxuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzdG9yZVNlbGVjdGlvbkZyb21NYXJrZXJzKG1hcmtlcnM6IHsgc3RhcnQ6IEhUTUxFbGVtZW50OyBlbmQ6IEhUTUxFbGVtZW50IH0gfCBudWxsKSB7XHJcbiAgICBpZiAoIW1hcmtlcnMpIHJldHVybjtcclxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gbWFya2VycztcclxuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgbmV3UmFuZ2Uuc2V0U3RhcnRBZnRlcihzdGFydCk7XHJcbiAgICBuZXdSYW5nZS5zZXRFbmRCZWZvcmUoZW5kKTtcclxuXHJcbiAgICAvLyBDbGVhbiB1cCBtYXJrZXJzXHJcbiAgICBzdGFydC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChzdGFydCk7XHJcbiAgICBlbmQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQoZW5kKTtcclxuXHJcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWwuYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG4gICAgdGhpcy5zYXZlZFJhbmdlID0gbmV3UmFuZ2UuY2xvbmVSYW5nZSgpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBzaG93VG9vbGJhcihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpIHx8ICF0aGlzLmVkaXRhYmxlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHBhcmVudFJlY3QgPSB0aGlzLnBhcmVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHRvcEZyb21QYXJlbnQgPSByZWN0LnRvcCAtIHBhcmVudFJlY3QudG9wO1xyXG5cclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3VnZ2VzdGlvblkgPSB0b3BGcm9tUGFyZW50ICsgMzA7XHJcbiAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJykge1xyXG4gICAgICBjb25zdCB0b29sYmFyV2lkdGggPSA1NDE7XHJcblxyXG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICAgIGNvbnN0IHJpZ2h0UG9zaXRvbiA9IHZpZXdwb3J0V2lkdGggLSBwYXJlbnRSZWN0LmxlZnQ7XHJcbiAgICAgIGlmIChyaWdodFBvc2l0b24gKyB0b29sYmFyV2lkdGggPiB2aWV3cG9ydFdpZHRoKSB7XHJcbiAgICAgICAgdGhpcy5yaWdodFplcm8gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJpZ2h0WmVybyA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudG9vbGJhclkgPSB0b3BGcm9tUGFyZW50ICsgMzA7XHJcblxyXG4gICAgICB0aGlzLnJlRm9ybWF0dGluZ0RhdGEoKTtcclxuICAgICAgdGhpcy5yZWFkRm9ybWF0dGluZ1Byb3BlcnRpZXMoKTtcclxuXHJcbiAgICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbWVtYmVyU2VsZWN0aW9uKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgdGhpcy5zYXZlZFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgfVxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRBY3RpdmVSYW5nZSgpOiBSYW5nZSB8IG51bGwge1xyXG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgLy8gUHJlZmVyIHNhdmVkIGNsb25lLCBlbHNlIGxpdmUgc2VsZWN0aW9uIGNsb25lXHJcbiAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLnNhdmVkUmFuZ2VcclxuICAgICAgPz8gKHNlbCAmJiBzZWwucmFuZ2VDb3VudCA+IDAgPyBzZWwuZ2V0UmFuZ2VBdCgwKSA6IG51bGwpO1xyXG4gICAgaWYgKCFjYW5kaWRhdGUpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgcmFuZ2UgPSAoJ2Nsb25lUmFuZ2UnIGluIGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUuY2xvbmVSYW5nZSgpIDogY2FuZGlkYXRlO1xyXG4gICAgcmV0dXJuIHJhbmdlICYmICFyYW5nZS5jb2xsYXBzZWQgPyByYW5nZSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRDb2xvck1vZGUobW9kZTogJ1NPTElEJyB8ICdHUkFESUVOVCcpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb2xvclR5cGUgPSBtb2RlO1xyXG5cclxuICAgIGNvbnN0IG1hcmtlcnMgPSB0aGlzLm1hcmtTZWxlY3Rpb24oKTtcclxuICAgIGlmICghbWFya2VycykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IG1hcmtlZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIG1hcmtlZFJhbmdlLnNldFN0YXJ0QWZ0ZXIobWFya2Vycy5zdGFydCk7XHJcbiAgICBtYXJrZWRSYW5nZS5zZXRFbmRCZWZvcmUobWFya2Vycy5lbmQpO1xyXG5cclxuICAgIGlmIChtb2RlID09PSAnR1JBRElFTlQnKSB7XHJcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gYGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHt0aGlzLnByaW1hcnlDb2xvcn0gMCUsICR7dGhpcy5zZWNvbmRhcnlDb2xvcn0gMTAwJSlgO1xyXG4gICAgICB0aGlzLndyYXBSYW5nZVdpdGhHcmFkaWVudChtYXJrZWRSYW5nZSwgZ3JhZGllbnQpO1xyXG5cclxuICAgICAgbWFya2Vycy5zdGFydC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChtYXJrZXJzLnN0YXJ0KTtcclxuICAgICAgbWFya2Vycy5lbmQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQobWFya2Vycy5lbmQpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkgdGhpcy5zYXZlZFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMudW53cmFwR3JhZGllbnRJblJhbmdlKG1hcmtlZFJhbmdlKTtcclxuXHJcblxyXG4gICAgdGhpcy5yZXN0b3JlU2VsZWN0aW9uRnJvbU1hcmtlcnMobWFya2Vycyk7XHJcblxyXG5cclxuICAgIHRoaXMuc2V0U3R5bGVXaXRoQ1NTKHRydWUpO1xyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQ29sb3IgfHwgJyMwMDAwMDAnKTtcclxuXHJcbiAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsICYmIHNlbC5yYW5nZUNvdW50ID4gMCkgdGhpcy5zYXZlZFJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgd3JhcFJhbmdlV2l0aEdyYWRpZW50KHJhbmdlOiBSYW5nZSwgZ3JhZGllbnQ6IHN0cmluZykge1xyXG4gICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLWdyYWRpZW50JywgJ3RydWUnKTtcclxuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gZ3JhZGllbnQ7XHJcbiAgICBzcGFuLnN0eWxlLmJhY2tncm91bmRDbGlwID0gJ3RleHQnO1xyXG4gICAgKHNwYW4uc3R5bGUgYXMgYW55KS53ZWJraXRCYWNrZ3JvdW5kQ2xpcCA9ICd0ZXh0JztcclxuICAgIChzcGFuLnN0eWxlIGFzIGFueSkud2Via2l0VGV4dEZpbGxDb2xvciA9ICd0cmFuc3BhcmVudCc7XHJcbiAgICBzcGFuLnN0eWxlLmNvbG9yID0gJ3RyYW5zcGFyZW50JztcclxuXHJcbiAgICBjb25zdCBmcmFnID0gcmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7XHJcbiAgICBzcGFuLmFwcGVuZENoaWxkKGZyYWcpO1xyXG4gICAgcmFuZ2UuaW5zZXJ0Tm9kZShzcGFuKTtcclxuXHJcblxyXG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgc2VsPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIG5ld1JhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhzcGFuKTtcclxuICAgIHNlbD8uYWRkUmFuZ2UobmV3UmFuZ2UpO1xyXG5cclxuICAgIHRoaXMubGFzdEdyYWRpZW50U3BhbiA9IHNwYW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVud3JhcEdyYWRpZW50SW5SYW5nZShyYW5nZTogUmFuZ2UpIHtcclxuICAgIGNvbnN0IHJvb3Q6IEhUTUxFbGVtZW50ID0gdGhpcy5lZGl0b3I/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIXJvb3QpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzcGFucyA9IEFycmF5LmZyb20ocm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuW2RhdGEtZ3JhZGllbnQ9XCJ0cnVlXCJdJykpIGFzIEhUTUxFbGVtZW50W107XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IHNwYW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBzcGFuc1tpXTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocmFuZ2UuaW50ZXJzZWN0c05vZGUoc3BhbikpIHtcclxuICAgICAgICAgIHdoaWxlIChzcGFuLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgICAgICAgc3Bhbi5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoc3Bhbi5maXJzdENoaWxkLCBzcGFuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNwYW4ucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQoc3Bhbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZVRvb2xiYXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSB8fCAhdGhpcy5lZGl0YWJsZSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGVFZGl0b3IgPSB0aGlzLmVkaXRvcj8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpO1xyXG4gICAgY29uc3QgY2xpY2tlZEluc2lkZVRvb2xiYXIgPSB0aGlzLnRvb2xiYXI/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KTtcclxuICAgIGNvbnN0IGNsaWNrZWRJbnNpZGVTdWdnZXN0aW9uID0gdGhpcy5zdWdnZXN0aW9uPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XHJcblxyXG4gICAgaWYgKCFjbGlja2VkSW5zaWRlRWRpdG9yICYmICFjbGlja2VkSW5zaWRlVG9vbGJhcikge1xyXG4gICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICghY2xpY2tlZEluc2lkZUVkaXRvciAmJiAhY2xpY2tlZEluc2lkZVN1Z2dlc3Rpb24pIHtcclxuICAgICAgdGhpcy5zaG93U3VnZ2VzdGlvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0VGV4dChjb21tYW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgPSAnJykge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHZhbHVlKTtcclxuXHJcbiAgICBpZiAoY29tbWFuZCA9PT0gJ2JvbGQnKVxyXG4gICAgICB0aGlzLnRvb2xiYXJEYXRhLmlzQm9sZCA9ICF0aGlzLnRvb2xiYXJEYXRhLmlzQm9sZDtcclxuICAgIGlmIChjb21tYW5kID09PSAnaXRhbGljJylcclxuICAgICAgdGhpcy50b29sYmFyRGF0YS5pc0l0YWxpYyA9ICF0aGlzLnRvb2xiYXJEYXRhLmlzSXRhbGljO1xyXG4gICAgaWYgKGNvbW1hbmQgPT09ICd1bmRlcmxpbmUnKVxyXG4gICAgICB0aGlzLnRvb2xiYXJEYXRhLmlzVW5kZXJsaW5lZCA9ICF0aGlzLnRvb2xiYXJEYXRhLmlzVW5kZXJsaW5lZFxyXG4gICAgIGlmIChjb21tYW5kID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnIHx8IGNvbW1hbmQgPT09ICdpbnNlcnRVbm9yZGVyZWRMaXN0Jykge1xyXG4gICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZExpc3QgPSBjb21tYW5kID09PSB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkTGlzdCA/ICcnIDogY29tbWFuZDtcclxuICAgIHRoaXMudXBkYXRlRlNmb3JPTCgpXHJcbiAgICAvLyBBcHBseSBjdXJyZW50IHNpemUgdG8gdGhlIGxpc3Qgd3JhcHBlciBhbmQgaXRlbXNcclxuICB9XHJcbiAgICBpZiAoY29tbWFuZCA9PT0gJ2p1c3RpZnlMZWZ0JyB8fCBjb21tYW5kID09PSAnanVzdGlmeUNlbnRlcicgfHwgY29tbWFuZCA9PT0gJ2p1c3RpZnlSaWdodCcpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPSBjb21tYW5kID09PSB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkQWxpZ25tZW50ID8gJycgOiBjb21tYW5kO1xyXG4gICAgaWYgKGNvbW1hbmQgPT09ICdmb3JtYXRCbG9jaycpXHJcbiAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRIZWFkaW5nID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGU2Zvck9MKCl7XHJcbiAgICBjb25zdCBjc3NTaXplID0gdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZFNpemU7XHJcbiAgICBpZiAoY3NzU2l6ZSkge1xyXG4gICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWwgJiYgc2VsLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZm9jdXMgPSBzZWwuZm9jdXNOb2RlIGFzIE5vZGU7XHJcbiAgICAgICAgY29uc3QgYmFzZUVsID0gKGZvY3VzLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERVxyXG4gICAgICAgICAgPyAoZm9jdXMgYXMgRWxlbWVudClcclxuICAgICAgICAgIDogKGZvY3VzLnBhcmVudEVsZW1lbnQgYXMgRWxlbWVudCkpIHx8IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGxpc3RFbCA9IGJhc2VFbD8uY2xvc2VzdD8uKCdvbCwgdWwnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgaWYgKGxpc3RFbCkge1xyXG4gICAgICAgICAgbGlzdEVsLnN0eWxlLmZvbnRTaXplID0gY3NzU2l6ZTtcclxuICAgICAgICAgIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCdsaScpLmZvckVhY2gobGkgPT4ge1xyXG4gICAgICAgICAgICAobGkgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmZvbnRTaXplID0gY3NzU2l6ZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTdHlsZVdpdGhDU1MoZW5hYmxlOiBib29sZWFuKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3R5bGVXaXRoQ1NTJywgZmFsc2UsIGVuYWJsZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xyXG4gICAgfSBjYXRjaCB7IC8qIHNvbWUgZW5naW5lcyBpZ25vcmUgKi8gfVxyXG4gIH1cclxuICBwcml2YXRlIHRvTGVnYWN5Rm9udFN0ZXAoY3NzU2l6ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgICAgJyc6IDMsXHJcbiAgICAgICdjbGFtcCgwLjc1cmVtLCAydncsIDFyZW0pJzogMixcclxuICAgICAgJ2NsYW1wKDAuNzVyZW0sIDJ2dywgMS4yNXJlbSknOiAzLFxyXG4gICAgICAnY2xhbXAoMXJlbSwgM3Z3LCAxLjVyZW0pJzogNCxcclxuICAgICAgJ2NsYW1wKDEuMjVyZW0sIDR2dywgMnJlbSknOiA1LFxyXG4gICAgICAnY2xhbXAoMnJlbSwgNXZ3LCAzcmVtKSc6IDYsXHJcbiAgICAgICdjbGFtcCgzLjFyZW0sIDd2dywgNC41cmVtKSc6IDdcclxuICAgIH07XHJcbiAgICByZXR1cm4gU3RyaW5nKG1hcC5oYXNPd25Qcm9wZXJ0eShjc3NTaXplKSA/IG1hcFtjc3NTaXplXSA6IDMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVGb250U2l6ZVRvQ3NzKGNzc1NpemU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY29udGFpbmVyOiBIVE1MRWxlbWVudCA9IHRoaXMuZWRpdG9yPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcclxuICAgIGNvbnN0IGZvbnRzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ZvbnRbc2l6ZV0nKTtcclxuICAgIGZvbnRzLmZvckVhY2goKGZvbnRFbDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIGlmIChjc3NTaXplKSBzcGFuLnN0eWxlLmZvbnRTaXplID0gY3NzU2l6ZTtcclxuICAgICAgd2hpbGUgKGZvbnRFbC5maXJzdENoaWxkKSBzcGFuLmFwcGVuZENoaWxkKGZvbnRFbC5maXJzdENoaWxkKTtcclxuICAgICAgZm9udEVsLnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChzcGFuLCBmb250RWwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VGb250U2l6ZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjc3NTaXplID0gZXZlbnQudGFyZ2V0LnZhbHVlIGFzIHN0cmluZztcclxuXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGlmIChyYW5nZS5jb2xsYXBzZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnNldFN0eWxlV2l0aENTUyh0cnVlKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnRvTGVnYWN5Rm9udFN0ZXAoY3NzU2l6ZSk7XHJcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb250U2l6ZScsIGZhbHNlLCBzdGVwKTtcclxuXHJcbiAgICAgIHRoaXMubm9ybWFsaXplRm9udFNpemVUb0Nzcyhjc3NTaXplKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRvb2xiYXJEYXRhLnNlbGVjdGVkU2l6ZSA9IGNzc1NpemU7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNoYW5nZUNvbG9yKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlIGFzIHN0cmluZztcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcbiAgICBpZiAoc2VsZWN0aW9uLmdldFJhbmdlQXQoMCkuY29sbGFwc2VkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldFN0eWxlV2l0aENTUyh0cnVlKTtcclxuICAgICAgLy8gIHRoaXMudW53cmFwR3JhZGllbnRJblNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBjb2xvcik7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZENvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVGV4dChldmVudDogRXZlbnQpIHtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCk7XHJcbiAgfVxyXG5cclxuICBvbkZvcm1hdENoYW5nZShldmVudDogRXZlbnQpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcclxuICAgIHRoaXMuZm9ybWF0VGV4dCgnZm9ybWF0QmxvY2snLCBzZWxlY3RlZFZhbHVlKTtcclxuICB9XHJcblxyXG5cclxuICBvcGVuQ29sb3JQaWNrZXIoKSB7XHJcbiAgICB0aGlzLnNhdmVTZWxlY3Rpb24oKTtcclxuICB9XHJcblxyXG4gIHJlYWRGb3JtYXR0aW5nUHJvcGVydGllcygpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm47XHJcbiAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSBhcyBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBub2RlIGlzIG51bGxcclxuICAgIGlmICghbm9kZSkgcmV0dXJuO1xyXG5cclxuICAgIGxldCBlbGVtZW50ID0gbm9kZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgd2hpbGUgKGVsZW1lbnQpIHtcclxuICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lO1xyXG5cclxuICAgICAgaWYgKG5vZGVOYW1lID09PSAnSDEnIHx8IG5vZGVOYW1lID09PSAnSDInIHx8IG5vZGVOYW1lID09PSAnSDMnKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZEhlYWRpbmcgPSBub2RlTmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ0InIHx8IG5vZGVOYW1lID09PSAnU1RST05HJykge1xyXG4gICAgICAgIHRoaXMudG9vbGJhckRhdGEuaXNCb2xkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ0knIHx8IG5vZGVOYW1lID09PSAnRU0nKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5pc0l0YWxpYyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09ICdVJykge1xyXG4gICAgICAgIHRoaXMudG9vbGJhckRhdGEuaXNVbmRlcmxpbmVkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ09MJykge1xyXG4gICAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRMaXN0ID0gJ2luc2VydE9yZGVyZWRMaXN0JztcclxuICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gJ1VMJykge1xyXG4gICAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRMaXN0ID0gJ2luc2VydFVub3JkZXJlZExpc3QnO1xyXG4gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc3R5bGUudGV4dEFsaWduKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZEFsaWdubWVudCA9IGBqdXN0aWZ5JHtlbGVtZW50LnN0eWxlLnRleHRBbGlnbi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGVsZW1lbnQuc3R5bGUudGV4dEFsaWduLnNsaWNlKDEpfWA7XHJcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5zdHlsZS5mb250U2l6ZSkge1xyXG4gICAgICAgIHRoaXMudG9vbGJhckRhdGEuc2VsZWN0ZWRTaXplID0gZWxlbWVudC5zdHlsZS5mb250U2l6ZTtcclxuICAgICAgfSBlbHNlIGlmIChlbGVtZW50LnN0eWxlLmNvbG9yKSB7XHJcbiAgICAgICAgdGhpcy50b29sYmFyRGF0YS5zZWxlY3RlZENvbG9yID0gZWxlbWVudC5zdHlsZS5jb2xvclxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlRm9ybWF0dGluZ0RhdGEoKSB7XHJcbiAgICB0aGlzLnRvb2xiYXJEYXRhID0ge1xyXG4gICAgICBzZWxlY3RlZEhlYWRpbmc6ICcnLFxyXG4gICAgICBpc0JvbGQ6IGZhbHNlLFxyXG4gICAgICBpc0l0YWxpYzogZmFsc2UsXHJcbiAgICAgIGlzVW5kZXJsaW5lZDogZmFsc2UsXHJcbiAgICAgIHNlbGVjdGVkU2l6ZTogJycsXHJcbiAgICAgIHNlbGVjdGVkTGlzdDogJycsXHJcbiAgICAgIHNlbGVjdGVkQWxpZ25tZW50OiAnJyxcclxuICAgICAgc2VsZWN0ZWRDb2xvcjogJydcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZUdyYWRpZW50Q29sb3IoKSB7XHJcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIC8vIFJlc3RvcmUgcHJldmlvdXMgc2VsZWN0aW9uIGZpcnN0XHJcbiAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG5cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2ZVNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICBjb25zdCBncmFkaWVudCA9IGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICR7dGhpcy5wcmltYXJ5Q29sb3J9IDAlLCAke3RoaXMuc2Vjb25kYXJ5Q29sb3J9IDEwMCUpYDtcclxuICAgICAgICB0aGlzLmFwcGx5R3JhZGllbnRUb1RleHQoZ3JhZGllbnQpO1xyXG4gICAgICAgIHRoaXMucmVzdG9yZVNlbGVjdGlvbigpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9LCAxMCk7IC8vIDEwbXMgZGVsYXkgKGFkanVzdGFibGUgaWYgbmVlZGVkKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUdyYWRpZW50VG9UZXh0KGdyYWRpZW50VmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZWRpdG9yPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCFyb290KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSByb290LnF1ZXJ5U2VsZWN0b3IoJ3NwYW5bZGF0YS1ncmFkaWVudD1cInRydWVcIl0nKSBhcyBIVE1MU3BhbkVsZW1lbnQgfCBudWxsO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGV4aXN0aW5nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGdyYWRpZW50VmFsdWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBpZiAoIXJhbmdlIHx8IHJhbmdlLmNvbGxhcHNlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHJhbmdlLmV4dHJhY3RDb250ZW50cygpO1xyXG5cclxuICAgIGNvbnN0IHNwYW46IGFueSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLWdyYWRpZW50JywgJ3RydWUnKTsgLy8gbWFyayBmb3IgZnV0dXJlIHVwZGF0ZXNcclxuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZEltYWdlID0gZ3JhZGllbnRWYWx1ZTtcclxuICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZENsaXAgPSAndGV4dCc7XHJcbiAgICBzcGFuLnN0eWxlLndlYmtpdEJhY2tncm91bmRDbGlwID0gJ3RleHQnO1xyXG4gICAgc3Bhbi5zdHlsZS5jb2xvciA9ICd0cmFuc3BhcmVudCc7XHJcbiAgICBzcGFuLnN0eWxlLndlYmtpdFRleHRGaWxsQ29sb3IgPSAndHJhbnNwYXJlbnQnO1xyXG4gICAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7IC8vIGZpeCBmcm9tIGlubGluZVNpemU9J2Jsb2NrJ1xyXG5cclxuICAgIHNwYW4uYXBwZW5kQ2hpbGQoc2VsZWN0ZWRDb250ZW50KTtcclxuICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7XHJcblxyXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHNwYW4pO1xyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKG5ld1JhbmdlKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcmVnZW5lcmF0ZVRleHQoKSB7XHJcbiAgICBsZXQgcGF5bG9hZCA9IHtcclxuICAgICAgYnVzaW5lc3NJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSxcclxuICAgICAgZGF0YUlkOiB0aGlzLnNlY3Rpb25JZCxcclxuICAgICAgc3ViSW5kdXN0cnlJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1YkluZHVzdHJ5SWQnKSxcclxuICAgICAgc3VnZ2VzdGVkRGF0YVR5cGU6ICdDT01QT05FTlQnLFxyXG4gICAgICB0b25lOiAnUFJPRkVTU0lPTkFMJyxcclxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnJlZ2VuZXJhdGVUZXh0KHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHJlcy5kYXRhO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZWRSYW5nZTogUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuXHJcblxyXG4gIHNhdmVTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnNhdmVkUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlc3RvcmVTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zYXZlZFJhbmdlKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZSh0aGlzLnNhdmVkUmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBodG1sID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dC9odG1sJykgfHwgJyc7XHJcbiAgICBjb25zdCBjbGVhbkh0bWwgPSB0aGlzLnN0cmlwU3R5bGVzKGh0bWwpO1xyXG5cclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGNsZWFuSHRtbCk7XHJcbiAgfVxyXG5cclxuICBzdHJpcFN0eWxlcyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvYy5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTtcclxuICAgIGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7IC8vIFJlbW92ZSBhbGwgaW5saW5lIHN0eWxlc1xyXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7IC8vIE9wdGlvbmFsXHJcbiAgICB9KTtcclxuICAgIHJldHVybiBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0KCkge1xyXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSB0aGlzLnZhbHVlPy5yZXBsYWNlKC88XFwvP1tePl0rKD58JCkvZywgXCJcIik/LnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCkgPz8gXCJcIjtcclxuICAgIGlmICghdGV4dENvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J2JvcmRlcic6IGVkaXRhYmxlfVwiICNwYXJlbnRFbGVtZW50XHJcbiAgW2NsYXNzLmQtbm9uZV09XCIhZWRpdGFibGUgJiYgZ2V0VGV4dCgpID09ICcnXCI+XHJcbiAgPGRpdiBbY29udGVudGVkaXRhYmxlXT1cImVkaXRhYmxlXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIGNsYXNzPVwiZWRpdGFibGUtdGV4dFwiIChtb3VzZXVwKT1cInNob3dUb29sYmFyKCRldmVudClcIiAjZWRpdG9yXHJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVUZXh0KCRldmVudClcIiAobW91c2Vkb3duKT1cImhpZGVUb29sYmFyKCRldmVudClcIiAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCI+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBzaG93XCIgW25nU3R5bGVdPVwieyd0b3AucHgnOiB0b29sYmFyWX1cIlxyXG4gICAgW3N0eWxlLnJpZ2h0XT1cInJpZ2h0WmVybyA/ICcwcHgnIDogJ2F1dG8nXCIgW3N0eWxlLmxlZnRdPVwiIXJpZ2h0WmVybyA/ICcwcHgnIDogJ2F1dG8nXCIgI3Rvb2xiYXI+XHJcbiAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJ0b29sXCIgKGNoYW5nZSk9XCJvbkZvcm1hdENoYW5nZSgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJ0b29sYmFyRGF0YS5zZWxlY3RlZEhlYWRpbmdcIj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIkgxXCI+SGVhZGluZzE8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIkgyXCI+SGVhZGluZzI8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIkgzXCI+SGVhZGluZzM8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImRpdlwiPlRleHQ8L29wdGlvbj5cclxuICAgIDwvc2VsZWN0PiAtLT5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCdib2xkJylcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkVG9vbCc6IHRvb2xiYXJEYXRhLmlzQm9sZH1cIj48bWF0LWljb24+XHJcbiAgICAgICAgZm9ybWF0X2JvbGQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnaXRhbGljJylcIiBbbmdDbGFzc109XCJ7J3NlbGVjdGVkVG9vbCc6IHRvb2xiYXJEYXRhLmlzSXRhbGljfVwiPjxtYXQtaWNvbj5cclxuICAgICAgICBmb3JtYXRfaXRhbGljPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sXCIgKGNsaWNrKT1cImZvcm1hdFRleHQoJ3VuZGVybGluZScpXCJcclxuICAgICAgW25nQ2xhc3NdPVwieydzZWxlY3RlZFRvb2wnOiB0b29sYmFyRGF0YS5pc1VuZGVybGluZWR9XCJcclxuICAgICAgKm5nSWY9XCJzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ1wiPjxtYXQtaWNvbj4gZm9ybWF0X3VuZGVybGluZWQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICAgIDxzZWxlY3QgY2xhc3M9XCJ0b29sXCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250U2l6ZSgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJ0b29sYmFyRGF0YS5zZWxlY3RlZFNpemVcIj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiIHNlbGVjdGVkPkRlZmF1bHQ8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYW1wKDAuNzVyZW0sIDJ2dywgMXJlbSlcIj5TbWFsbDwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMC43NXJlbSwgMnZ3LCAxLjI1cmVtKVwiPk1lZGl1bTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMXJlbSwgM3Z3LCAxLjVyZW0pXCI+U2VtaSBMYXJnZTwvb3B0aW9uPlxyXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhbXAoMS4yNXJlbSwgNHZ3LCAycmVtKVwiPkxhcmdlPC9vcHRpb24+XHJcbiAgICAgIDxvcHRpb24gdmFsdWU9XCJjbGFtcCgycmVtLCA1dncsIDNyZW0pXCI+RXh0cmEgTGFyZ2U8L29wdGlvbj5cclxuICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYW1wKDMuMXJlbSwgN3Z3LCA0LjVyZW0pXCI+SHVnZTwvb3B0aW9uPlxyXG4gICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnaW5zZXJ0T3JkZXJlZExpc3QnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRMaXN0ID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnfVwiPjxtYXQtaWNvbj5mb3JtYXRfbGlzdF9udW1iZXJlZDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkVG9vbCc6IHRvb2xiYXJEYXRhLnNlbGVjdGVkTGlzdCA9PT0gJ2luc2VydFVub3JkZXJlZExpc3QnfVwiPjxtYXQtaWNvbj5cclxuICAgICAgICBmb3JtYXRfbGlzdF9idWxsZXRlZDwvbWF0LWljb24+PC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xcIiAoY2xpY2spPVwiZm9ybWF0VGV4dCgnanVzdGlmeUxlZnQnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5TGVmdCd9XCI+PG1hdC1pY29uPlxyXG4gICAgICAgIGZvcm1hdF9hbGlnbl9sZWZ0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sXCIgKGNsaWNrKT1cImZvcm1hdFRleHQoJ2p1c3RpZnlDZW50ZXInKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5Q2VudGVyJ31cIj48bWF0LWljb24+XHJcbiAgICAgICAgZm9ybWF0X2FsaWduX2NlbnRlcjwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbFwiIChjbGljayk9XCJmb3JtYXRUZXh0KCdqdXN0aWZ5UmlnaHQnKVwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRUb29sJzogdG9vbGJhckRhdGEuc2VsZWN0ZWRBbGlnbm1lbnQgPT09ICdqdXN0aWZ5UmlnaHQnfVwiPjxtYXQtaWNvbj5cclxuICAgICAgICBmb3JtYXRfYWxpZ25fcmlnaHQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInNvbGlkXCIgW25nQ2xhc3NdPVwieydzb2xpZENvbG9yU2VsZWN0ZWQnOiBzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ31cIlxyXG4gICAgICAgIChtb3VzZWRvd24pPVwicmVtZW1iZXJTZWxlY3Rpb24oJGV2ZW50KVwiIChjbGljayk9XCJzZXRDb2xvck1vZGUoJ1NPTElEJylcIj5cclxuICAgICAgICBTb2xpZFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImdyYWRpZW50XCIgW25nQ2xhc3NdPVwieydncmFkaWVudENvbG9yU2VsZWN0ZWQnOiBzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ0dSQURJRU5UJ31cIlxyXG4gICAgICAgIChtb3VzZWRvd24pPVwicmVtZW1iZXJTZWxlY3Rpb24oJGV2ZW50KVwiIChjbGljayk9XCJzZXRDb2xvck1vZGUoJ0dSQURJRU5UJylcIj5cclxuICAgICAgICBHcmFkaWVudFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbCBjb2xvci1waWNrZXItYnRuXCIgKGNsaWNrKT1cIm9wZW5Db2xvclBpY2tlcigpXCIgKm5nSWY9XCJzZWxlY3RlZENvbG9yVHlwZSA9PT0gJ1NPTElEJ1wiPlxyXG4gICAgICA8bWF0LWljb24+Zm9ybWF0X2NvbG9yX3RleHQ8L21hdC1pY29uPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgI2NvbG9yUGlja2VyIGNsYXNzPVwiaGlkZGVuLWNvbG9yLXBpY2tlclwiIChpbnB1dCk9XCJjaGFuZ2VDb2xvcigkZXZlbnQpXCJcclxuICAgICAgICBbKG5nTW9kZWwpXT1cInRvb2xiYXJEYXRhLnNlbGVjdGVkQ29sb3JcIj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xvclR5cGVcIiAqbmdJZj1cInNlbGVjdGVkQ29sb3JUeXBlID09PSAnR1JBRElFTlQnXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sIGNvbG9yLXBpY2tlci1idG5cIiAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCk7IHByaW1hcnlDb2xvclBpY2tlci5jbGljaygpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJwcmltYXJ5Q29sb3JcIj5mb3JtYXRfY29sb3JfdGV4dDwvbWF0LWljb24+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiICNwcmltYXJ5Q29sb3JQaWNrZXIgY2xhc3M9XCJoaWRkZW4tY29sb3ItcGlja2VyXCIgKGlucHV0KT1cImNoYW5nZUdyYWRpZW50Q29sb3IoKVwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByaW1hcnlDb2xvclwiPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInRvb2wgY29sb3ItcGlja2VyLWJ0blwiIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoKTsgc2Vjb25kYXJ5Q29sb3JQaWNrZXIuY2xpY2soKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbiBbc3R5bGUuY29sb3JdPVwic2Vjb25kYXJ5Q29sb3JcIj5mb3JtYXRfY29sb3JfdGV4dDwvbWF0LWljb24+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiICNzZWNvbmRhcnlDb2xvclBpY2tlciBjbGFzcz1cImhpZGRlbi1jb2xvci1waWNrZXJcIiAoaW5wdXQpPVwiY2hhbmdlR3JhZGllbnRDb2xvcigpXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwic2Vjb25kYXJ5Q29sb3JcIj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tYm94XCIgW25nU3R5bGVdPVwieyd0b3AucHgnOiBzdWdnZXN0aW9uWX1cIiBbc3R5bGUucmlnaHRdPVwicmlnaHRaZXJvID8gJzBweCcgOiAnYXV0bydcIlxyXG4gICAgW3N0eWxlLmxlZnRdPVwiIXJpZ2h0WmVybyA/ICcwcHgnIDogJ2F1dG8nXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBsYWJlbCAmJiBzaG93U3VnZ2VzdGlvblwiICNzdWdnZXN0aW9uPlxyXG4gICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb25cIiAoY2xpY2spPVwicmVnZW5lcmF0ZVRleHQoKVwiPlxyXG4gICAgICA8aW1nIHNyYz1cImh0dHBzOi8vcHJvZC1zaW1wby5zMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20vcHJvZC1pbWFnZXMvODg3NDkzYzE3NDIyNzM5NzAxNTFGcmFtZSUyMDEyNDQ4MzE3NDAucG5nXCJcclxuICAgICAgICBhbHQ9XCJcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8cCBjbGFzcz1cIm5hbWVcIj5SZWdlbmVyYXRlIFRleHQ8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJkZXNjXCI+R2V0IGEgZnJlc2ggdmFyaWF0aW9uIG9mIGEgY3VycmVudCB0ZXh0PC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=