@visuno/angular 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,1755 @@
1
+ // framework/angular/rich-text-editor/rich-text-editor.component.ts
2
+ //
3
+ // Native Angular port of framework/react/rich-text-editor/RichTextEditor.tsx
4
+ // (engine from framework/vanilla/rich-text-editor/rich-text-editor.js).
5
+ //
6
+ // A minimal editor for a draft an agent helps with: a formatting toolbar, a
7
+ // native contenteditable body, and a quiet foot with the word count and undo.
8
+ // Select text and press Ask AI (or Mod+J, or type / on a new line), and a
9
+ // suggestion streams in beside the text — the old words struck through, the new
10
+ // ones arriving word by word — to accept with Tab/Enter or discard with Escape.
11
+ //
12
+ // The editing engine is ported verbatim from the React `createEngine` into the
13
+ // `RteEngine` class below; the component drives a native contenteditable div via
14
+ // @ViewChild/ElementRef exactly as the React code drives its `ed` ref. Setup in
15
+ // ngAfterViewInit, cleanup in ngOnDestroy. Reduced motion via ReducedMotionService.
16
+ //
17
+ // Icon substitutions (the shared Angular icon set has no heading/bold/italic/
18
+ // code/link/list/quote/wand glyphs, so the closest available are used):
19
+ // heading -> file-text bold -> edit italic -> pr code -> term
20
+ // link -> ext bulleted list -> more numbered list -> more
21
+ // quote -> comment wand (Improve) -> spark
22
+ // The remaining icons (spark, minus, check, edit, undo, redo, trash) map 1:1.
23
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
24
+ import { VoIconComponent } from '../core/icon.component';
25
+ import { ReducedMotionService } from '../core/reduced-motion.service';
26
+ import * as i0 from "@angular/core";
27
+ const LEAF = 'p,h2,blockquote,li';
28
+ const BLOCK = /^(P|DIV|H[1-6]|LI|BLOCKQUOTE|PRE|TR|DT|DD|SECTION|ARTICLE|HEADER|FOOTER|ASIDE|MAIN|NAV|FIGURE|FIGCAPTION|UL|OL|DL|TABLE|TBODY|THEAD|TFOOT|ADDRESS|HR)$/;
29
+ const SKIP = /^(SCRIPT|STYLE|TEMPLATE|HEAD|META|LINK|TITLE|IFRAME|OBJECT|EMBED|SVG|MATH|IMG|PICTURE|VIDEO|AUDIO|CANVAS|NOSCRIPT|BUTTON|INPUT|SELECT|TEXTAREA|OPTION)$/;
30
+ const isMac = () => typeof navigator !== 'undefined' && /Mac|iP(hone|ad|od)/.test(navigator.platform || navigator.userAgent);
31
+ const safeUrl = (h) => { const v = (h || '').trim(); return /^(https?:\/\/|mailto:)/i.test(v) ? v : null; };
32
+ /* ---------- the editing engine ----------
33
+ The text is a list of lines (paragraphs, a heading, list items and quote lines) holding bold, italic, inline code and links,
34
+ and every change goes through it: Enter, Backspace at a line's start, formats, paste and drop, so pasted or browser-made
35
+ markup is cleaned into those few tags. Undo and redo step through its own history. A selection is kept as two numbers, the
36
+ characters before each end with a line break counting one, so it survives every rebuild, and the editor works the same with
37
+ or without the focus (a story types into it without taking the focus from the page). Ported verbatim from the React engine. */
38
+ class RteEngine {
39
+ constructor(ed, hook) {
40
+ this.offs = [];
41
+ this.caret = null;
42
+ this.pend = null;
43
+ this.rev = null;
44
+ this.H = { list: [], at: 0, dirty: false, pre: null, t: 0 };
45
+ this.ed = ed;
46
+ this.hook = hook;
47
+ const on = (el, ev, fn) => { el.addEventListener(ev, fn); this.offs.push(() => el.removeEventListener(ev, fn)); };
48
+ on(ed, 'beforeinput', (e) => this.onBeforeInput(e));
49
+ on(ed, 'input', ((e) => { if (this.rev)
50
+ return; if (this.messy())
51
+ this.clean(); this.typed(this.H.pre); this.hook.input?.(e); }));
52
+ on(ed, 'paste', (e) => {
53
+ e.preventDefault();
54
+ if (this.rev || !e.clipboardData)
55
+ return;
56
+ const h = e.clipboardData.getData('text/html'), s = e.clipboardData.getData('text/plain');
57
+ let items = h ? this.parse(new DOMParser().parseFromString(h, 'text/html').body, false) : [];
58
+ if (!items.length)
59
+ items = this.plain(s);
60
+ if (!items.length)
61
+ return;
62
+ this.flush();
63
+ const o = this.get(), at = this.insertLines(items, o);
64
+ this.set({ s: at, e: at });
65
+ this.commit(o);
66
+ });
67
+ on(ed, 'cut', (e) => {
68
+ e.preventDefault();
69
+ if (this.rev || !e.clipboardData)
70
+ return;
71
+ const o = this.get();
72
+ if (o.s === o.e)
73
+ return;
74
+ const g = this.live();
75
+ e.clipboardData.setData('text/plain', this.text(o));
76
+ if (g) {
77
+ const d = document.createElement('div');
78
+ d.appendChild(g.cloneContents());
79
+ e.clipboardData.setData('text/html', d.innerHTML);
80
+ }
81
+ this.flush();
82
+ const p = this.del(o);
83
+ this.set(p);
84
+ this.commit(o);
85
+ });
86
+ on(ed, 'dragstart', (e) => e.preventDefault());
87
+ on(ed, 'drop', (e) => this.onDrop(e));
88
+ on(ed, 'keydown', (e) => this.onKeyDown(e));
89
+ on(document, 'selectionchange', () => {
90
+ if (!this.live() || this.rev)
91
+ return;
92
+ this.caret = this.get();
93
+ if (this.pend && (this.caret.s !== this.pend.at || this.caret.e !== this.pend.at))
94
+ this.pend = null;
95
+ this.hook.select?.();
96
+ });
97
+ this.tidy();
98
+ this.H.list = [{ html: ed.innerHTML, sel: { s: 0, e: 0 }, pre: null }];
99
+ }
100
+ // ---- lines and offsets ----
101
+ lines() { return [...this.ed.querySelectorAll(LEAF)]; }
102
+ typeOf(b) { return b.tagName === 'LI' ? b.parentNode.tagName.toLowerCase() : b.tagName === 'BLOCKQUOTE' ? 'quote' : b.tagName.toLowerCase(); }
103
+ lineOf(n) { for (let x = n; x && x !== this.ed; x = x.parentNode)
104
+ if (x.nodeType === 1 && x.matches(LEAF))
105
+ return x; return null; }
106
+ len(b) { return (b.textContent || '').length; }
107
+ total() { return this.lines().reduce((n, b, i) => n + this.len(b) + (i ? 1 : 0), 0); }
108
+ startOf(i) { return this.lines().slice(0, i).reduce((n, b) => n + this.len(b) + 1, 0); }
109
+ lineAt(at) { const all = this.lines(); let n = 0; for (let i = 0; i < all.length; i++) {
110
+ if (at <= n + this.len(all[i]))
111
+ return i;
112
+ n += this.len(all[i]) + 1;
113
+ } return all.length - 1; }
114
+ text(o) { return this.lines().map(b => b.textContent).join('\n').slice(o.s, o.e); }
115
+ up(n, tag) { for (let x = n && n.nodeType === 3 ? n.parentNode : n; x && x !== this.ed && x.nodeType === 1 && !x.matches(LEAF); x = x.parentNode)
116
+ if (x.tagName === tag)
117
+ return x; return null; }
118
+ wrap(n, tag, href) { const w = document.createElement(tag.toLowerCase()); if (href)
119
+ w.setAttribute('href', href); n.replaceWith(w); w.appendChild(n); return w; }
120
+ unwrap(el) { el.replaceWith(...el.childNodes); }
121
+ offsetOf(node, off) {
122
+ let b = this.lineOf(node);
123
+ if (!b) {
124
+ if (!this.ed.contains(node))
125
+ return 0;
126
+ const after = node.childNodes[off], first = after && after.nodeType === 1 ? (after.matches(LEAF) ? after : after.querySelector(LEAF)) : null;
127
+ if (!first)
128
+ return this.total();
129
+ b = first;
130
+ node = first;
131
+ off = 0;
132
+ }
133
+ let n = 0;
134
+ for (const x of this.lines()) {
135
+ if (x === b)
136
+ break;
137
+ n += this.len(x) + 1;
138
+ }
139
+ const rg = document.createRange();
140
+ rg.setStart(b, 0);
141
+ rg.setEnd(node, off);
142
+ return n + rg.toString().length;
143
+ }
144
+ pointAt(at, late = false) {
145
+ const all = this.lines();
146
+ let n = Math.max(0, at);
147
+ for (let i = 0; i < all.length; i++) {
148
+ const b = all[i];
149
+ if (n <= this.len(b) || i === all.length - 1) {
150
+ n = Math.min(n, this.len(b));
151
+ const w = document.createTreeWalker(b, NodeFilter.SHOW_TEXT);
152
+ let t, last = null;
153
+ while ((t = w.nextNode())) {
154
+ if (late ? n < t.data.length : n <= t.data.length)
155
+ return [t, n];
156
+ n -= t.data.length;
157
+ last = t;
158
+ }
159
+ return last ? [last, last.data.length] : [b, 0];
160
+ }
161
+ n -= this.len(b) + 1;
162
+ }
163
+ return [this.ed, 0];
164
+ }
165
+ range(o) { const [a, ao] = this.pointAt(o.s, o.s !== o.e), [b, bo] = this.pointAt(o.e); const rg = document.createRange(); rg.setStart(a, ao); rg.setEnd(b, bo); return rg; }
166
+ showRange(x) {
167
+ const r = x.getBoundingClientRect(), b = this.ed.getBoundingClientRect();
168
+ if (!r.height)
169
+ return;
170
+ if (r.bottom > b.bottom - 12)
171
+ this.ed.scrollTop += Math.min(r.bottom - b.bottom + 12, r.top - b.top - 12);
172
+ else if (r.top < b.top + 12)
173
+ this.ed.scrollTop -= b.top + 12 - r.top;
174
+ }
175
+ // ---- selection ----
176
+ live() { const s = getSelection(); if (!s || !s.rangeCount)
177
+ return null; const g = s.getRangeAt(0); return this.ed.contains(g.startContainer) && this.ed.contains(g.endContainer) ? g : null; }
178
+ get() {
179
+ const g = this.live();
180
+ if (g) {
181
+ const a = this.offsetOf(g.startContainer, g.startOffset), b = this.offsetOf(g.endContainer, g.endOffset);
182
+ return { s: Math.min(a, b), e: Math.max(a, b) };
183
+ }
184
+ if (!this.caret) {
185
+ const t = this.total();
186
+ this.caret = { s: t, e: t };
187
+ }
188
+ return { s: this.caret.s, e: this.caret.e };
189
+ }
190
+ set(o, focus = false) {
191
+ this.caret = { s: o.s, e: o.e };
192
+ if (focus && document.activeElement !== this.ed)
193
+ this.ed.focus({ preventScroll: true });
194
+ if (document.activeElement !== this.ed)
195
+ return;
196
+ const s = getSelection();
197
+ if (!s)
198
+ return;
199
+ s.removeAllRanges();
200
+ s.addRange(this.range(o));
201
+ }
202
+ // ---- tidying ----
203
+ tidy() {
204
+ for (const el of this.ed.querySelectorAll('b,i,code,a')) {
205
+ if (!el.isConnected)
206
+ continue;
207
+ if (!el.textContent) {
208
+ el.remove();
209
+ continue;
210
+ }
211
+ if (this.up(el.parentNode, el.tagName))
212
+ this.unwrap(el);
213
+ }
214
+ for (const el of this.ed.querySelectorAll('b,i,code,a')) {
215
+ if (!el.isConnected)
216
+ continue;
217
+ for (;;) {
218
+ let nx = el.nextSibling;
219
+ while (nx && nx.nodeType === 3 && !nx.data) {
220
+ const d = nx;
221
+ nx = nx.nextSibling;
222
+ d.remove();
223
+ }
224
+ if (!nx || nx.nodeType !== 1 || nx.tagName !== el.tagName || nx.getAttribute('href') !== el.getAttribute('href'))
225
+ break;
226
+ el.append(...nx.childNodes);
227
+ nx.remove();
228
+ }
229
+ }
230
+ for (const b of this.lines()) {
231
+ const br = [...b.querySelectorAll('br')];
232
+ if (b.textContent)
233
+ br.forEach(x => x.remove());
234
+ else if (!br.length)
235
+ b.appendChild(document.createElement('br'));
236
+ else
237
+ br.slice(1).forEach(x => x.remove());
238
+ }
239
+ if (!this.lines().length) {
240
+ const p = document.createElement('p');
241
+ p.appendChild(document.createElement('br'));
242
+ this.ed.replaceChildren(p);
243
+ }
244
+ this.ed.normalize();
245
+ }
246
+ rebuild(spec) {
247
+ const frag = document.createDocumentFragment();
248
+ let list = null;
249
+ for (const [t, b] of spec) {
250
+ const el = document.createElement(t === 'quote' ? 'blockquote' : t === 'ul' || t === 'ol' ? 'li' : t);
251
+ el.append(...b.childNodes);
252
+ if (t === 'ul' || t === 'ol') {
253
+ if (!list || list.tagName.toLowerCase() !== t)
254
+ frag.appendChild(list = document.createElement(t));
255
+ list.appendChild(el);
256
+ }
257
+ else {
258
+ list = null;
259
+ frag.appendChild(el);
260
+ }
261
+ }
262
+ this.ed.replaceChildren(frag);
263
+ this.tidy();
264
+ }
265
+ specOf() { return this.lines().map(b => [this.typeOf(b), b]); }
266
+ messy() {
267
+ for (const n of this.ed.childNodes) {
268
+ if (n.nodeType === 3 ? n.data.trim() : n.nodeType === 1 && !/^(P|H2|BLOCKQUOTE|UL|OL)$/.test(n.tagName))
269
+ return true;
270
+ if (n.nodeType === 1 && /^(UL|OL)$/.test(n.tagName) && [...n.childNodes].some(x => x.nodeType !== 1 || x.tagName !== 'LI'))
271
+ return true;
272
+ }
273
+ return !!this.ed.querySelector('[style],[class],span,font,div,a:not([href]),:is(p,h2,blockquote,li) :not(b,i,code,a,br)');
274
+ }
275
+ // ---- parse ----
276
+ parse(root, keep) {
277
+ const out = [];
278
+ let cur = null;
279
+ const walk = (node, t, pre, marks) => {
280
+ for (const n of node.childNodes) {
281
+ if (n.nodeType === 3) {
282
+ const d = n.data;
283
+ let s = keep ? d : pre ? d.replace(/\r\n?/g, '\n') : d.replace(/[\s ]+/g, ' ');
284
+ if (!keep)
285
+ s = s.replace(/ /g, ' ');
286
+ if (!cur && !s.trim() && (node === root || /^(UL|OL|DL|TABLE|TBODY|THEAD|TFOOT|TR)$/.test(node.tagName)))
287
+ continue;
288
+ (pre && !keep ? s.split('\n') : [s]).forEach((p, i) => {
289
+ if (i)
290
+ cur = null;
291
+ if (!p || (!cur && !keep && !p.trim()))
292
+ return;
293
+ if (!cur)
294
+ out.push(cur = { t, frag: document.createDocumentFragment() });
295
+ let x = document.createTextNode(p);
296
+ for (let m = marks.length - 1; m >= 0; m--) {
297
+ const w = document.createElement(marks[m][0].toLowerCase());
298
+ if (marks[m][1])
299
+ w.setAttribute('href', marks[m][1]);
300
+ w.appendChild(x);
301
+ x = w;
302
+ }
303
+ cur.frag.appendChild(x);
304
+ });
305
+ continue;
306
+ }
307
+ if (n.nodeType !== 1)
308
+ continue;
309
+ const el = n, tg = el.tagName;
310
+ if (SKIP.test(tg) || el.classList.contains('vo-rte-new'))
311
+ continue;
312
+ const css = (el.getAttribute('style') || '').toLowerCase();
313
+ if (tg === 'BR') {
314
+ cur = null;
315
+ continue;
316
+ }
317
+ if (BLOCK.test(tg)) {
318
+ const nt = /^H[1-6]$/.test(tg) ? 'h2' : tg === 'LI' ? (el.parentElement && el.parentElement.tagName === 'OL' ? 'ol' : 'ul') : tg === 'BLOCKQUOTE' ? 'quote' : t;
319
+ cur = null;
320
+ const was = out.length;
321
+ walk(el, nt, pre || tg === 'PRE', marks);
322
+ if (keep && out.length === was && !el.querySelector('p,div,h1,h2,h3,h4,h5,h6,li,blockquote,pre,ul,ol'))
323
+ out.push({ t: nt, frag: document.createDocumentFragment() });
324
+ cur = null;
325
+ continue;
326
+ }
327
+ let m = marks;
328
+ const add = (tag, href) => { if (!m.some(x => x[0] === tag))
329
+ m = [...m, [tag, href]]; };
330
+ if (tg === 'B' || tg === 'STRONG' ? !/font-weight\s*:\s*(normal|[1-4]00)/.test(css) : /font-weight\s*:\s*(bold|[6-9]00)/.test(css))
331
+ add('B');
332
+ if (tg === 'I' || tg === 'EM' || /font-style\s*:\s*italic/.test(css))
333
+ add('I');
334
+ if (/^(CODE|KBD|SAMP|TT)$/.test(tg))
335
+ add('CODE');
336
+ if (tg === 'A') {
337
+ const h = safeUrl(el.getAttribute('href'));
338
+ if (h)
339
+ add('A', h);
340
+ }
341
+ walk(el, t, pre, m);
342
+ }
343
+ };
344
+ walk(root, 'p', false, []);
345
+ if (!keep)
346
+ for (const x of out) {
347
+ const ts = [], w = document.createTreeWalker(x.frag, NodeFilter.SHOW_TEXT);
348
+ let t;
349
+ while ((t = w.nextNode()))
350
+ ts.push(t);
351
+ if (ts.length) {
352
+ ts[0].data = ts[0].data.replace(/^\s+/, '');
353
+ ts[ts.length - 1].data = ts[ts.length - 1].data.replace(/\s+$/, '');
354
+ }
355
+ }
356
+ return out.filter(x => keep || x.frag.textContent).map(x => ({ ...x, len: (x.frag.textContent || '').length }));
357
+ }
358
+ plain(s) { return s.replace(/\r\n?/g, '\n').split('\n').filter(l => l.trim()).map(l => { const frag = document.createDocumentFragment(); frag.append(l); return { t: 'p', frag, len: l.length }; }); }
359
+ clean() { const o = this.get(); this.rebuild(this.parse(this.ed, true).map(x => [x.t, x.frag])); this.set(o); }
360
+ // ---- history ----
361
+ changed() { this.hook.change?.(); }
362
+ commit(pre) {
363
+ clearTimeout(this.H.t);
364
+ const html = this.ed.innerHTML, top = this.H.list[this.H.at], before = this.H.pre || pre || null;
365
+ this.H.dirty = false;
366
+ this.H.pre = null;
367
+ if (!top || top.html !== html) {
368
+ this.H.list.splice(this.H.at + 1);
369
+ this.H.list.push({ html, sel: this.get(), pre: before });
370
+ if (this.H.list.length > 300)
371
+ this.H.list.shift();
372
+ this.H.at = this.H.list.length - 1;
373
+ }
374
+ this.changed();
375
+ }
376
+ flush() { if (this.H.dirty)
377
+ this.commit(); }
378
+ typed(pre) { if (!this.H.dirty) {
379
+ this.H.pre = pre || null;
380
+ this.H.list.splice(this.H.at + 1);
381
+ } this.H.dirty = true; clearTimeout(this.H.t); this.H.t = setTimeout(() => this.commit(), 700); this.changed(); }
382
+ restore(html, sel) { this.ed.innerHTML = html; this.pend = null; this.set(sel || { s: 0, e: 0 }); this.changed(); }
383
+ undo() { this.flush(); if (this.H.at <= 0)
384
+ return; const cur = this.H.list[this.H.at]; this.H.at--; this.restore(this.H.list[this.H.at].html, cur.pre || this.H.list[this.H.at].sel); }
385
+ redo() { this.flush(); if (this.H.at >= this.H.list.length - 1)
386
+ return; this.H.at++; this.restore(this.H.list[this.H.at].html, this.H.list[this.H.at].sel); }
387
+ load(html) {
388
+ const t = document.createElement('template');
389
+ t.innerHTML = html || '';
390
+ this.rebuild(this.parse(t.content, false).map(x => [x.t, x.frag]));
391
+ this.caret = null;
392
+ this.pend = null;
393
+ this.rev = null;
394
+ this.H.list = [{ html: this.ed.innerHTML, sel: { s: 0, e: 0 }, pre: null }];
395
+ this.H.at = 0;
396
+ this.H.dirty = false;
397
+ clearTimeout(this.H.t);
398
+ this.changed();
399
+ }
400
+ // ---- edits ----
401
+ texts() { const out = []; let n = 0; this.lines().forEach((b, i) => { if (i)
402
+ n++; const w = document.createTreeWalker(b, NodeFilter.SHOW_TEXT); let t; while ((t = w.nextNode())) {
403
+ out.push([t, n]);
404
+ n += t.data.length;
405
+ } }); return out; }
406
+ cut(at) { for (const [t, n] of this.texts())
407
+ if (at > n && at < n + t.data.length) {
408
+ t.splitText(at - n);
409
+ return;
410
+ } }
411
+ covered(o) { this.cut(o.e); this.cut(o.s); return this.texts().filter(([t, n]) => t.data.length && n >= o.s && n + t.data.length <= o.e).map(x => x[0]); }
412
+ has(tag, o) {
413
+ if (o.s === o.e) {
414
+ if (this.pend && this.pend.at === o.s && tag in this.pend.m)
415
+ return this.pend.m[tag];
416
+ const g = this.live();
417
+ return !!this.up(g && g.collapsed ? g.startContainer : this.pointAt(o.s)[0], tag);
418
+ }
419
+ const ts = this.texts().filter(([t, n]) => t.data.length && n < o.e && n + t.data.length > o.s);
420
+ return ts.length > 0 && ts.every(([t]) => this.up(t, tag));
421
+ }
422
+ inline(tag, href, o = this.get()) {
423
+ if (o.s === o.e) {
424
+ if (tag === 'A')
425
+ return;
426
+ if (!this.pend || this.pend.at !== o.s)
427
+ this.pend = { at: o.s, m: {} };
428
+ this.pend.m[tag] = !this.has(tag, o);
429
+ this.changed();
430
+ return;
431
+ }
432
+ this.flush();
433
+ const ts = this.covered(o);
434
+ if (!ts.length)
435
+ return;
436
+ const add = href !== undefined ? href !== null : !ts.every(t => this.up(t, tag));
437
+ if (add)
438
+ ts.forEach(t => { const had = this.up(t, tag); if (!had)
439
+ this.wrap(t, tag, href);
440
+ else if (href)
441
+ had.setAttribute('href', href); });
442
+ else
443
+ new Set(ts.map(t => this.up(t, tag))).forEach(el => {
444
+ if (!el)
445
+ return;
446
+ const keep = [], w = document.createTreeWalker(el, NodeFilter.SHOW_TEXT), h = el.getAttribute('href');
447
+ let t;
448
+ while ((t = w.nextNode()))
449
+ if (!ts.includes(t))
450
+ keep.push(t);
451
+ this.unwrap(el);
452
+ keep.forEach(x => this.wrap(x, tag, h));
453
+ });
454
+ this.tidy();
455
+ this.set(o);
456
+ this.commit(o);
457
+ }
458
+ typeStyled(s) {
459
+ const o = this.get(), m = this.pend.m;
460
+ this.pend = null;
461
+ const g = this.live(), [n, k] = g && g.collapsed ? [g.startContainer, g.startOffset] : this.pointAt(o.s);
462
+ const rg = document.createRange();
463
+ rg.setStart(n, k);
464
+ rg.collapse(true);
465
+ for (const tag of Object.keys(m))
466
+ if (!m[tag]) {
467
+ const el = this.up(rg.startContainer, tag);
468
+ if (!el)
469
+ continue;
470
+ const tail = document.createRange();
471
+ tail.setStart(rg.startContainer, rg.startOffset);
472
+ tail.setEndAfter(el);
473
+ el.after(tail.extractContents());
474
+ rg.setStartAfter(el);
475
+ rg.collapse(true);
476
+ }
477
+ let x = document.createTextNode(s);
478
+ for (const tag of Object.keys(m))
479
+ if (m[tag] && !this.up(rg.startContainer, tag)) {
480
+ const w = document.createElement(tag.toLowerCase());
481
+ w.appendChild(x);
482
+ x = w;
483
+ }
484
+ rg.insertNode(x);
485
+ this.tidy();
486
+ this.set({ s: o.s + s.length, e: o.s + s.length });
487
+ this.typed(o);
488
+ }
489
+ block(type, o = this.get()) {
490
+ this.flush();
491
+ const all = this.lines(), a = this.lineAt(o.s), z = this.lineAt(o.e);
492
+ const to = all.slice(a, z + 1).every(b => this.typeOf(b) === type) ? 'p' : type;
493
+ this.rebuild(all.map((b, i) => [i >= a && i <= z ? to : this.typeOf(b), b]));
494
+ this.set(o);
495
+ this.commit(o);
496
+ }
497
+ del(o) {
498
+ const all = this.lines(), i = this.lineAt(o.s), j = this.lineAt(o.e), [a, ao] = this.pointAt(o.s, true), [b, bo] = this.pointAt(o.e);
499
+ if (i === j) {
500
+ const rg = document.createRange();
501
+ rg.setStart(a, ao);
502
+ rg.setEnd(b, bo);
503
+ rg.deleteContents();
504
+ this.tidy();
505
+ return { s: o.s, e: o.s };
506
+ }
507
+ const head = document.createRange();
508
+ head.setStart(a, ao);
509
+ head.setEnd(all[i], all[i].childNodes.length);
510
+ head.deleteContents();
511
+ const tail = document.createRange();
512
+ tail.setStart(all[j], 0);
513
+ tail.setEnd(b, bo);
514
+ tail.deleteContents();
515
+ all[i].append(...all[j].childNodes);
516
+ this.rebuild(all.filter((_, k) => k <= i || k > j).map((x) => [this.typeOf(x), x]));
517
+ return { s: o.s, e: o.s };
518
+ }
519
+ split(o = this.get()) {
520
+ this.flush();
521
+ const pre = o;
522
+ if (o.s !== o.e)
523
+ o = this.del(o);
524
+ const all = this.lines(), i = this.lineAt(o.s), b = all[i], t = this.typeOf(b), spec = this.specOf(), next = t === 'h2' ? 'p' : t;
525
+ if (!this.len(b) && t !== 'p') {
526
+ spec[i][0] = 'p';
527
+ this.rebuild(spec);
528
+ this.set(o);
529
+ this.commit(pre);
530
+ return;
531
+ }
532
+ if (this.len(b) && o.s === this.startOf(i)) {
533
+ spec.splice(i, 0, [next, document.createElement('p')]);
534
+ this.rebuild(spec);
535
+ this.set({ s: o.s + 1, e: o.s + 1 });
536
+ this.commit(pre);
537
+ return;
538
+ }
539
+ const [n, k] = this.pointAt(o.s), rg = document.createRange();
540
+ rg.setStart(n, k);
541
+ rg.setEnd(b, b.childNodes.length);
542
+ const nb = document.createElement('p');
543
+ nb.appendChild(rg.extractContents());
544
+ spec.splice(i + 1, 0, [next, nb]);
545
+ this.rebuild(spec);
546
+ this.set({ s: o.s + 1, e: o.s + 1 });
547
+ this.commit(pre);
548
+ }
549
+ joinBack(o) {
550
+ const all = this.lines(), i = this.lineAt(o.s), spec = this.specOf();
551
+ if (spec[i][0] !== 'p') {
552
+ spec[i][0] = 'p';
553
+ this.rebuild(spec);
554
+ this.set(o);
555
+ this.commit(o);
556
+ return;
557
+ }
558
+ if (!i)
559
+ return;
560
+ all[i - 1].append(...all[i].childNodes);
561
+ spec.splice(i, 1);
562
+ this.rebuild(spec);
563
+ this.set({ s: o.s - 1, e: o.s - 1 });
564
+ this.commit(o);
565
+ }
566
+ joinNext(o) {
567
+ const all = this.lines(), i = this.lineAt(o.s), spec = this.specOf();
568
+ if (i >= all.length - 1)
569
+ return;
570
+ all[i].append(...all[i + 1].childNodes);
571
+ spec.splice(i + 1, 1);
572
+ this.rebuild(spec);
573
+ this.set(o);
574
+ this.commit(o);
575
+ }
576
+ insert(s, o) {
577
+ const [n, k] = this.pointAt(o.s);
578
+ if (n.nodeType === 3)
579
+ n.insertData(k, s);
580
+ else
581
+ n.insertBefore(document.createTextNode(s), n.childNodes[k] || null);
582
+ this.tidy();
583
+ return o.s + s.length;
584
+ }
585
+ insertLines(items, o) {
586
+ if (!items.length)
587
+ return o.s;
588
+ if (o.s !== o.e)
589
+ o = this.del(o);
590
+ const all = this.lines(), i = this.lineAt(o.s), b = all[i], [n, k] = this.pointAt(o.s), spec = this.specOf();
591
+ const rg = document.createRange();
592
+ rg.setStart(n, k);
593
+ rg.setEnd(b, b.childNodes.length);
594
+ const tail = rg.extractContents();
595
+ if (!b.textContent && items[0].t !== 'p')
596
+ spec[i][0] = items[0].t;
597
+ let at = o.s + items[0].len;
598
+ b.append(items[0].frag);
599
+ const rest = items.slice(1).map((x) => { const p = document.createElement('p'); p.append(x.frag); at += 1 + x.len; return [x.t, p]; });
600
+ spec.splice(i + 1, 0, ...rest);
601
+ (rest.length ? rest[rest.length - 1][1] : b).append(tail);
602
+ this.rebuild(spec);
603
+ return at;
604
+ }
605
+ link(o, href) {
606
+ this.flush();
607
+ if (!href) {
608
+ const rg = this.range(o);
609
+ [...this.ed.querySelectorAll('a')].filter(a => rg.intersectsNode(a)).forEach(a => this.unwrap(a));
610
+ this.tidy();
611
+ this.set(o);
612
+ this.commit(o);
613
+ return;
614
+ }
615
+ if (o.s !== o.e)
616
+ return this.inline('A', href, o);
617
+ const a = this.up(this.pointAt(o.s)[0], 'A');
618
+ if (a) {
619
+ a.setAttribute('href', href);
620
+ this.set(o);
621
+ this.commit(o);
622
+ return;
623
+ }
624
+ const label = href.replace(/^mailto:/i, ''), end = this.insert(label, o);
625
+ this.covered({ s: o.s, e: end }).forEach(t => this.wrap(t, 'A', href));
626
+ this.tidy();
627
+ this.set({ s: end, e: end });
628
+ this.commit(o);
629
+ }
630
+ // ---- suggestion ----
631
+ suggest(o, kind) {
632
+ this.flush();
633
+ this.pend = null;
634
+ const nw = document.createElement('span');
635
+ nw.className = 'vo-rte-new';
636
+ nw.contentEditable = 'false';
637
+ const olds = [];
638
+ if (kind === 'swap') {
639
+ const all = this.lines(), a = this.lineAt(o.s), z = this.lineAt(o.e);
640
+ for (let i = z; i >= a; i--) {
641
+ const s = Math.max(o.s, this.startOf(i)), e = Math.min(o.e, this.startOf(i) + this.len(all[i]));
642
+ if (e <= s)
643
+ continue;
644
+ const rg = this.range({ s, e }), sp = document.createElement('span');
645
+ sp.className = 'vo-rte-old';
646
+ sp.appendChild(rg.extractContents());
647
+ rg.insertNode(sp);
648
+ olds.unshift(sp);
649
+ }
650
+ }
651
+ if (olds.length)
652
+ olds[olds.length - 1].after(nw);
653
+ else
654
+ this.range({ s: o.e, e: o.e }).insertNode(nw);
655
+ this.rev = { o, kind, olds, nw };
656
+ return (s) => { if (this.rev && this.rev.nw === nw) {
657
+ const w = document.createElement('span');
658
+ w.className = 'vo-w';
659
+ w.textContent = s;
660
+ nw.appendChild(w);
661
+ this.showRange(w);
662
+ } };
663
+ }
664
+ drop() { if (!this.rev)
665
+ return null; const r = this.rev; r.olds.forEach(x => this.unwrap(x)); r.nw.remove(); this.rev = null; this.tidy(); return r; }
666
+ accept() {
667
+ const s = this.rev ? this.rev.nw.textContent || '' : '';
668
+ const r = this.drop();
669
+ if (!r)
670
+ return;
671
+ const items = s.split(/\n+/).filter(Boolean).map(l => { const frag = document.createDocumentFragment(); frag.append(l); return { t: 'p', frag, len: l.length }; });
672
+ const at = this.insertLines(items, r.kind === 'swap' ? r.o : { s: r.o.e, e: r.o.e });
673
+ this.set({ s: at, e: at });
674
+ this.commit(r.o);
675
+ }
676
+ discard() { const r = this.drop(); if (r)
677
+ this.set(r.o); this.changed(); }
678
+ newText() { return this.rev ? this.rev.nw.textContent || '' : ''; }
679
+ // ---- browser events, routed through the edits ----
680
+ onBeforeInput(e) {
681
+ const t = e.inputType;
682
+ if (this.rev) {
683
+ e.preventDefault();
684
+ return;
685
+ }
686
+ if (t === 'historyUndo' || t === 'historyRedo') {
687
+ e.preventDefault();
688
+ if (t === 'historyUndo')
689
+ this.undo();
690
+ else
691
+ this.redo();
692
+ return;
693
+ }
694
+ if (t.startsWith('format')) {
695
+ e.preventDefault();
696
+ if (t === 'formatBold')
697
+ this.inline('B');
698
+ else if (t === 'formatItalic')
699
+ this.inline('I');
700
+ return;
701
+ }
702
+ if (t === 'insertParagraph' || t === 'insertLineBreak') {
703
+ e.preventDefault();
704
+ this.split();
705
+ return;
706
+ }
707
+ if (t === 'insertFromPaste' || t === 'insertFromDrop' || t === 'deleteByDrag' || t === 'deleteByCut')
708
+ return;
709
+ const o = this.get(), i = this.lineAt(o.s);
710
+ if (t === 'insertText' && e.data && this.pend && o.s === o.e && this.pend.at === o.s) {
711
+ e.preventDefault();
712
+ this.typeStyled(e.data);
713
+ return;
714
+ }
715
+ if (o.s === o.e && /^delete.*Backward$/.test(t) && o.s === this.startOf(i)) {
716
+ e.preventDefault();
717
+ this.flush();
718
+ this.joinBack(o);
719
+ return;
720
+ }
721
+ if (o.s === o.e && /^delete.*Forward$/.test(t) && o.s === this.startOf(i) + this.len(this.lines()[i])) {
722
+ e.preventDefault();
723
+ this.flush();
724
+ this.joinNext(o);
725
+ return;
726
+ }
727
+ if (o.s !== o.e && i !== this.lineAt(o.e) && (t.startsWith('delete') || t === 'insertText' || t === 'insertReplacementText')) {
728
+ e.preventDefault();
729
+ this.flush();
730
+ const p = this.del(o);
731
+ let at = p.s;
732
+ const s = e.data || (e.dataTransfer && e.dataTransfer.getData('text/plain')) || '';
733
+ if (s && t.startsWith('insert'))
734
+ at = this.insert(s.replace(/\s*\n\s*/g, ' '), p);
735
+ this.set({ s: at, e: at });
736
+ this.commit(o);
737
+ return;
738
+ }
739
+ if (!this.H.dirty)
740
+ this.H.pre = o;
741
+ }
742
+ onDrop(e) {
743
+ e.preventDefault();
744
+ if (this.rev || !e.dataTransfer)
745
+ return;
746
+ const items = this.plain(e.dataTransfer.getData('text/plain'));
747
+ if (!items.length)
748
+ return;
749
+ const doc = document;
750
+ let at = null;
751
+ if (doc.caretPositionFromPoint) {
752
+ const pp = doc.caretPositionFromPoint(e.clientX, e.clientY);
753
+ if (pp)
754
+ at = [pp.offsetNode, pp.offset];
755
+ }
756
+ else if (doc.caretRangeFromPoint) {
757
+ const r = doc.caretRangeFromPoint(e.clientX, e.clientY);
758
+ if (r)
759
+ at = [r.startContainer, r.startOffset];
760
+ }
761
+ if (!at || !this.ed.contains(at[0]))
762
+ return;
763
+ this.flush();
764
+ const a0 = this.offsetOf(at[0], at[1]), end = this.insertLines(items, { s: a0, e: a0 });
765
+ this.set({ s: end, e: end }, true);
766
+ this.commit({ s: a0, e: a0 });
767
+ }
768
+ onKeyDown(e) {
769
+ if (e.isComposing || this.hook.key?.(e))
770
+ return;
771
+ if (this.rev)
772
+ return;
773
+ const mod = isMac() ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey;
774
+ if (!mod)
775
+ return;
776
+ const k = e.key.toLowerCase(), c = e.code;
777
+ const act = e.altKey ? (c === 'Digit1' ? () => this.block('h2') : c === 'Digit0' ? () => this.block('p') : null)
778
+ : e.shiftKey ? (c === 'Digit7' ? () => this.block('ol') : c === 'Digit8' ? () => this.block('ul') : c === 'Digit9' ? () => this.block('quote') : k === 'z' ? () => this.redo() : null)
779
+ : k === 'b' ? () => this.inline('B') : k === 'i' ? () => this.inline('I') : k === 'e' ? () => this.inline('CODE') : k === 'z' ? () => this.undo() : k === 'y' ? () => this.redo() : null;
780
+ if (act) {
781
+ e.preventDefault();
782
+ e.stopPropagation();
783
+ act();
784
+ }
785
+ }
786
+ // ---- public helpers used by the component ----
787
+ focus() { this.set(this.get(), true); }
788
+ html() { return this.ed.innerHTML; }
789
+ reviewing() { return !!this.rev; }
790
+ canUndo() { return this.H.at > 0 || this.H.dirty; }
791
+ canRedo() { return this.H.at < this.H.list.length - 1; }
792
+ empty() { const all = this.lines(); return all.length === 1 && !this.len(all[0]) && this.typeOf(all[0]) === 'p'; }
793
+ words() { const s = this.lines().map(b => b.textContent).join(' ').trim(); return s ? s.split(/\s+/).length : 0; }
794
+ line(at) { const i = this.lineAt(at), s = this.startOf(i); return { s, e: s + this.len(this.lines()[i]) }; }
795
+ state() {
796
+ const o = this.get(), all = this.lines(), ts = all.slice(this.lineAt(o.s), this.lineAt(o.e) + 1).map(b => this.typeOf(b)), g = this.live();
797
+ const a = this.up(o.s === o.e && g ? g.startContainer : this.pointAt(o.s, o.s !== o.e)[0], 'A');
798
+ return { B: this.has('B', o), I: this.has('I', o), CODE: this.has('CODE', o), A: o.s === o.e ? !!a : this.has('A', o), href: a ? a.getAttribute('href') : null, block: ts.every(t => t === ts[0]) ? ts[0] : null };
799
+ }
800
+ remove(o) { this.flush(); this.set(this.del(o)); this.commit(o); }
801
+ type(s) { const o = this.get(); this.flush(); const at = this.insert(s, o); this.set({ s: at, e: at }); this.typed(o); this.showRange(this.range({ s: at, e: at })); }
802
+ show(o) { this.showRange(this.range(o)); }
803
+ destroy() { clearTimeout(this.H.t); this.offs.forEach(f => f()); this.offs = []; }
804
+ }
805
+ /* ---------- the demo's writer: canned rewrites for the preview's draft, and simple rules for anything else ---------- */
806
+ const CANNED = {
807
+ 'We know pricing changes can feel like a lot, so we want to make sure everyone has plenty of time to look at the new plans and ask us questions before anything changes.': { shorter: "We're giving everyone time to review the new plans and ask questions before anything changes.", improve: 'Pricing changes can feel like a lot, so everyone gets plenty of time to review the new plans and ask questions before anything changes.' },
808
+ 'New pricing goes live on March 3.': { improve: 'Our new pricing goes live on March 3.', shorter: 'New pricing starts March 3.' },
809
+ 'Starter teams get two more seats for free, and every plan now includes the agent.': { improve: 'Starter teams get two extra seats at no cost, and every plan now includes the agent.', shorter: 'Starter teams get two free seats, and every plan includes the agent.' },
810
+ };
811
+ const TYPO = { teh: 'the', recieve: 'receive', seperate: 'separate', definately: 'definitely', alot: 'a lot', dont: "don't", cant: "can't", wont: "won't", im: "I'm", ive: "I've", thier: 'their', untill: 'until', occured: 'occurred', wich: 'which', becuase: 'because', youre: "you're", doesnt: "doesn't", isnt: "isn't", tommorow: 'tomorrow', accross: 'across' };
812
+ const FILLER = [[/\b(really|very|just|actually|basically|quite|simply|definitely|certainly|literally|totally)\s+/gi, ''], [/\bin order to\b/gi, 'to'], [/\bmake sure (that )?/gi, 'ensure '], [/\bdue to the fact that\b/gi, 'because'], [/\bat this point in time\b/gi, 'now'], [/\ba lot of\b/gi, 'many'], [/\bplenty of\b/gi, 'enough'], [/\bis able to\b/gi, 'can']];
813
+ const BETTER = [[/\bwe will\b/gi, "we'll"], [/\bwe are\b/gi, "we're"], [/\bit is\b/gi, "it's"], [/\bdo not\b/gi, "don't"], [/\bcannot\b/gi, "can't"], [/\bvery important\b/gi, 'essential'], [/\bgood\b/gi, 'strong'], [/\bbig\b/gi, 'major'], [/\bstuff\b/gi, 'details'], [/\bkind of\s+/gi, ''], [/\bat no extra cost\b/gi, 'free']];
814
+ /** The demo's stand-in for a model: canned rewrites for the preview's draft about a pricing launch, and simple rules for anything else */
815
+ export function demoWrite(action, text, doc) {
816
+ const fix = (s) => s.replace(/[ \t]{2,}/g, ' ').replace(/\s+([,.!?;:])/g, '$1').replace(/\bi\b/g, 'I')
817
+ .replace(/\b[a-z]+\b/gi, w => { const f = TYPO[w.toLowerCase()]; return f ? (w[0] === w[0].toUpperCase() ? f[0].toUpperCase() + f.slice(1) : f) : w; })
818
+ .replace(/(^|[.!?]\s+)([a-z])/g, (_, a, b) => a + b.toUpperCase()).replace(/([a-z0-9])\s*$/i, (m, a) => s.trim().split(/\s+/).length > 3 ? a + '.' : m);
819
+ if (action === 'continue') {
820
+ const next = /pric|plan|seat|launch/i.test(doc)
821
+ ? ['Current customers keep their price until their next renewal, and every admin gets an email that sums up what changes for their team.', 'If anything is unclear, reply to this email and we will walk you through it.']
822
+ : ['Next, we will share a short summary so everyone knows what changes and when.', 'Reply with any questions and we will get back to you within a day.'];
823
+ return next.find(x => !doc.includes(x)) || next[next.length - 1];
824
+ }
825
+ if (action === 'grammar')
826
+ return fix(text);
827
+ const rules = (s, list) => list.reduce((x, [a, b]) => x.replace(a, b), s);
828
+ return (text.match(/[^]*?(?:[.!?]+(?=\s|$)|$)\s*/g) || [text]).filter(Boolean).map(s => {
829
+ const k = s.trim(), hit = CANNED[k] && CANNED[k][action];
830
+ if (hit)
831
+ return s.replace(k, hit);
832
+ let x = fix(rules(s, action === 'shorter' ? FILLER : [...FILLER.slice(0, 2), ...BETTER]));
833
+ if (action === 'shorter' && x.trim().length > 60 && x.length > s.length * .85 && x.includes(', '))
834
+ x = x.slice(0, x.indexOf(', ')) + '.' + (/\s$/.test(s) ? ' ' : '');
835
+ return x;
836
+ }).join('');
837
+ }
838
+ /** The default `ai`: demoWrite's answer, streamed a word at a time after a short pause, as a model would */
839
+ export const demoAi = async function* ({ action, text, document: doc, signal }) {
840
+ const wait = (ms) => new Promise(res => setTimeout(res, ms));
841
+ const reduce = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;
842
+ const out = demoWrite(action, text, doc);
843
+ if (reduce) {
844
+ yield out;
845
+ return;
846
+ }
847
+ await wait(450);
848
+ for (const w of out.match(/\S+\s*|\s+/g) || []) {
849
+ if (signal.aborted)
850
+ return;
851
+ yield w;
852
+ await wait(48);
853
+ }
854
+ };
855
+ const ACTIONS = [
856
+ { key: 'improve', label: 'Improve writing', icon: 'spark' },
857
+ { key: 'shorter', label: 'Make shorter', icon: 'minus' },
858
+ { key: 'grammar', label: 'Fix grammar', icon: 'check' },
859
+ { key: 'continue', label: 'Continue writing', icon: 'edit', kind: 'add' },
860
+ ];
861
+ const keysOf = (k, mac) => k === 'redo' ? (mac ? '⇧⌘Z' : 'Ctrl+Y')
862
+ : k.split(' ').map(x => ({ mod: mac ? '⌘' : 'Ctrl', alt: mac ? '⌥' : 'Alt', shift: mac ? '⇧' : 'Shift' })[x] || x).join(mac ? '' : '+');
863
+ const TOOLS = [
864
+ { f: 'h2', label: 'Heading', icon: 'file-text', k: 'mod alt 1' }, { f: 'b', label: 'Bold', icon: 'edit', k: 'mod B' }, { f: 'i', label: 'Italic', icon: 'pr', k: 'mod I' },
865
+ { f: 'code', label: 'Inline code', icon: 'term', k: 'mod E' }, { f: 'a', label: 'Link', icon: 'ext', k: 'mod K' },
866
+ { f: 'ul', label: 'Bulleted list', icon: 'more', k: 'mod shift 8' }, { f: 'ol', label: 'Numbered list', icon: 'more', k: 'mod shift 7' }, { f: 'quote', label: 'Quote', icon: 'comment', k: 'mod shift 9' },
867
+ ];
868
+ /** A minimal editor for a draft an agent helps with. Select text and press Ask AI (or Mod+J, or type / on a new line), and a
869
+ suggestion streams in beside the text, the old words struck through, to accept with Tab/Enter or discard with Escape. */
870
+ export class RichTextEditorComponent {
871
+ constructor() {
872
+ this.defaultValue = '';
873
+ this.placeholder = 'Write a draft, or type / on a new line for AI';
874
+ this.label = 'Draft';
875
+ this.hint = 'Select text to ask AI';
876
+ /** Writes the AI's suggestions. Defaults to the demo writer; pass your model call, or false to hide the AI */
877
+ this.ai = demoAi;
878
+ /** The AI menu. Defaults to Improve writing, Make shorter, Fix grammar and Continue writing */
879
+ this.aiActions = ACTIONS;
880
+ /** Called with the HTML after each change the person makes */
881
+ this.valueChange = new EventEmitter();
882
+ /** Called when a suggestion is accepted or discarded */
883
+ this.suggestion = new EventEmitter();
884
+ this.motion = inject(ReducedMotionService);
885
+ this.eng = null;
886
+ this.emitted = null;
887
+ this.quiet = false;
888
+ this.picked = null;
889
+ this.runToken = null;
890
+ this.uid = 'rte-' + Math.random().toString(36).slice(2, 7);
891
+ this.mac = false;
892
+ this.tools = TOOLS.map(t => ({ ...t, on: false, kbd: '' }));
893
+ this.items = this.aiActions.map(a => ({ ...a, off: false }));
894
+ this.focusTb = 0;
895
+ this.words = 0;
896
+ this.empty = true;
897
+ this.canUndo = false;
898
+ this.canRedo = false;
899
+ this.hasHref = false;
900
+ this.job = null;
901
+ this.lk = null;
902
+ this.url = '';
903
+ this.bad = false;
904
+ this.bubble = false;
905
+ this.review = null;
906
+ this.say = '';
907
+ this.aiKbd = '';
908
+ this.undoKbd = '';
909
+ this.redoKbd = '';
910
+ }
911
+ get bodyEl() { return this.bodyRef.nativeElement; }
912
+ get menuHeading() {
913
+ if (this.job?.sel)
914
+ return 'Edit the selection';
915
+ return this.items.some(x => !x.off && (x.kind || 'swap') === 'swap') ? 'Edit this paragraph' : 'Write with AI';
916
+ }
917
+ get reviewLabel() { return this.aiActions.find(a => a.key === this.review?.action)?.label || ''; }
918
+ ngOnChanges(changes) {
919
+ if (changes['aiActions'])
920
+ this.items = this.aiActions.map(a => ({ ...a, off: false }));
921
+ if (changes['value'] && this.eng && this.value !== undefined && this.value !== this.emitted) {
922
+ if (this.eng.reviewing()) {
923
+ this.runToken?.ctl.abort();
924
+ this.runToken = null;
925
+ this.review = null;
926
+ }
927
+ this.load(this.value);
928
+ }
929
+ }
930
+ ngAfterViewInit() {
931
+ this.mac = isMac();
932
+ this.aiKbd = keysOf('mod J', this.mac);
933
+ this.undoKbd = keysOf('mod Z', this.mac);
934
+ this.redoKbd = keysOf('redo', this.mac);
935
+ this.tools = TOOLS.map(t => ({ ...t, on: false, kbd: keysOf(t.k, this.mac) }));
936
+ const E = new RteEngine(this.bodyEl, {
937
+ change: () => this.paint(),
938
+ select: () => { this.paint(); this.showBubble(); },
939
+ input: e => { if (e.inputType === 'insertText' && e.data === '/') {
940
+ const o = E.get();
941
+ if (o.s === o.e && E.line(o.s).s === o.s - 1)
942
+ this.openMenu('slash');
943
+ } },
944
+ key: e => this.engineKey(e),
945
+ });
946
+ this.eng = E;
947
+ this.load(this.value ?? this.defaultValue);
948
+ this.down = (e) => {
949
+ const t = e.target;
950
+ if (this.job && !this.menuRef?.nativeElement.contains(t) && !this.askRef?.nativeElement.contains(t) && !t.closest?.('.vo-rte-ai'))
951
+ this.closeMenu(false);
952
+ if (this.lk && !this.lnkRef.nativeElement.contains(t) && !t.closest?.('[data-f="a"]'))
953
+ this.closeLink(false);
954
+ if (e.isTrusted && !this.askRef?.nativeElement.contains(t) && !this.job) {
955
+ this.bubble = false;
956
+ if (!this.rootRef.nativeElement.contains(t))
957
+ this.pick(null);
958
+ }
959
+ };
960
+ this.resize = () => { this.closeMenu(false); this.closeLink(false); this.bubble = false; };
961
+ document.addEventListener('pointerdown', this.down);
962
+ addEventListener('resize', this.resize);
963
+ this.paint();
964
+ }
965
+ ngOnDestroy() {
966
+ this.runToken?.ctl.abort();
967
+ this.runToken = null;
968
+ this.pick(null);
969
+ this.eng?.destroy();
970
+ this.eng = null;
971
+ if (this.down)
972
+ document.removeEventListener('pointerdown', this.down);
973
+ if (this.resize)
974
+ removeEventListener('resize', this.resize);
975
+ }
976
+ reduce() { return this.motion.reduce(); }
977
+ announce(t) { this.say = ''; setTimeout(() => { this.say = t; }, 60); }
978
+ paint() {
979
+ const E = this.eng;
980
+ if (!E)
981
+ return;
982
+ const s = E.state();
983
+ this.tools = this.tools.map(t => ({ ...t, on: t.f === 'a' ? s.A : /^(h2|ul|ol|quote)$/.test(t.f) ? s.block === t.f : !!s[t.f.toUpperCase()] }));
984
+ this.hasHref = !!s.href;
985
+ this.words = E.words();
986
+ this.empty = E.empty();
987
+ this.canUndo = E.canUndo();
988
+ this.canRedo = E.canRedo();
989
+ this.items = this.items.map(a => ({ ...a, off: (a.kind || 'swap') === 'swap' && !!this.job && !(E.text(this.job.t).trim()) }));
990
+ if (!E.reviewing() && !this.quiet) {
991
+ const html = E.html();
992
+ if (html !== this.emitted) {
993
+ this.emitted = html;
994
+ this.valueChange.emit(html);
995
+ }
996
+ }
997
+ }
998
+ load(html) { const E = this.eng; if (!E)
999
+ return; this.quiet = true; E.load(html); this.quiet = false; this.emitted = E.html(); this.paint(); }
1000
+ // ---- placement of the popovers inside the editor ----
1001
+ rectsOf(o) {
1002
+ const E = this.eng, rs = [...E.range(o).getClientRects()].filter(x => x.width || x.height);
1003
+ if (rs.length)
1004
+ return [rs[0], rs[rs.length - 1]];
1005
+ const n = E.range(E.line(o.s)).startContainer, el = (n.nodeType === 3 ? n.parentElement : n), rr = el.getBoundingClientRect();
1006
+ return [rr, rr];
1007
+ }
1008
+ place(el, o, above = false) {
1009
+ const box = this.rootRef?.nativeElement;
1010
+ if (!el || !box)
1011
+ return;
1012
+ const b = box.getBoundingClientRect(), w = el.offsetWidth, h = el.offsetHeight, top = (this.tbRef.nativeElement.offsetHeight || 44) - 2, [f, l] = this.rectsOf(o);
1013
+ const over = f.top - b.top - h - 6, under = l.bottom - b.top + 6;
1014
+ const y = above ? (over >= top ? over : under) : under + h <= b.height - 4 || over < top ? under : over;
1015
+ el.style.left = Math.round(Math.max(6, Math.min((above ? f : l).left - b.left - (above ? 0 : 8), b.width - w - 6))) + 'px';
1016
+ el.style.top = Math.round(Math.max(4, Math.min(y, b.height - h - 4))) + 'px';
1017
+ }
1018
+ pick(o) {
1019
+ const reg = typeof CSS !== 'undefined' ? CSS.highlights : undefined;
1020
+ const HL = typeof window !== 'undefined' ? window.Highlight : undefined;
1021
+ if (!reg || !HL)
1022
+ return;
1023
+ let h = reg.get('rte-pick');
1024
+ if (!h) {
1025
+ h = new HL();
1026
+ reg.set('rte-pick', h);
1027
+ }
1028
+ if (this.picked)
1029
+ h.delete(this.picked);
1030
+ this.picked = o && o.s !== o.e && this.eng ? this.eng.range(o) : null;
1031
+ if (this.picked)
1032
+ h.add(this.picked);
1033
+ }
1034
+ showBubble(o) {
1035
+ const E = this.eng;
1036
+ if (!E)
1037
+ return;
1038
+ const g = getSelection(), sel = o || (document.activeElement === this.bodyEl && g && g.rangeCount && !g.isCollapsed ? E.get() : null);
1039
+ if (!sel || E.reviewing() || this.job || this.lk || this.ai === false || !E.text(sel).trim()) {
1040
+ this.bubble = false;
1041
+ return;
1042
+ }
1043
+ this.place(this.askRef?.nativeElement, sel, true);
1044
+ this.bubble = true;
1045
+ }
1046
+ // ---- toolbar ----
1047
+ keepFocus(e) { if (e.target.closest('button'))
1048
+ e.preventDefault(); }
1049
+ tbButtons() { return [...(this.tbRef.nativeElement.querySelectorAll('button:not(:disabled)'))]; }
1050
+ tbKey(e) {
1051
+ const all = this.tbButtons(), i = all.indexOf(document.activeElement);
1052
+ if (i < 0)
1053
+ return;
1054
+ const go = { ArrowRight: all[(i + 1) % all.length], ArrowLeft: all[(i - 1 + all.length) % all.length], Home: all[0], End: all[all.length - 1] }[e.key];
1055
+ if (go) {
1056
+ e.preventDefault();
1057
+ go.focus();
1058
+ this.focusTb = this.tbButtonIndex(go);
1059
+ }
1060
+ }
1061
+ tbButtonIndex(b) { return [...this.tbRef.nativeElement.querySelectorAll('button')].indexOf(b); }
1062
+ apply(f, e) {
1063
+ const E = this.eng;
1064
+ if (!E || E.reviewing())
1065
+ return;
1066
+ const mine = e.isTrusted, key = e.detail === 0;
1067
+ if (f === 'a') {
1068
+ if (this.lk)
1069
+ this.closeLink(true);
1070
+ else
1071
+ this.openLink(mine, mine && key);
1072
+ return;
1073
+ }
1074
+ if (f === 'b' || f === 'i' || f === 'code')
1075
+ E.inline(f.toUpperCase());
1076
+ else
1077
+ E.block(f);
1078
+ if (mine)
1079
+ E.focus();
1080
+ }
1081
+ doUndo(e) { this.eng?.undo(); if (e.isTrusted)
1082
+ this.eng?.focus(); }
1083
+ doRedo(e) { this.eng?.redo(); if (e.isTrusted)
1084
+ this.eng?.focus(); }
1085
+ onAiButton(e) { this.openMenu(e.isTrusted ? (e.detail ? 'click' : 'button') : 'script'); }
1086
+ onAskButton(e) { this.openMenu(e.isTrusted ? 'click' : 'script'); }
1087
+ // ---- the AI menu ----
1088
+ menuItemEls() { return [...(this.menuRef?.nativeElement.querySelectorAll('[role="menuitem"]') || [])].filter(m => m.getAttribute('aria-disabled') !== 'true'); }
1089
+ focusItem(m) { if (!m)
1090
+ return; this.menuItemEls().forEach(x => { x.tabIndex = x === m ? 0 : -1; }); m.focus({ preventScroll: true }); }
1091
+ openMenu(how) {
1092
+ const E = this.eng;
1093
+ if (!E || E.reviewing() || this.ai === false)
1094
+ return;
1095
+ this.closeLink(false);
1096
+ E.flush();
1097
+ if (this.job) {
1098
+ this.closeMenu(how !== 'script');
1099
+ return;
1100
+ }
1101
+ const o = E.get(), slash = how === 'slash' ? o.s - 1 : null, sel = o.s !== o.e;
1102
+ let t = sel ? o : E.line(o.s);
1103
+ if (slash !== null)
1104
+ t = { s: slash + 1, e: t.e };
1105
+ this.job = { o, t, slash, sel, btn: how === 'button' };
1106
+ this.bubble = false;
1107
+ this.pick(sel ? o : null);
1108
+ this.paint();
1109
+ requestAnimationFrame(() => { this.place(this.menuRef?.nativeElement, o); if (how !== 'script')
1110
+ this.focusItem(this.menuItemEls()[0]); });
1111
+ }
1112
+ closeMenu(back) {
1113
+ const j = this.job;
1114
+ if (!j)
1115
+ return;
1116
+ this.job = null;
1117
+ this.pick(null);
1118
+ this.paint();
1119
+ if (back && j.btn) {
1120
+ this.eng?.set(j.o);
1121
+ this.rootRef.nativeElement.querySelector('.vo-rte-ai')?.focus({ preventScroll: true });
1122
+ }
1123
+ else if (back)
1124
+ this.eng?.set(j.o, true);
1125
+ }
1126
+ menuKey(e) {
1127
+ const all = this.menuItemEls(), i = all.indexOf(document.activeElement);
1128
+ const go = { ArrowDown: all[(i + 1) % all.length], ArrowUp: all[(i - 1 + all.length) % all.length], Home: all[0], End: all[all.length - 1] }[e.key];
1129
+ if (go) {
1130
+ e.preventDefault();
1131
+ this.focusItem(go);
1132
+ }
1133
+ else if (e.key === 'Escape' || e.key === 'Tab') {
1134
+ e.preventDefault();
1135
+ e.stopPropagation();
1136
+ this.closeMenu(true);
1137
+ }
1138
+ else if (e.key.length === 1 && /\S/.test(e.key) && !e.metaKey && !e.ctrlKey) {
1139
+ const k = e.key.toLowerCase(), hit = [...all.slice(i + 1), ...all.slice(0, i + 1)].find(m => (m.textContent || '').trim().toLowerCase().startsWith(k));
1140
+ if (hit)
1141
+ this.focusItem(hit);
1142
+ }
1143
+ }
1144
+ onMenuItem(a, e) { if (!a.off)
1145
+ this.ask(a.key, e.isTrusted); }
1146
+ here(E) { const o = E.get(), sel = o.s !== o.e; return { o, t: sel ? o : E.line(o.s), slash: null, sel }; }
1147
+ ask(key, mine) {
1148
+ const E = this.eng, j = this.job || (E && this.here(E));
1149
+ const act = this.aiActions.find(a => a.key === key), writer = this.ai;
1150
+ if (!E || !j || !act || writer === false || E.reviewing())
1151
+ return;
1152
+ this.closeMenu(false);
1153
+ let t = j.t, end = j.o.e;
1154
+ if (j.slash !== null) {
1155
+ const sl = j.slash;
1156
+ E.remove({ s: sl, e: sl + 1 });
1157
+ const back = (x) => x > sl ? x - 1 : x;
1158
+ t = { s: back(t.s), e: back(t.e) };
1159
+ end = back(end);
1160
+ }
1161
+ const kind = act.kind || 'swap';
1162
+ if (kind === 'add')
1163
+ t = { s: end, e: end };
1164
+ else if (!E.text(t).trim())
1165
+ return;
1166
+ const doc = E.text({ s: 0, e: E.total() }), before = E.text({ s: 0, e: t.s }), after = E.text({ s: t.e, e: E.total() }), said = E.text(t);
1167
+ const write = E.suggest(t, kind), ctl = new AbortController(), me = { ctl, action: key };
1168
+ this.runToken = me;
1169
+ let got = '', first = true;
1170
+ const put = (s) => { if (first && kind === 'add' && before && !/\s$/.test(before) && !/^\s/.test(s))
1171
+ s = ' ' + s; first = false; got += s; write(s); };
1172
+ this.review = { action: key, ready: false };
1173
+ this.bubble = false;
1174
+ this.paint();
1175
+ this.announce(`${act.label}: writing a suggestion`);
1176
+ if (mine)
1177
+ E.focus();
1178
+ (async () => {
1179
+ try {
1180
+ const res = writer({ action: key, text: kind === 'add' ? '' : said, before, after, document: doc, signal: ctl.signal });
1181
+ if (typeof res === 'string' || res instanceof Promise) {
1182
+ const s = await res;
1183
+ if (this.runToken !== me)
1184
+ return;
1185
+ if (this.reduce())
1186
+ put(s);
1187
+ else
1188
+ for (const w of s.match(/\S+\s*|\s+/g) || []) {
1189
+ if (this.runToken !== me)
1190
+ return;
1191
+ put(w);
1192
+ await new Promise(r => setTimeout(r, 48));
1193
+ }
1194
+ }
1195
+ else
1196
+ for await (const chunk of res) {
1197
+ if (this.runToken !== me)
1198
+ return;
1199
+ put(chunk);
1200
+ }
1201
+ }
1202
+ catch (err) {
1203
+ if (this.runToken !== me)
1204
+ return;
1205
+ console.error(err);
1206
+ }
1207
+ if (this.runToken !== me)
1208
+ return;
1209
+ if (!got.trim()) {
1210
+ this.finish(false, true);
1211
+ return;
1212
+ }
1213
+ this.review = { action: key, ready: true };
1214
+ this.paint();
1215
+ const s = got.trim();
1216
+ this.announce(`Suggestion: ${s}${/[.!?]$/.test(s) ? '' : '.'} Press Tab or Enter to accept, or Escape to discard.`);
1217
+ })();
1218
+ }
1219
+ finish(keep, mine) {
1220
+ const E = this.eng, r = this.runToken;
1221
+ if (!E || !E.reviewing() || !r)
1222
+ return;
1223
+ if (keep && !this.review?.ready)
1224
+ return;
1225
+ const said = E.newText();
1226
+ this.runToken = null;
1227
+ r.ctl.abort();
1228
+ if (keep)
1229
+ E.accept();
1230
+ else
1231
+ E.discard();
1232
+ this.review = null;
1233
+ this.paint();
1234
+ this.announce(keep ? 'Suggestion accepted' : 'Suggestion discarded');
1235
+ this.suggestion.emit({ action: r.action, text: said, accepted: keep });
1236
+ if (mine)
1237
+ E.focus();
1238
+ }
1239
+ // ---- the link field ----
1240
+ openLink(mine, btn = false) {
1241
+ const E = this.eng;
1242
+ if (!E || E.reviewing())
1243
+ return;
1244
+ this.closeMenu(false);
1245
+ E.flush();
1246
+ const o = E.get(), s = E.state();
1247
+ this.lk = { o, btn };
1248
+ this.url = s.href || '';
1249
+ this.bad = false;
1250
+ this.bubble = false;
1251
+ this.hasHref = !!s.href;
1252
+ this.pick(o);
1253
+ requestAnimationFrame(() => { this.place(this.lnkRef.nativeElement, o); if (mine)
1254
+ this.urlRef.nativeElement.focus({ preventScroll: true }); });
1255
+ }
1256
+ closeLink(back) {
1257
+ const j = this.lk;
1258
+ if (!j)
1259
+ return;
1260
+ this.lk = null;
1261
+ this.pick(null);
1262
+ if (back && j.btn) {
1263
+ this.eng?.set(j.o);
1264
+ this.tbRef.nativeElement.querySelector('[data-f="a"]')?.focus({ preventScroll: true });
1265
+ }
1266
+ else if (back)
1267
+ this.eng?.set(j.o, true);
1268
+ }
1269
+ toUrl(v) { v = v.trim(); if (!v)
1270
+ return null; if (/^(https?:\/\/|mailto:)/i.test(v))
1271
+ return v; if (/^[^\s@/]+@[^\s@]+\.[^\s@]+$/.test(v))
1272
+ return 'mailto:' + v; if (/^[\w-]+(\.[\w-]+)+(:\d+)?([/?#]\S*)?$/.test(v))
1273
+ return 'https://' + v; return null; }
1274
+ applyLink(href) {
1275
+ const E = this.eng, j = this.lk;
1276
+ if (!E || !j)
1277
+ return;
1278
+ if (href === '') {
1279
+ const h = this.toUrl(this.url);
1280
+ if (!h) {
1281
+ this.bad = true;
1282
+ this.urlRef.nativeElement.focus({ preventScroll: true });
1283
+ return;
1284
+ }
1285
+ href = h;
1286
+ }
1287
+ this.closeLink(false);
1288
+ E.set(j.o);
1289
+ E.link(j.o, href);
1290
+ E.focus();
1291
+ }
1292
+ onUrlInput(e) { this.url = e.target.value; this.bad = false; }
1293
+ lnkKey(e) { if (e.key === 'Enter' && e.target === this.urlRef.nativeElement) {
1294
+ e.preventDefault();
1295
+ this.applyLink('');
1296
+ }
1297
+ else if (e.key === 'Escape') {
1298
+ e.preventDefault();
1299
+ e.stopPropagation();
1300
+ this.closeLink(true);
1301
+ } }
1302
+ lnkBlur(e) { if (this.lk && e.relatedTarget && !this.lnkRef.nativeElement.contains(e.relatedTarget))
1303
+ this.closeLink(false); }
1304
+ // ---- root-level keys ----
1305
+ engineKey(e) {
1306
+ const E = this.eng;
1307
+ if (E.reviewing()) {
1308
+ if ((e.key === 'Tab' || e.key === 'Enter') && !e.shiftKey && !e.altKey && !e.metaKey && !e.ctrlKey) {
1309
+ e.preventDefault();
1310
+ this.finish(true, true);
1311
+ return true;
1312
+ }
1313
+ if (e.key === 'Escape' || ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z')) {
1314
+ e.preventDefault();
1315
+ e.stopPropagation();
1316
+ this.finish(false, true);
1317
+ return true;
1318
+ }
1319
+ return false;
1320
+ }
1321
+ const mod = isMac() ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey, k = e.key.toLowerCase();
1322
+ if (mod && !e.altKey && !e.shiftKey && (k === 'k' || (k === 'j' && this.ai !== false))) {
1323
+ e.preventDefault();
1324
+ e.stopPropagation();
1325
+ if (k === 'k')
1326
+ this.openLink(true);
1327
+ else
1328
+ this.openMenu('key');
1329
+ return true;
1330
+ }
1331
+ if (e.key === 'Escape') {
1332
+ this.bubble = false;
1333
+ return false;
1334
+ }
1335
+ return false;
1336
+ }
1337
+ onRootKey(e) { if (e.key === 'Escape' && this.review && !this.bodyEl.contains(e.target)) {
1338
+ e.preventDefault();
1339
+ e.stopPropagation();
1340
+ this.finish(false, true);
1341
+ } }
1342
+ onRootPointerDown(e) { if (e.isTrusted && !this.job)
1343
+ this.pick(null); }
1344
+ // ---- imperative handle, for scripted demos ----
1345
+ focus() { this.eng?.focus(); }
1346
+ getHTML() { return this.eng?.html() || ''; }
1347
+ getText() { const E = this.eng; return E ? E.text({ s: 0, e: E.total() }) : ''; }
1348
+ setHTML(html) { this.load(html); }
1349
+ select(s) {
1350
+ const E = this.eng;
1351
+ if (!E)
1352
+ return false;
1353
+ const at = E.text({ s: 0, e: E.total() }).indexOf(s);
1354
+ if (at < 0 || !s)
1355
+ return false;
1356
+ const o = { s: at, e: at + s.length };
1357
+ E.set(o);
1358
+ E.show(o);
1359
+ this.pick(o);
1360
+ this.showBubble(o);
1361
+ this.paint();
1362
+ return true;
1363
+ }
1364
+ typeText(s) { this.eng?.type(s); }
1365
+ newLine() { this.eng?.split(); }
1366
+ format(f) { const E = this.eng; if (!E || E.reviewing())
1367
+ return; if (f === 'b' || f === 'i' || f === 'code')
1368
+ E.inline(f.toUpperCase());
1369
+ else
1370
+ E.block(f); }
1371
+ openAi() { this.openMenu('script'); }
1372
+ askAi(a) { this.ask(a, false); }
1373
+ accept() { this.finish(true, false); }
1374
+ discard() { this.finish(false, false); }
1375
+ undo() { this.eng?.undo(); }
1376
+ redo() { this.eng?.redo(); }
1377
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichTextEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1378
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RichTextEditorComponent, isStandalone: true, selector: "vo-rich-text-editor", inputs: { value: "value", defaultValue: "defaultValue", placeholder: "placeholder", label: "label", hint: "hint", ai: "ai", aiActions: "aiActions" }, outputs: { valueChange: "valueChange", suggestion: "suggestion" }, viewQueries: [{ propertyName: "rootRef", first: true, predicate: ["root"], descendants: true }, { propertyName: "tbRef", first: true, predicate: ["tb"], descendants: true }, { propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "askRef", first: true, predicate: ["askEl"], descendants: true }, { propertyName: "menuRef", first: true, predicate: ["menuEl"], descendants: true }, { propertyName: "lnkRef", first: true, predicate: ["lnkEl"], descendants: true }, { propertyName: "urlRef", first: true, predicate: ["urlEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1379
+ <div
1380
+ data-vo=""
1381
+ #root
1382
+ class="vo-rte"
1383
+ [attr.data-st]="review ? 'review' : 'edit'"
1384
+ (keydown)="onRootKey($event)"
1385
+ (pointerdown)="onRootPointerDown($event)"
1386
+ >
1387
+ <div
1388
+ #tb
1389
+ class="vo-rte-tb"
1390
+ role="toolbar"
1391
+ aria-label="Formatting"
1392
+ (mousedown)="keepFocus($event)"
1393
+ (keydown)="tbKey($event)"
1394
+ >
1395
+ @for (t of tools; track t.f; let i = $index) {
1396
+ @if (i === 5) {
1397
+ <span class="vo-rte-sep" aria-hidden="true"></span>
1398
+ }
1399
+ <button
1400
+ type="button"
1401
+ class="vo-rte-b"
1402
+ [class.vo-on]="t.f === 'a' && t.on && !review"
1403
+ [attr.data-f]="t.f"
1404
+ [attr.aria-label]="t.label"
1405
+ [attr.title]="t.label + ' · ' + t.kbd"
1406
+ [disabled]="!!review"
1407
+ [tabIndex]="focusTb === i ? 0 : -1"
1408
+ [attr.aria-haspopup]="t.f === 'a' ? 'dialog' : null"
1409
+ [attr.aria-expanded]="t.f === 'a' ? !!lk : null"
1410
+ [attr.aria-pressed]="t.f !== 'a' ? (!review && t.on) : null"
1411
+ (click)="apply(t.f, $event)"
1412
+ >
1413
+ <vo-icon [name]="t.icon" size="md"></vo-icon>
1414
+ </button>
1415
+ }
1416
+ <span class="vo-sp"></span>
1417
+ @if (ai !== false) {
1418
+ <button
1419
+ type="button"
1420
+ class="vo-rte-ai"
1421
+ aria-label="Ask AI"
1422
+ aria-haspopup="menu"
1423
+ [attr.aria-expanded]="!!job"
1424
+ [attr.title]="'Edit or write with AI · ' + aiKbd"
1425
+ [disabled]="!!review"
1426
+ [tabIndex]="focusTb === tools.length ? 0 : -1"
1427
+ (click)="onAiButton($event)"
1428
+ >
1429
+ <vo-icon name="spark"></vo-icon><span>Ask AI</span>
1430
+ </button>
1431
+ }
1432
+ </div>
1433
+
1434
+ <div
1435
+ #body
1436
+ class="vo-rte-body"
1437
+ [class.vo-empty]="empty && !review"
1438
+ contenteditable="true"
1439
+ role="textbox"
1440
+ aria-multiline="true"
1441
+ [attr.aria-label]="label"
1442
+ [attr.aria-placeholder]="placeholder"
1443
+ [attr.data-placeholder]="placeholder"
1444
+ spellcheck="true"
1445
+ ></div>
1446
+
1447
+ <div class="vo-rte-ft">
1448
+ <div class="vo-rte-idle" (mousedown)="keepFocus($event)">
1449
+ <span class="vo-rte-wc vo-num">{{ words === 1 ? '1 word' : words + ' words' }}</span>
1450
+ @if (ai !== false && hint) {
1451
+ <span class="vo-rte-hint">{{ hint }}</span>
1452
+ }
1453
+ <span class="vo-sp"></span>
1454
+ <button type="button" class="vo-ib vo-rte-un" aria-label="Undo" [attr.title]="'Undo · ' + undoKbd" [disabled]="!!review || !canUndo" (click)="doUndo($event)"><vo-icon name="undo"></vo-icon></button>
1455
+ <button type="button" class="vo-ib vo-rte-re" aria-label="Redo" [attr.title]="'Redo · ' + redoKbd" [disabled]="!!review || !canRedo" (click)="doRedo($event)"><vo-icon name="redo"></vo-icon></button>
1456
+ </div>
1457
+ <div class="vo-rte-rev" (mousedown)="keepFocus($event)">
1458
+ <span class="vo-rte-st">
1459
+ @if (review && !review.ready) {
1460
+ <span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
1461
+ <span class="vo-shim">{{ reviewLabel }}</span>
1462
+ } @else if (review) {
1463
+ <vo-icon name="spark"></vo-icon><span>Suggestion ready</span>
1464
+ }
1465
+ </span>
1466
+ <span class="vo-sp"></span>
1467
+ <button type="button" class="vo-pill vo-ghost vo-sm vo-rte-no" (click)="finish(false, $event.isTrusted)">Discard<span class="vo-kbd">Esc</span></button>
1468
+ <button type="button" class="vo-pill vo-accent vo-sm vo-rte-ok" [disabled]="!review?.ready" (click)="finish(true, $event.isTrusted)">Accept<span class="vo-kbd">Tab</span></button>
1469
+ </div>
1470
+ </div>
1471
+
1472
+ @if (ai !== false) {
1473
+ <button
1474
+ #askEl
1475
+ type="button"
1476
+ class="vo-rte-ask"
1477
+ [class.vo-show]="bubble"
1478
+ tabindex="-1"
1479
+ aria-label="Ask AI about the selection"
1480
+ (mousedown)="$event.preventDefault()"
1481
+ (click)="onAskButton($event)"
1482
+ >
1483
+ <vo-icon name="spark"></vo-icon><span>Ask AI</span>
1484
+ </button>
1485
+
1486
+ <div
1487
+ #menuEl
1488
+ class="vo-pop vo-rte-menu"
1489
+ [class.vo-open]="!!job"
1490
+ role="menu"
1491
+ [attr.aria-labelledby]="uid + '-ph'"
1492
+ [attr.inert]="job ? null : ''"
1493
+ (keydown)="menuKey($event)"
1494
+ (mousedown)="$event.preventDefault()"
1495
+ >
1496
+ <div class="vo-ph" [id]="uid + '-ph'">{{ menuHeading }}</div>
1497
+ @for (a of items; track a.key) {
1498
+ <button
1499
+ type="button"
1500
+ class="vo-mi"
1501
+ role="menuitem"
1502
+ tabindex="-1"
1503
+ [attr.data-a]="a.key"
1504
+ [attr.aria-disabled]="a.off"
1505
+ (click)="onMenuItem(a, $event)"
1506
+ >
1507
+ @if (a.icon) { <vo-icon [name]="a.icon"></vo-icon> }
1508
+ <span>{{ a.label }}</span>
1509
+ </button>
1510
+ }
1511
+ </div>
1512
+ }
1513
+
1514
+ <div
1515
+ #lnkEl
1516
+ class="vo-pop vo-rte-lnk"
1517
+ [class.vo-open]="!!lk"
1518
+ role="dialog"
1519
+ aria-label="Link"
1520
+ [attr.inert]="lk ? null : ''"
1521
+ (keydown)="lnkKey($event)"
1522
+ (focusout)="lnkBlur($event)"
1523
+ >
1524
+ <input
1525
+ #urlEl
1526
+ class="vo-rte-url"
1527
+ type="url"
1528
+ placeholder="Paste or type a link"
1529
+ aria-label="Link address"
1530
+ autocomplete="off"
1531
+ spellcheck="false"
1532
+ [value]="url"
1533
+ [attr.aria-invalid]="bad ? 'true' : null"
1534
+ (input)="onUrlInput($event)"
1535
+ />
1536
+ <button type="button" class="vo-pill vo-accent vo-sm vo-rte-lok" (click)="applyLink('')">Apply</button>
1537
+ @if (hasHref && lk) {
1538
+ <button type="button" class="vo-ib vo-rte-lrm" aria-label="Remove link" title="Remove link" (click)="applyLink(null)"><vo-icon name="trash"></vo-icon></button>
1539
+ }
1540
+ </div>
1541
+
1542
+ <p class="vo-rte-live" aria-live="polite">{{ say }}</p>
1543
+ </div>
1544
+ `, isInline: true, styles: [".vo-rte{position:relative;width:100%;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);transition:box-shadow .32s;container:rte/inline-size;--vo-rte-q:var(--vo-muted);--vo-rte-q2:var(--vo-fg2)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}}:root[data-theme=dark] .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}.vo-rte-tb{display:flex;align-items:center;gap:2px;min-width:0;padding:7px var(--vo-s-2);box-shadow:inset 0 -1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-b{width:30px;height:30px;flex:none;display:grid;place-items:center;border-radius:var(--vo-r-sm);color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-rte-b:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-rte-b:is([aria-pressed=true],.vo-on){background:var(--vo-accent-bg);color:var(--vo-accent-fg)}.vo-rte-b:disabled,.vo-rte-ai:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-sep{width:1px;height:16px;margin:0 5px;flex:none;background:var(--vo-line)}.vo-rte-ai{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px 0 9px;flex:none;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-rte-ai .vo-i{color:var(--vo-accent-fg)}.vo-rte-ai[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-rte-ai:hover{background:var(--vo-row)}}.vo-rte-ai:disabled .vo-i{color:inherit}.vo-rte-body{position:relative;height:256px;overflow-y:auto;padding:var(--vo-s-4) 18px;outline:0;font-size:14px;line-height:1.65;color:var(--vo-fg);white-space:pre-wrap;overflow-wrap:break-word;caret-color:var(--vo-accent-fg);cursor:text}.vo-rte-body>*{margin:0;padding:0}.vo-rte-body>*+*{margin-top:6px}.vo-rte-body>*+h2{margin-top:14px}.vo-rte-body h2{font-size:14px;font-weight:500;line-height:1.5;color:var(--vo-fg)}.vo-rte-body :is(b,strong){font-weight:500}.vo-rte-body i{font-style:italic}.vo-rte-body a{color:var(--vo-accent-fg);text-decoration:underline;text-decoration-color:var(--vo-accent-mark);text-underline-offset:2px;cursor:text}.vo-rte-body code{font-family:var(--vo-mono);font-size:12.5px;padding:1px var(--vo-s-1);border-radius:5px;background:var(--vo-chip);color:var(--vo-fg)}.vo-rte-body :is(ul,ol){padding-left:22px}.vo-rte-body ul{list-style:disc}.vo-rte-body ol{list-style:decimal}.vo-rte-body li{padding-left:2px}.vo-rte-body li+li{margin-top:2px}.vo-rte-body li::marker{color:var(--vo-rte-q2)}.vo-rte-body blockquote{padding-left:14px;box-shadow:inset 2px 0 0 var(--vo-rte-q);color:var(--vo-rte-q2)}.vo-rte-body blockquote+blockquote{margin-top:0;padding-top:6px}.vo-rte-body.vo-empty:before{content:attr(data-placeholder);position:absolute;left:18px;right:18px;top:16px;color:var(--vo-rte-q);pointer-events:none}.vo-rte-old{color:var(--vo-rte-q);text-decoration:line-through;text-decoration-color:var(--vo-rte-q)}.vo-rte-new{color:var(--vo-accent-fg);background:var(--vo-sel);border-radius:3px}.vo-rte-old+.vo-rte-new{margin-left:.3em}.vo-rte-new .vo-w{animation:vo-rtew .4s var(--vo-ease) both}@keyframes vo-rtew{0%{opacity:0;filter:blur(3px)}to{opacity:1;filter:none}}::highlight(rte-pick){background-color:color-mix(in srgb,var(--vo-accent-mark) 24%,transparent)}.vo-rte-ft{display:grid;align-items:center;min-height:46px;padding:6px var(--vo-s-2) 6px 18px;box-shadow:inset 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-idle,.vo-rte-rev{grid-area:1/1;display:flex;align-items:center;gap:var(--vo-s-2);min-width:0;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s}.vo-rte-rev,.vo-rte[data-st=review] .vo-rte-idle{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s .35s}.vo-rte-rev{transform:translateY(4px)}.vo-rte[data-st=review] .vo-rte-idle{transform:translateY(-4px)}.vo-rte[data-st=review] .vo-rte-rev{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition-delay:0s}.vo-rte-wc,.vo-rte-hint{font-size:12px;color:var(--vo-rte-q);white-space:nowrap}.vo-rte-hint{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-hint:before{content:\"\\b7\";margin-right:var(--vo-s-2)}.vo-rte-idle .vo-ib{width:28px;height:28px;flex:none}.vo-rte-idle .vo-ib:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-st{display:flex;align-items:center;gap:7px;flex:0 1 auto;min-width:0;font-size:13px;color:var(--vo-rte-q2);white-space:nowrap}.vo-rte-st>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-st .vo-i{color:var(--vo-accent-fg)}.vo-rte-rev .vo-pill{flex:none}.vo-rte-rev .vo-pill.vo-ghost,.vo-rte-rev .vo-kbd,.vo-rte-menu .vo-ph{color:var(--vo-rte-q2)}@media (hover:hover) and (pointer:fine){.vo-rte-rev .vo-pill.vo-ghost:hover{color:var(--vo-fg)}}.vo-rte-menu{width:228px}.vo-rte-menu .vo-mi[aria-disabled=true],.vo-rte-menu .vo-mi[aria-disabled=true] .vo-i{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-rte-lnk{display:flex;align-items:center;gap:6px;width:304px;max-width:calc(100% - 12px);min-width:0;padding:6px}.vo-rte-url{flex:1;min-width:0;height:32px;padding:0 10px;border:0;border-radius:var(--vo-r-field);outline:0;background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);color:var(--vo-fg);font-size:13px}@supports (corner-shape:squircle){.vo-rte-url{corner-shape:squircle;border-radius:var(--vo-r-field-sq)}}.vo-rte-url::placeholder{color:var(--vo-rte-q)}.vo-rte-url:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-rte-url[aria-invalid=true]{box-shadow:inset 0 0 0 1px var(--vo-bad)}.vo-rte-lnk .vo-pill{flex:none}.vo-rte-lnk .vo-ib{width:30px;height:30px;flex:none}.vo-rte-ask{position:absolute;left:0;top:0;z-index:6;display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px 0 9px;border-radius:var(--vo-r-pill);background:var(--vo-raised);box-shadow:var(--vo-shadow-pop);font-size:12.5px;color:var(--vo-fg);white-space:nowrap;cursor:pointer;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .18s var(--vo-ease),transform .3s var(--vo-ease),visibility 0s .3s}.vo-rte-ask .vo-i{color:var(--vo-accent-fg)}@media (hover:hover) and (pointer:fine){.vo-rte-ask:hover{background:color-mix(in srgb,var(--vo-fg) 4%,var(--vo-raised))}}.vo-rte-ask.vo-show{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-rte-live{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container rte (max-width:520px){.vo-rte-hint{display:none}}@container rte (max-width:400px){.vo-rte-ai{width:30px;padding:0;justify-content:center}.vo-rte-ai span{display:none}.vo-rte-sep{margin:0 2px}.vo-rte-body{padding:14px}.vo-rte-body.vo-empty:before{left:14px;right:14px;top:14px}.vo-rte-ft{padding-left:14px}.vo-rte-rev .vo-kbd{display:none}}@container rte (max-width:330px){.vo-rte-tb{gap:0;padding:7px var(--vo-s-1)}.vo-rte-b{width:28px}}:root:not([data-style=soft]) .vo-rte-b:is([aria-pressed=true],.vo-on):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-accent-mark) 50%,transparent)}:root:not([data-style=soft]) .vo-rte-new:not(:where([data-style=soft],[data-style=soft] *)){background:var(--vo-accent-bg);box-shadow:inset 0 -1px 0 var(--vo-accent-mark)}.vo-pop{position:absolute;left:0;top:0;z-index:7;background:var(--vo-raised);border-radius:var(--vo-r-inner);box-shadow:var(--vo-shadow-pop);padding:5px;opacity:0;visibility:hidden;transform:translateY(4px) scale(.98);transform-origin:top left;transition:opacity .16s var(--vo-ease),transform .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-ph{padding:6px 10px 4px;font-size:11.5px;font-weight:500}.vo-mi{display:flex;align-items:center;gap:9px;width:100%;padding:7px 10px;border-radius:var(--vo-r-sm);font-size:13px;color:var(--vo-fg);cursor:pointer;text-align:left}.vo-mi .vo-i{color:var(--vo-fg2);flex:none}@media (hover:hover) and (pointer:fine){.vo-mi:hover:not([aria-disabled=true]){background:var(--vo-row)}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill:disabled{opacity:1;cursor:not-allowed;background:var(--vo-chip);color:var(--vo-dis)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{display:inline-flex;align-items:center;height:16px;padding:0 4px;border-radius:4px;background:color-mix(in srgb,var(--vo-fg) 8%,transparent);font-size:10.5px;font-weight:500;line-height:1}.vo-num{font-variant-numeric:tabular-nums}.vo-sp{flex:1;min-width:0}.vo-think{display:inline-flex;align-items:center;gap:3px;flex:none}.vo-think i{width:4px;height:4px;border-radius:50%;background:var(--vo-accent-fg);opacity:.4;animation:vo-thk 1s var(--vo-ease) infinite}.vo-think i:nth-child(2){animation-delay:.12s}.vo-think i:nth-child(3){animation-delay:.24s}.vo-think i:nth-child(4){animation-delay:.36s}@keyframes vo-thk{0%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.vo-shim{background:linear-gradient(90deg,var(--vo-rte-q2) 40%,var(--vo-fg) 50%,var(--vo-rte-q2) 60%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 1.4s linear infinite}@keyframes vo-shim{to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.vo-rte-new .vo-w,.vo-think i,.vo-shim,.vo-rte-idle,.vo-rte-rev,.vo-rte-ask,.vo-pop{animation:none!important;transition:none!important}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
1545
+ }
1546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichTextEditorComponent, decorators: [{
1547
+ type: Component,
1548
+ args: [{ selector: 'vo-rich-text-editor', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
1549
+ <div
1550
+ data-vo=""
1551
+ #root
1552
+ class="vo-rte"
1553
+ [attr.data-st]="review ? 'review' : 'edit'"
1554
+ (keydown)="onRootKey($event)"
1555
+ (pointerdown)="onRootPointerDown($event)"
1556
+ >
1557
+ <div
1558
+ #tb
1559
+ class="vo-rte-tb"
1560
+ role="toolbar"
1561
+ aria-label="Formatting"
1562
+ (mousedown)="keepFocus($event)"
1563
+ (keydown)="tbKey($event)"
1564
+ >
1565
+ @for (t of tools; track t.f; let i = $index) {
1566
+ @if (i === 5) {
1567
+ <span class="vo-rte-sep" aria-hidden="true"></span>
1568
+ }
1569
+ <button
1570
+ type="button"
1571
+ class="vo-rte-b"
1572
+ [class.vo-on]="t.f === 'a' && t.on && !review"
1573
+ [attr.data-f]="t.f"
1574
+ [attr.aria-label]="t.label"
1575
+ [attr.title]="t.label + ' · ' + t.kbd"
1576
+ [disabled]="!!review"
1577
+ [tabIndex]="focusTb === i ? 0 : -1"
1578
+ [attr.aria-haspopup]="t.f === 'a' ? 'dialog' : null"
1579
+ [attr.aria-expanded]="t.f === 'a' ? !!lk : null"
1580
+ [attr.aria-pressed]="t.f !== 'a' ? (!review && t.on) : null"
1581
+ (click)="apply(t.f, $event)"
1582
+ >
1583
+ <vo-icon [name]="t.icon" size="md"></vo-icon>
1584
+ </button>
1585
+ }
1586
+ <span class="vo-sp"></span>
1587
+ @if (ai !== false) {
1588
+ <button
1589
+ type="button"
1590
+ class="vo-rte-ai"
1591
+ aria-label="Ask AI"
1592
+ aria-haspopup="menu"
1593
+ [attr.aria-expanded]="!!job"
1594
+ [attr.title]="'Edit or write with AI · ' + aiKbd"
1595
+ [disabled]="!!review"
1596
+ [tabIndex]="focusTb === tools.length ? 0 : -1"
1597
+ (click)="onAiButton($event)"
1598
+ >
1599
+ <vo-icon name="spark"></vo-icon><span>Ask AI</span>
1600
+ </button>
1601
+ }
1602
+ </div>
1603
+
1604
+ <div
1605
+ #body
1606
+ class="vo-rte-body"
1607
+ [class.vo-empty]="empty && !review"
1608
+ contenteditable="true"
1609
+ role="textbox"
1610
+ aria-multiline="true"
1611
+ [attr.aria-label]="label"
1612
+ [attr.aria-placeholder]="placeholder"
1613
+ [attr.data-placeholder]="placeholder"
1614
+ spellcheck="true"
1615
+ ></div>
1616
+
1617
+ <div class="vo-rte-ft">
1618
+ <div class="vo-rte-idle" (mousedown)="keepFocus($event)">
1619
+ <span class="vo-rte-wc vo-num">{{ words === 1 ? '1 word' : words + ' words' }}</span>
1620
+ @if (ai !== false && hint) {
1621
+ <span class="vo-rte-hint">{{ hint }}</span>
1622
+ }
1623
+ <span class="vo-sp"></span>
1624
+ <button type="button" class="vo-ib vo-rte-un" aria-label="Undo" [attr.title]="'Undo · ' + undoKbd" [disabled]="!!review || !canUndo" (click)="doUndo($event)"><vo-icon name="undo"></vo-icon></button>
1625
+ <button type="button" class="vo-ib vo-rte-re" aria-label="Redo" [attr.title]="'Redo · ' + redoKbd" [disabled]="!!review || !canRedo" (click)="doRedo($event)"><vo-icon name="redo"></vo-icon></button>
1626
+ </div>
1627
+ <div class="vo-rte-rev" (mousedown)="keepFocus($event)">
1628
+ <span class="vo-rte-st">
1629
+ @if (review && !review.ready) {
1630
+ <span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>
1631
+ <span class="vo-shim">{{ reviewLabel }}</span>
1632
+ } @else if (review) {
1633
+ <vo-icon name="spark"></vo-icon><span>Suggestion ready</span>
1634
+ }
1635
+ </span>
1636
+ <span class="vo-sp"></span>
1637
+ <button type="button" class="vo-pill vo-ghost vo-sm vo-rte-no" (click)="finish(false, $event.isTrusted)">Discard<span class="vo-kbd">Esc</span></button>
1638
+ <button type="button" class="vo-pill vo-accent vo-sm vo-rte-ok" [disabled]="!review?.ready" (click)="finish(true, $event.isTrusted)">Accept<span class="vo-kbd">Tab</span></button>
1639
+ </div>
1640
+ </div>
1641
+
1642
+ @if (ai !== false) {
1643
+ <button
1644
+ #askEl
1645
+ type="button"
1646
+ class="vo-rte-ask"
1647
+ [class.vo-show]="bubble"
1648
+ tabindex="-1"
1649
+ aria-label="Ask AI about the selection"
1650
+ (mousedown)="$event.preventDefault()"
1651
+ (click)="onAskButton($event)"
1652
+ >
1653
+ <vo-icon name="spark"></vo-icon><span>Ask AI</span>
1654
+ </button>
1655
+
1656
+ <div
1657
+ #menuEl
1658
+ class="vo-pop vo-rte-menu"
1659
+ [class.vo-open]="!!job"
1660
+ role="menu"
1661
+ [attr.aria-labelledby]="uid + '-ph'"
1662
+ [attr.inert]="job ? null : ''"
1663
+ (keydown)="menuKey($event)"
1664
+ (mousedown)="$event.preventDefault()"
1665
+ >
1666
+ <div class="vo-ph" [id]="uid + '-ph'">{{ menuHeading }}</div>
1667
+ @for (a of items; track a.key) {
1668
+ <button
1669
+ type="button"
1670
+ class="vo-mi"
1671
+ role="menuitem"
1672
+ tabindex="-1"
1673
+ [attr.data-a]="a.key"
1674
+ [attr.aria-disabled]="a.off"
1675
+ (click)="onMenuItem(a, $event)"
1676
+ >
1677
+ @if (a.icon) { <vo-icon [name]="a.icon"></vo-icon> }
1678
+ <span>{{ a.label }}</span>
1679
+ </button>
1680
+ }
1681
+ </div>
1682
+ }
1683
+
1684
+ <div
1685
+ #lnkEl
1686
+ class="vo-pop vo-rte-lnk"
1687
+ [class.vo-open]="!!lk"
1688
+ role="dialog"
1689
+ aria-label="Link"
1690
+ [attr.inert]="lk ? null : ''"
1691
+ (keydown)="lnkKey($event)"
1692
+ (focusout)="lnkBlur($event)"
1693
+ >
1694
+ <input
1695
+ #urlEl
1696
+ class="vo-rte-url"
1697
+ type="url"
1698
+ placeholder="Paste or type a link"
1699
+ aria-label="Link address"
1700
+ autocomplete="off"
1701
+ spellcheck="false"
1702
+ [value]="url"
1703
+ [attr.aria-invalid]="bad ? 'true' : null"
1704
+ (input)="onUrlInput($event)"
1705
+ />
1706
+ <button type="button" class="vo-pill vo-accent vo-sm vo-rte-lok" (click)="applyLink('')">Apply</button>
1707
+ @if (hasHref && lk) {
1708
+ <button type="button" class="vo-ib vo-rte-lrm" aria-label="Remove link" title="Remove link" (click)="applyLink(null)"><vo-icon name="trash"></vo-icon></button>
1709
+ }
1710
+ </div>
1711
+
1712
+ <p class="vo-rte-live" aria-live="polite">{{ say }}</p>
1713
+ </div>
1714
+ `, styles: [".vo-rte{position:relative;width:100%;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);transition:box-shadow .32s;container:rte/inline-size;--vo-rte-q:var(--vo-muted);--vo-rte-q2:var(--vo-fg2)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}}:root[data-theme=dark] .vo-rte{--vo-rte-q:color-mix(in srgb,var(--vo-fg) 74%,var(--vo-surface));--vo-rte-q2:color-mix(in srgb,var(--vo-fg) 80%,var(--vo-surface))}.vo-rte-tb{display:flex;align-items:center;gap:2px;min-width:0;padding:7px var(--vo-s-2);box-shadow:inset 0 -1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-b{width:30px;height:30px;flex:none;display:grid;place-items:center;border-radius:var(--vo-r-sm);color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-rte-b:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-rte-b:is([aria-pressed=true],.vo-on){background:var(--vo-accent-bg);color:var(--vo-accent-fg)}.vo-rte-b:disabled,.vo-rte-ai:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-sep{width:1px;height:16px;margin:0 5px;flex:none;background:var(--vo-line)}.vo-rte-ai{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 11px 0 9px;flex:none;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-rte-ai .vo-i{color:var(--vo-accent-fg)}.vo-rte-ai[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-rte-ai:hover{background:var(--vo-row)}}.vo-rte-ai:disabled .vo-i{color:inherit}.vo-rte-body{position:relative;height:256px;overflow-y:auto;padding:var(--vo-s-4) 18px;outline:0;font-size:14px;line-height:1.65;color:var(--vo-fg);white-space:pre-wrap;overflow-wrap:break-word;caret-color:var(--vo-accent-fg);cursor:text}.vo-rte-body>*{margin:0;padding:0}.vo-rte-body>*+*{margin-top:6px}.vo-rte-body>*+h2{margin-top:14px}.vo-rte-body h2{font-size:14px;font-weight:500;line-height:1.5;color:var(--vo-fg)}.vo-rte-body :is(b,strong){font-weight:500}.vo-rte-body i{font-style:italic}.vo-rte-body a{color:var(--vo-accent-fg);text-decoration:underline;text-decoration-color:var(--vo-accent-mark);text-underline-offset:2px;cursor:text}.vo-rte-body code{font-family:var(--vo-mono);font-size:12.5px;padding:1px var(--vo-s-1);border-radius:5px;background:var(--vo-chip);color:var(--vo-fg)}.vo-rte-body :is(ul,ol){padding-left:22px}.vo-rte-body ul{list-style:disc}.vo-rte-body ol{list-style:decimal}.vo-rte-body li{padding-left:2px}.vo-rte-body li+li{margin-top:2px}.vo-rte-body li::marker{color:var(--vo-rte-q2)}.vo-rte-body blockquote{padding-left:14px;box-shadow:inset 2px 0 0 var(--vo-rte-q);color:var(--vo-rte-q2)}.vo-rte-body blockquote+blockquote{margin-top:0;padding-top:6px}.vo-rte-body.vo-empty:before{content:attr(data-placeholder);position:absolute;left:18px;right:18px;top:16px;color:var(--vo-rte-q);pointer-events:none}.vo-rte-old{color:var(--vo-rte-q);text-decoration:line-through;text-decoration-color:var(--vo-rte-q)}.vo-rte-new{color:var(--vo-accent-fg);background:var(--vo-sel);border-radius:3px}.vo-rte-old+.vo-rte-new{margin-left:.3em}.vo-rte-new .vo-w{animation:vo-rtew .4s var(--vo-ease) both}@keyframes vo-rtew{0%{opacity:0;filter:blur(3px)}to{opacity:1;filter:none}}::highlight(rte-pick){background-color:color-mix(in srgb,var(--vo-accent-mark) 24%,transparent)}.vo-rte-ft{display:grid;align-items:center;min-height:46px;padding:6px var(--vo-s-2) 6px 18px;box-shadow:inset 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-rte-idle,.vo-rte-rev{grid-area:1/1;display:flex;align-items:center;gap:var(--vo-s-2);min-width:0;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s}.vo-rte-rev,.vo-rte[data-st=review] .vo-rte-idle{opacity:0;visibility:hidden;pointer-events:none;transition:opacity .25s var(--vo-ease),transform .35s var(--vo-ease),visibility 0s .35s}.vo-rte-rev{transform:translateY(4px)}.vo-rte[data-st=review] .vo-rte-idle{transform:translateY(-4px)}.vo-rte[data-st=review] .vo-rte-rev{opacity:1;visibility:visible;pointer-events:auto;transform:none;transition-delay:0s}.vo-rte-wc,.vo-rte-hint{font-size:12px;color:var(--vo-rte-q);white-space:nowrap}.vo-rte-hint{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-hint:before{content:\"\\b7\";margin-right:var(--vo-s-2)}.vo-rte-idle .vo-ib{width:28px;height:28px;flex:none}.vo-rte-idle .vo-ib:disabled{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-st{display:flex;align-items:center;gap:7px;flex:0 1 auto;min-width:0;font-size:13px;color:var(--vo-rte-q2);white-space:nowrap}.vo-rte-st>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-rte-st .vo-i{color:var(--vo-accent-fg)}.vo-rte-rev .vo-pill{flex:none}.vo-rte-rev .vo-pill.vo-ghost,.vo-rte-rev .vo-kbd,.vo-rte-menu .vo-ph{color:var(--vo-rte-q2)}@media (hover:hover) and (pointer:fine){.vo-rte-rev .vo-pill.vo-ghost:hover{color:var(--vo-fg)}}.vo-rte-menu{width:228px}.vo-rte-menu .vo-mi[aria-disabled=true],.vo-rte-menu .vo-mi[aria-disabled=true] .vo-i{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-rte-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-rte-lnk{display:flex;align-items:center;gap:6px;width:304px;max-width:calc(100% - 12px);min-width:0;padding:6px}.vo-rte-url{flex:1;min-width:0;height:32px;padding:0 10px;border:0;border-radius:var(--vo-r-field);outline:0;background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);color:var(--vo-fg);font-size:13px}@supports (corner-shape:squircle){.vo-rte-url{corner-shape:squircle;border-radius:var(--vo-r-field-sq)}}.vo-rte-url::placeholder{color:var(--vo-rte-q)}.vo-rte-url:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-rte-url[aria-invalid=true]{box-shadow:inset 0 0 0 1px var(--vo-bad)}.vo-rte-lnk .vo-pill{flex:none}.vo-rte-lnk .vo-ib{width:30px;height:30px;flex:none}.vo-rte-ask{position:absolute;left:0;top:0;z-index:6;display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 11px 0 9px;border-radius:var(--vo-r-pill);background:var(--vo-raised);box-shadow:var(--vo-shadow-pop);font-size:12.5px;color:var(--vo-fg);white-space:nowrap;cursor:pointer;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .18s var(--vo-ease),transform .3s var(--vo-ease),visibility 0s .3s}.vo-rte-ask .vo-i{color:var(--vo-accent-fg)}@media (hover:hover) and (pointer:fine){.vo-rte-ask:hover{background:color-mix(in srgb,var(--vo-fg) 4%,var(--vo-raised))}}.vo-rte-ask.vo-show{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-rte-live{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container rte (max-width:520px){.vo-rte-hint{display:none}}@container rte (max-width:400px){.vo-rte-ai{width:30px;padding:0;justify-content:center}.vo-rte-ai span{display:none}.vo-rte-sep{margin:0 2px}.vo-rte-body{padding:14px}.vo-rte-body.vo-empty:before{left:14px;right:14px;top:14px}.vo-rte-ft{padding-left:14px}.vo-rte-rev .vo-kbd{display:none}}@container rte (max-width:330px){.vo-rte-tb{gap:0;padding:7px var(--vo-s-1)}.vo-rte-b{width:28px}}:root:not([data-style=soft]) .vo-rte-b:is([aria-pressed=true],.vo-on):not(:where([data-style=soft],[data-style=soft] *)){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-accent-mark) 50%,transparent)}:root:not([data-style=soft]) .vo-rte-new:not(:where([data-style=soft],[data-style=soft] *)){background:var(--vo-accent-bg);box-shadow:inset 0 -1px 0 var(--vo-accent-mark)}.vo-pop{position:absolute;left:0;top:0;z-index:7;background:var(--vo-raised);border-radius:var(--vo-r-inner);box-shadow:var(--vo-shadow-pop);padding:5px;opacity:0;visibility:hidden;transform:translateY(4px) scale(.98);transform-origin:top left;transition:opacity .16s var(--vo-ease),transform .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;transform:none;transition-delay:0s}.vo-ph{padding:6px 10px 4px;font-size:11.5px;font-weight:500}.vo-mi{display:flex;align-items:center;gap:9px;width:100%;padding:7px 10px;border-radius:var(--vo-r-sm);font-size:13px;color:var(--vo-fg);cursor:pointer;text-align:left}.vo-mi .vo-i{color:var(--vo-fg2);flex:none}@media (hover:hover) and (pointer:fine){.vo-mi:hover:not([aria-disabled=true]){background:var(--vo-row)}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill:disabled{opacity:1;cursor:not-allowed;background:var(--vo-chip);color:var(--vo-dis)}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-kbd{display:inline-flex;align-items:center;height:16px;padding:0 4px;border-radius:4px;background:color-mix(in srgb,var(--vo-fg) 8%,transparent);font-size:10.5px;font-weight:500;line-height:1}.vo-num{font-variant-numeric:tabular-nums}.vo-sp{flex:1;min-width:0}.vo-think{display:inline-flex;align-items:center;gap:3px;flex:none}.vo-think i{width:4px;height:4px;border-radius:50%;background:var(--vo-accent-fg);opacity:.4;animation:vo-thk 1s var(--vo-ease) infinite}.vo-think i:nth-child(2){animation-delay:.12s}.vo-think i:nth-child(3){animation-delay:.24s}.vo-think i:nth-child(4){animation-delay:.36s}@keyframes vo-thk{0%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.vo-shim{background:linear-gradient(90deg,var(--vo-rte-q2) 40%,var(--vo-fg) 50%,var(--vo-rte-q2) 60%);background-size:200% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 1.4s linear infinite}@keyframes vo-shim{to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.vo-rte-new .vo-w,.vo-think i,.vo-shim,.vo-rte-idle,.vo-rte-rev,.vo-rte-ask,.vo-pop{animation:none!important;transition:none!important}}\n"] }]
1715
+ }], propDecorators: { value: [{
1716
+ type: Input
1717
+ }], defaultValue: [{
1718
+ type: Input
1719
+ }], placeholder: [{
1720
+ type: Input
1721
+ }], label: [{
1722
+ type: Input
1723
+ }], hint: [{
1724
+ type: Input
1725
+ }], ai: [{
1726
+ type: Input
1727
+ }], aiActions: [{
1728
+ type: Input
1729
+ }], valueChange: [{
1730
+ type: Output
1731
+ }], suggestion: [{
1732
+ type: Output
1733
+ }], rootRef: [{
1734
+ type: ViewChild,
1735
+ args: ['root']
1736
+ }], tbRef: [{
1737
+ type: ViewChild,
1738
+ args: ['tb']
1739
+ }], bodyRef: [{
1740
+ type: ViewChild,
1741
+ args: ['body']
1742
+ }], askRef: [{
1743
+ type: ViewChild,
1744
+ args: ['askEl']
1745
+ }], menuRef: [{
1746
+ type: ViewChild,
1747
+ args: ['menuEl']
1748
+ }], lnkRef: [{
1749
+ type: ViewChild,
1750
+ args: ['lnkEl']
1751
+ }], urlRef: [{
1752
+ type: ViewChild,
1753
+ args: ['urlEl']
1754
+ }] } });
1755
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC10ZXh0LWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9yaWNoLXRleHQtZWRpdG9yL3JpY2gtdGV4dC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHdFQUF3RTtBQUN4RSxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsb0ZBQW9GO0FBQ3BGLEVBQUU7QUFDRiw4RUFBOEU7QUFDOUUsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsbURBQW1EO0FBQ25ELDhFQUE4RTtBQUU5RSxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBcUN0RSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztBQUNsQyxNQUFNLEtBQUssR0FBRyx3SkFBd0osQ0FBQztBQUN2SyxNQUFNLElBQUksR0FBRyx5SkFBeUosQ0FBQztBQUN2SyxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdILE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLEdB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Q0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sQ0FBQyxDQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sQ0FBQyxFQUFVLElBQUksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hNLElBQUksQ0FBQyxDQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENB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RyxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDckcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdkUsQ0FBQztJQUVELHNCQUFzQjtJQUNkLElBQUksS0FBSyxNQUFNLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZNLEdBQUc7UUFDRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENB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QkFBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQWlCLENBQUM7b0JBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0osSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLENBQUM7WUFDdEksQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUNPLEtBQUssQ0FBQyxDQUFTLElBQVksT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdE4sS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdkgsb0JBQW9CO0lBQ1osT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLEdBQVk7UUFDekIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztRQUN6SCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHO2dCQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUFDLENBQUM7UUFDdE4sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLEtBQUssQ0FBQyxHQUFtQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hPLE9BQU8sQ0FBQyxJQUFZLEVBQUUsR0FBa0IsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEosSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2TCxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3SixJQUFJLENBQUMsSUFBWTtRQUNmLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDekgsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNKLENBQUM7SUFFRCxrQkFBa0I7SUFDVixLQUFLLEtBQUssTUFBTSxHQUFHLEdBQXFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQWlCLENBQUMsRUFBRSxDQUFDO1FBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNSLEdBQUcsQ0FBQyxFQUFVLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0gsT0FBTyxDQUFDLENBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xLLEdBQUcsQ0FBQyxHQUFXLEVBQUUsQ0FBUztRQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyRixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFD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LE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQUUsU0FBUztnQkFDOUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDNUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFTLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxDQUFDO1FBQ25LLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFDTyxHQUFHLENBQUMsQ0FBUztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFBQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxDQUFDO1FBQ3RKLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoSSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFrQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDL0csSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMzTCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEgsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDZixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkksQ0FBQztJQUNPLFFBQVEsQ0FBQyxDQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDdEcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUNPLE1BQU0sQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUNqQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQUcsQ0FBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDN0gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUNPLFdBQVcsQ0FBQyxLQUFhLEVBQUUsQ0FBUztRQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0csTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNILElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFrQixFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2SixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBQyxPQUFPLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQVMsRUFBRSxJQUFtQjtRQUNqQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUM3TCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDN0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwSSxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE9BQU8sQ0FBQyxDQUFTLEVBQUUsSUFBb0I7UUFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDL0IsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBQUMsRUFBRSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFDckcsTUFBTSxJQUFJLEdBQWtCLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUFFLFNBQVM7Z0JBQ3RILE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFBQyxFQUFFLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztnQkFDbEcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsQ0FBUyxFQUFFLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3TCxDQUFDO0lBQ08sSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlKLE1BQU07UUFDSixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDL0YsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuSyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENB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Q0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDM0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDdEssSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsS0FBSyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDN0gsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ08sTUFBTSxDQUFDLENBQVk7UUFDekIsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDMUYsTUFBTSxHQUFHLEdBQUcsUUFBdUwsQ0FBQztRQUNwTSxJQUFJLEVBQUUsR0FBMEIsSUFBSSxDQUFDO1FBQ3JDLElBQUksR0FBRyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFBQyxJQUFJLEVBQUU7Z0JBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFBQyxDQUFDO2FBQ3BJLElBQUksR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUM7Z0JBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQzdJLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzSyxDQUFDO0lBQ08sU0FBUyxDQUFDLENBQWdCO1FBQ2hDLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDaEQsSUFBSSxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDckIsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM5RyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDdEwsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0wsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUFDLEdBQUcsRUFBRSxDQUFDO1FBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsaURBQWlEO0lBQ2pELEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLFNBQVMsS0FBSyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELEtBQUssS0FBSyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEgsS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILElBQUksQ0FBQyxFQUFVLElBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVILEtBQUs7UUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JOLENBQUM7SUFDRCxNQUFNLENBQUMsQ0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLENBQVMsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUssSUFBSSxDQUFDLENBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxLQUFLLFlBQVksQ0FBQyxJQUFJLENB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TUFBTSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBZSxFQUFFLEVBQUU7WUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQWMsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFD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QUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3hHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNILEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMvRSxDQUFDO0lBQ08sSUFBSSxDQUFDLENBQWdCO1FBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUUsR0FBMkQsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM3SCxNQUFNLEVBQUUsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFFLE1BQTBELENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDN0gsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUM5RSxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDTyxVQUFVLENBQUMsQ0FBVTtRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLFlBQVksRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFD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V0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25LLFFBQVEsQ0FBQyxHQUFvRDtRQUMzRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLO1lBQUUsT0FBTztRQUN6RSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLEtBQUssS0FBSyxJQUFJO1lBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3RCxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssUUFBUTtZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1SSxDQUFDO0lBQ0QsU0FBUyxDQUFDLElBQWE7UUFDckIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUNuQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0MsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFjLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQUMsQ0FBQzthQUMxSSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBZ0I7UUFDdEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFrQyxDQUFDLENBQUM7UUFDN0YsTUFBTSxFQUFFLEdBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFvRCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2TSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUFDLENBQUM7YUFDOUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFDLENBQUM7YUFDN0csSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsSUFBSSxHQUFHO2dCQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO0lBQ3hRLENBQUM7SUFDRCxVQUFVLENBQUMsQ0FBZ0MsRUFBRSxDQUFhLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHO1FBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakcsSUFBSSxDQUFDLENBQVksSUFBUyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSSxHQUFHLENBQUMsR0FBVyxFQUFFLElBQWE7UUFDNUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksTUFBTSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFO1lBQUUsT0FBTztRQUNsRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFBQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ2xMLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDO1FBQ2hDLElBQUksSUFBSSxLQUFLLEtBQUs7WUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUN0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1FBQ25DLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxlQUFlLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3pGLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEtB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LEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDckYsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFDLE9BQU8sSUFBSSxDQUFDO0lBQzFILENBQUM7SUFDRCxRQUFRLENBQUMsQ0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxPQUFPLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLENBQWlCLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRTtRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssTUFBTTtRQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7O1FBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUssTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxDQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsT0FBTyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOytHQWxTakIsdUJBQXVCO21HQUF2Qix1QkFBdUIsdzRCQXpLeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzS1QseTBWQXZLUyxlQUFlOzs0RkEwS2QsdUJBQXVCO2tCQTlLbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZUFBZSxDQUFDLFlBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0tUOzhCQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFFRyxFQUFFO3NCQUFWLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFHSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRW9CLE9BQU87c0JBQWpDLFNBQVM7dUJBQUMsTUFBTTtnQkFDUSxLQUFLO3NCQUE3QixTQUFTO3VCQUFDLElBQUk7Z0JBQ1ksT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNO2dCQUNXLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsT0FBTztnQkFDVyxPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1MsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxPQUFPO2dCQUNVLE1BQU07c0JBQWpDLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3JpY2gtdGV4dC1lZGl0b3IvcmljaC10ZXh0LWVkaXRvci5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9yaWNoLXRleHQtZWRpdG9yL1JpY2hUZXh0RWRpdG9yLnRzeFxuLy8gKGVuZ2luZSBmcm9tIGZyYW1ld29yay92YW5pbGxhL3JpY2gtdGV4dC1lZGl0b3IvcmljaC10ZXh0LWVkaXRvci5qcykuXG4vL1xuLy8gQSBtaW5pbWFsIGVkaXRvciBmb3IgYSBkcmFmdCBhbiBhZ2VudCBoZWxwcyB3aXRoOiBhIGZvcm1hdHRpbmcgdG9vbGJhciwgYVxuLy8gbmF0aXZlIGNvbnRlbnRlZGl0YWJsZSBib2R5LCBhbmQgYSBxdWlldCBmb290IHdpdGggdGhlIHdvcmQgY291bnQgYW5kIHVuZG8uXG4vLyBTZWxlY3QgdGV4dCBhbmQgcHJlc3MgQXNrIEFJIChvciBNb2QrSiwgb3IgdHlwZSAvIG9uIGEgbmV3IGxpbmUpLCBhbmQgYVxuLy8gc3VnZ2VzdGlvbiBzdHJlYW1zIGluIGJlc2lkZSB0aGUgdGV4dCDigJQgdGhlIG9sZCB3b3JkcyBzdHJ1Y2sgdGhyb3VnaCwgdGhlIG5ld1xuLy8gb25lcyBhcnJpdmluZyB3b3JkIGJ5IHdvcmQg4oCUIHRvIGFjY2VwdCB3aXRoIFRhYi9FbnRlciBvciBkaXNjYXJkIHdpdGggRXNjYXBlLlxuLy9cbi8vIFRoZSBlZGl0aW5nIGVuZ2luZSBpcyBwb3J0ZWQgdmVyYmF0aW0gZnJvbSB0aGUgUmVhY3QgYGNyZWF0ZUVuZ2luZWAgaW50byB0aGVcbi8vIGBSdGVFbmdpbmVgIGNsYXNzIGJlbG93OyB0aGUgY29tcG9uZW50IGRyaXZlcyBhIG5hdGl2ZSBjb250ZW50ZWRpdGFibGUgZGl2IHZpYVxuLy8gQFZpZXdDaGlsZC9FbGVtZW50UmVmIGV4YWN0bHkgYXMgdGhlIFJlYWN0IGNvZGUgZHJpdmVzIGl0cyBgZWRgIHJlZi4gU2V0dXAgaW5cbi8vIG5nQWZ0ZXJWaWV3SW5pdCwgY2xlYW51cCBpbiBuZ09uRGVzdHJveS4gUmVkdWNlZCBtb3Rpb24gdmlhIFJlZHVjZWRNb3Rpb25TZXJ2aWNlLlxuLy9cbi8vIEljb24gc3Vic3RpdHV0aW9ucyAodGhlIHNoYXJlZCBBbmd1bGFyIGljb24gc2V0IGhhcyBubyBoZWFkaW5nL2JvbGQvaXRhbGljL1xuLy8gY29kZS9saW5rL2xpc3QvcXVvdGUvd2FuZCBnbHlwaHMsIHNvIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBhcmUgdXNlZCk6XG4vLyAgIGhlYWRpbmcgLT4gZmlsZS10ZXh0ICAgYm9sZCAtPiBlZGl0ICAgICAgaXRhbGljIC0+IHByICAgICBjb2RlIC0+IHRlcm1cbi8vICAgbGluayAgICAtPiBleHQgICAgICAgICBidWxsZXRlZCBsaXN0IC0+IG1vcmUgICBudW1iZXJlZCBsaXN0IC0+IG1vcmVcbi8vICAgcXVvdGUgICAtPiBjb21tZW50ICAgICB3YW5kIChJbXByb3ZlKSAtPiBzcGFya1xuLy8gVGhlIHJlbWFpbmluZyBpY29ucyAoc3BhcmssIG1pbnVzLCBjaGVjaywgZWRpdCwgdW5kbywgcmVkbywgdHJhc2gpIG1hcCAxOjEuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBBIGZvcm1hdHRpbmcgY29tbWFuZCwgYXMgdGhlIHRvb2xiYXIgYW5kIHRoZSBzaG9ydGN1dHMgYXBwbHkgaXQuIGBwYCB0dXJucyBsaW5lcyBiYWNrIGludG8gcGxhaW4gcGFyYWdyYXBocyAqL1xuZXhwb3J0IHR5cGUgUmljaFRleHRGb3JtYXQgPSAnaDInIHwgJ2InIHwgJ2knIHwgJ2NvZGUnIHwgJ3VsJyB8ICdvbCcgfCAncXVvdGUnIHwgJ3AnO1xuXG4vKiogQW4gaXRlbSBpbiB0aGUgQUkgbWVudSAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEFpQWN0aW9uIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb24/OiBWb0ljb25OYW1lO1xuICAvKiogYHN3YXBgICh0aGUgZGVmYXVsdCkgcmVwbGFjZXMgdGhlIHNlbGVjdGlvbiBvciB0aGUgY2FyZXQncyBwYXJhZ3JhcGg7IGBhZGRgIHdyaXRlcyBvbiBhZnRlciBpdCAqL1xuICBraW5kPzogJ3N3YXAnIHwgJ2FkZCc7XG59XG5cbi8qKiBXaGF0IHRoZSBBSSBpcyBhc2tlZCB0byBkby4gYHRleHRgIGlzIHdoYXQgaXQgYWN0cyBvbiAoZW1wdHkgZm9yIGFuIGBhZGRgKSwgYGJlZm9yZWAvYGFmdGVyYCB0aGUgdGV4dCBhcm91bmQgaXQgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRBaVJlcXVlc3Qge1xuICBhY3Rpb246IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBiZWZvcmU6IHN0cmluZztcbiAgYWZ0ZXI6IHN0cmluZztcbiAgZG9jdW1lbnQ6IHN0cmluZztcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIFdyaXRlcyBhIHN1Z2dlc3Rpb246IGEgc3RyaW5nLCBhIHByb21pc2Ugb2Ygb25lLCBvciBhbiBhc3luYyBpdGVyYWJsZSBvZiBjaHVua3MgdG8gc3RyZWFtIGl0IGluICovXG5leHBvcnQgdHlwZSBSaWNoVGV4dEFpID0gKHJlcXVlc3Q6IFJpY2hUZXh0QWlSZXF1ZXN0KSA9PiBBc3luY0l0ZXJhYmxlPHN0cmluZz4gfCBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmc7XG5cbi8qKiBUaGUgcmVzdWx0IHJlcG9ydGVkIHdoZW4gYSBzdWdnZXN0aW9uIGlzIGFjY2VwdGVkIG9yIGRpc2NhcmRlZCAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFN1Z2dlc3Rpb25SZXN1bHQge1xuICBhY3Rpb246IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBhY2NlcHRlZDogYm9vbGVhbjtcbn1cblxudHlwZSBSYW5nZTIgPSB7IHM6IG51bWJlcjsgZTogbnVtYmVyIH07XG50eXBlIExpbmUgPSB7IHQ6IHN0cmluZzsgZnJhZzogRG9jdW1lbnRGcmFnbWVudDsgbGVuOiBudW1iZXIgfTtcblxuY29uc3QgTEVBRiA9ICdwLGgyLGJsb2NrcXVvdGUsbGknO1xuY29uc3QgQkxPQ0sgPSAvXihQfERJVnxIWzEtNl18TEl8QkxPQ0tRVU9URXxQUkV8VFJ8RFR8RER8U0VDVElPTnxBUlRJQ0xFfEhFQURFUnxGT09URVJ8QVNJREV8TUFJTnxOQVZ8RklHVVJFfEZJR0NBUFRJT058VUx8T0x8REx8VEFCTEV8VEJPRFl8VEhFQUR8VEZPT1R8QUREUkVTU3xIUikkLztcbmNvbnN0IFNLSVAgPSAvXihTQ1JJUFR8U1RZTEV8VEVNUExBVEV8SEVBRHxNRVRBfExJTkt8VElUTEV8SUZSQU1FfE9CSkVDVHxFTUJFRHxTVkd8TUFUSHxJTUd8UElDVFVSRXxWSURFT3xBVURJT3xDQU5WQVN8Tk9TQ1JJUFR8QlVUVE9OfElOUFVUfFNFTEVDVHxURVhUQVJFQXxPUFRJT04pJC87XG5jb25zdCBpc01hYyA9ICgpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIC9NYWN8aVAoaG9uZXxhZHxvZCkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtIHx8IG5hdmlnYXRvci51c2VyQWdlbnQpO1xuY29uc3Qgc2FmZVVybCA9IChoOiBzdHJpbmcgfCBudWxsKSA9PiB7IGNvbnN0IHYgPSAoaCB8fCAnJykudHJpbSgpOyByZXR1cm4gL14oaHR0cHM/OlxcL1xcL3xtYWlsdG86KS9pLnRlc3QodikgPyB2IDogbnVsbDsgfTtcblxuaW50ZXJmYWNlIEhvb2tzIHsgY2hhbmdlPzogKCkgPT4gdm9pZDsgc2VsZWN0PzogKCkgPT4gdm9pZDsgaW5wdXQ/OiAoZTogSW5wdXRFdmVudCkgPT4gdm9pZDsga2V5PzogKGU6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW4gfVxuXG4vKiAtLS0tLS0tLS0tIHRoZSBlZGl0aW5nIGVuZ2luZSAtLS0tLS0tLS0tXG4gICBUaGUgdGV4dCBpcyBhIGxpc3Qgb2YgbGluZXMgKHBhcmFncmFwaHMsIGEgaGVhZGluZywgbGlzdCBpdGVtcyBhbmQgcXVvdGUgbGluZXMpIGhvbGRpbmcgYm9sZCwgaXRhbGljLCBpbmxpbmUgY29kZSBhbmQgbGlua3MsXG4gICBhbmQgZXZlcnkgY2hhbmdlIGdvZXMgdGhyb3VnaCBpdDogRW50ZXIsIEJhY2tzcGFjZSBhdCBhIGxpbmUncyBzdGFydCwgZm9ybWF0cywgcGFzdGUgYW5kIGRyb3AsIHNvIHBhc3RlZCBvciBicm93c2VyLW1hZGVcbiAgIG1hcmt1cCBpcyBjbGVhbmVkIGludG8gdGhvc2UgZmV3IHRhZ3MuIFVuZG8gYW5kIHJlZG8gc3RlcCB0aHJvdWdoIGl0cyBvd24gaGlzdG9yeS4gQSBzZWxlY3Rpb24gaXMga2VwdCBhcyB0d28gbnVtYmVycywgdGhlXG4gICBjaGFyYWN0ZXJzIGJlZm9yZSBlYWNoIGVuZCB3aXRoIGEgbGluZSBicmVhayBjb3VudGluZyBvbmUsIHNvIGl0IHN1cnZpdmVzIGV2ZXJ5IHJlYnVpbGQsIGFuZCB0aGUgZWRpdG9yIHdvcmtzIHRoZSBzYW1lIHdpdGhcbiAgIG9yIHdpdGhvdXQgdGhlIGZvY3VzIChhIHN0b3J5IHR5cGVzIGludG8gaXQgd2l0aG91dCB0YWtpbmcgdGhlIGZvY3VzIGZyb20gdGhlIHBhZ2UpLiBQb3J0ZWQgdmVyYmF0aW0gZnJvbSB0aGUgUmVhY3QgZW5naW5lLiAqL1xuY2xhc3MgUnRlRW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlZDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaG9vazogSG9va3M7XG4gIHByaXZhdGUgb2ZmczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBjYXJldDogUmFuZ2UyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZDogeyBhdDogbnVtYmVyOyBtOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmV2OiB7IG86IFJhbmdlMjsga2luZDogJ3N3YXAnIHwgJ2FkZCc7IG9sZHM6IEhUTUxFbGVtZW50W107IG53OiBIVE1MRWxlbWVudCB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgSCA9IHsgbGlzdDogW10gYXMgeyBodG1sOiBzdHJpbmc7IHNlbDogUmFuZ2UyOyBwcmU6IFJhbmdlMiB8IG51bGwgfVtdLCBhdDogMCwgZGlydHk6IGZhbHNlLCBwcmU6IG51bGwgYXMgUmFuZ2UyIHwgbnVsbCwgdDogMCBhcyBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IDAgfTtcblxuICBjb25zdHJ1Y3RvcihlZDogSFRNTEVsZW1lbnQsIGhvb2s6IEhvb2tzKSB7XG4gICAgdGhpcy5lZCA9IGVkOyB0aGlzLmhvb2sgPSBob29rO1xuICAgIGNvbnN0IG9uID0gPEsgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPihlbDogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCwgZXY6IEsgfCBzdHJpbmcsIGZuOiAoZTogSFRNTEVsZW1lbnRFdmVudE1hcFtLXSkgPT4gdm9pZCkgPT4geyBlbC5hZGRFdmVudExpc3RlbmVyKGV2LCBmbiBhcyBFdmVudExpc3RlbmVyKTsgdGhpcy5vZmZzLnB1c2goKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgZm4gYXMgRXZlbnRMaXN0ZW5lcikpOyB9O1xuXG4gICAgb24oZWQsICdiZWZvcmVpbnB1dCcsIChlOiBJbnB1dEV2ZW50KSA9PiB0aGlzLm9uQmVmb3JlSW5wdXQoZSkpO1xuICAgIG9uKGVkLCAnaW5wdXQnLCAoKGU6IElucHV0RXZlbnQpID0+IHsgaWYgKHRoaXMucmV2KSByZXR1cm47IGlmICh0aGlzLm1lc3N5KCkpIHRoaXMuY2xlYW4oKTsgdGhpcy50eXBlZCh0aGlzLkgucHJlKTsgdGhpcy5ob29rLmlucHV0Py4oZSk7IH0pIGFzIChlOiBFdmVudCkgPT4gdm9pZCk7XG4gICAgb24oZWQsICdwYXN0ZScsIChlOiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBpZiAodGhpcy5yZXYgfHwgIWUuY2xpcGJvYXJkRGF0YSkgcmV0dXJuO1xuICAgICAgY29uc3QgaCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSwgcyA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG4gICAgICBsZXQgaXRlbXMgPSBoID8gdGhpcy5wYXJzZShuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGgsICd0ZXh0L2h0bWwnKS5ib2R5LCBmYWxzZSkgOiBbXTtcbiAgICAgIGlmICghaXRlbXMubGVuZ3RoKSBpdGVtcyA9IHRoaXMucGxhaW4ocyk7IGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoKCk7IGNvbnN0IG8gPSB0aGlzLmdldCgpLCBhdCA9IHRoaXMuaW5zZXJ0TGluZXMoaXRlbXMsIG8pOyB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy5jb21taXQobyk7XG4gICAgfSk7XG4gICAgb24oZWQsICdjdXQnLCAoZTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTsgaWYgKHRoaXMucmV2IHx8ICFlLmNsaXBib2FyZERhdGEpIHJldHVybjsgY29uc3QgbyA9IHRoaXMuZ2V0KCk7IGlmIChvLnMgPT09IG8uZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZyA9IHRoaXMubGl2ZSgpOyBlLmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHRoaXMudGV4dChvKSk7IGlmIChnKSB7IGNvbnN0IGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgZC5hcHBlbmRDaGlsZChnLmNsb25lQ29udGVudHMoKSk7IGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L2h0bWwnLCBkLmlubmVySFRNTCk7IH1cbiAgICAgIHRoaXMuZmx1c2goKTsgY29uc3QgcCA9IHRoaXMuZGVsKG8pOyB0aGlzLnNldChwKTsgdGhpcy5jb21taXQobyk7XG4gICAgfSk7XG4gICAgb24oZWQsICdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgIG9uKGVkLCAnZHJvcCcsIChlOiBEcmFnRXZlbnQpID0+IHRoaXMub25Ecm9wKGUpKTtcbiAgICBvbihlZCwgJ2tleWRvd24nLCAoZTogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5vbktleURvd24oZSkpO1xuICAgIG9uKGRvY3VtZW50LCAnc2VsZWN0aW9uY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmxpdmUoKSB8fCB0aGlzLnJldikgcmV0dXJuO1xuICAgICAgdGhpcy5jYXJldCA9IHRoaXMuZ2V0KCk7IGlmICh0aGlzLnBlbmQgJiYgKHRoaXMuY2FyZXQucyAhPT0gdGhpcy5wZW5kLmF0IHx8IHRoaXMuY2FyZXQuZSAhPT0gdGhpcy5wZW5kLmF0KSkgdGhpcy5wZW5kID0gbnVsbDtcbiAgICAgIHRoaXMuaG9vay5zZWxlY3Q/LigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50aWR5KCk7IHRoaXMuSC5saXN0ID0gW3sgaHRtbDogZWQuaW5uZXJIVE1MLCBzZWw6IHsgczogMCwgZTogMCB9LCBwcmU6IG51bGwgfV07XG4gIH1cblxuICAvLyAtLS0tIGxpbmVzIGFuZCBvZmZzZXRzIC0tLS1cbiAgcHJpdmF0ZSBsaW5lcygpIHsgcmV0dXJuIFsuLi50aGlzLmVkLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KExFQUYpXTsgfVxuICB0eXBlT2YoYjogRWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBiLnRhZ05hbWUgPT09ICdMSScgPyAoYi5wYXJlbnROb2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IGIudGFnTmFtZSA9PT0gJ0JMT0NLUVVPVEUnID8gJ3F1b3RlJyA6IGIudGFnTmFtZS50b0xvd2VyQ2FzZSgpOyB9XG4gIHByaXZhdGUgbGluZU9mKG46IE5vZGUgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsIHsgZm9yIChsZXQgeCA9IG47IHggJiYgeCAhPT0gdGhpcy5lZDsgeCA9IHgucGFyZW50Tm9kZSkgaWYgKHgubm9kZVR5cGUgPT09IDEgJiYgKHggYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKSkgcmV0dXJuIHggYXMgSFRNTEVsZW1lbnQ7IHJldHVybiBudWxsOyB9XG4gIHByaXZhdGUgbGVuKGI6IE5vZGUpIHsgcmV0dXJuIChiLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGg7IH1cbiAgdG90YWwoKSB7IHJldHVybiB0aGlzLmxpbmVzKCkucmVkdWNlKChuLCBiLCBpKSA9PiBuICsgdGhpcy5sZW4oYikgKyAoaSA/IDEgOiAwKSwgMCk7IH1cbiAgcHJpdmF0ZSBzdGFydE9mKGk6IG51bWJlcikgeyByZXR1cm4gdGhpcy5saW5lcygpLnNsaWNlKDAsIGkpLnJlZHVjZSgobiwgYikgPT4gbiArIHRoaXMubGVuKGIpICsgMSwgMCk7IH1cbiAgcHJpdmF0ZSBsaW5lQXQoYXQ6IG51bWJlcikgeyBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCk7IGxldCBuID0gMDsgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsgaWYgKGF0IDw9IG4gKyB0aGlzLmxlbihhbGxbaV0pKSByZXR1cm4gaTsgbiArPSB0aGlzLmxlbihhbGxbaV0pICsgMTsgfSByZXR1cm4gYWxsLmxlbmd0aCAtIDE7IH1cbiAgdGV4dChvOiBSYW5nZTIpIHsgcmV0dXJuIHRoaXMubGluZXMoKS5tYXAoYiA9PiBiLnRleHRDb250ZW50KS5qb2luKCdcXG4nKS5zbGljZShvLnMsIG8uZSk7IH1cbiAgcHJpdmF0ZSB1cChuOiBOb2RlIHwgbnVsbCwgdGFnOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7IGZvciAobGV0IHggPSBuICYmIG4ubm9kZVR5cGUgPT09IDMgPyBuLnBhcmVudE5vZGUgOiBuOyB4ICYmIHggIT09IHRoaXMuZWQgJiYgeC5ub2RlVHlwZSA9PT0gMSAmJiAhKHggYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKTsgeCA9IHgucGFyZW50Tm9kZSkgaWYgKCh4IGFzIEVsZW1lbnQpLnRhZ05hbWUgPT09IHRhZykgcmV0dXJuIHggYXMgRWxlbWVudDsgcmV0dXJuIG51bGw7IH1cbiAgcHJpdmF0ZSB3cmFwKG46IE5vZGUsIHRhZzogc3RyaW5nLCBocmVmPzogc3RyaW5nIHwgbnVsbCkgeyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcudG9Mb3dlckNhc2UoKSk7IGlmIChocmVmKSB3LnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpOyAobiBhcyBDaGlsZE5vZGUpLnJlcGxhY2VXaXRoKHcpOyB3LmFwcGVuZENoaWxkKG4pOyByZXR1cm4gdzsgfVxuICBwcml2YXRlIHVud3JhcChlbDogRWxlbWVudCkgeyBlbC5yZXBsYWNlV2l0aCguLi5lbC5jaGlsZE5vZGVzKTsgfVxuXG4gIHByaXZhdGUgb2Zmc2V0T2Yobm9kZTogTm9kZSwgb2ZmOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBiID0gdGhpcy5saW5lT2Yobm9kZSk7XG4gICAgaWYgKCFiKSB7XG4gICAgICBpZiAoIXRoaXMuZWQuY29udGFpbnMobm9kZSkpIHJldHVybiAwO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBub2RlLmNoaWxkTm9kZXNbb2ZmXSwgZmlyc3QgPSBhZnRlciAmJiBhZnRlci5ub2RlVHlwZSA9PT0gMSA/ICgoYWZ0ZXIgYXMgRWxlbWVudCkubWF0Y2hlcyhMRUFGKSA/IGFmdGVyIGFzIEhUTUxFbGVtZW50IDogKGFmdGVyIGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KExFQUYpKSA6IG51bGw7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gdGhpcy50b3RhbCgpO1xuICAgICAgYiA9IGZpcnN0OyBub2RlID0gZmlyc3Q7IG9mZiA9IDA7XG4gICAgfVxuICAgIGxldCBuID0gMDsgZm9yIChjb25zdCB4IG9mIHRoaXMubGluZXMoKSkgeyBpZiAoeCA9PT0gYikgYnJlYWs7IG4gKz0gdGhpcy5sZW4oeCkgKyAxOyB9XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChiLCAwKTsgcmcuc2V0RW5kKG5vZGUsIG9mZik7XG4gICAgcmV0dXJuIG4gKyByZy50b1N0cmluZygpLmxlbmd0aDtcbiAgfVxuICBwcml2YXRlIHBvaW50QXQoYXQ6IG51bWJlciwgbGF0ZSA9IGZhbHNlKTogW05vZGUsIG51bWJlcl0ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubGluZXMoKTsgbGV0IG4gPSBNYXRoLm1heCgwLCBhdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGIgPSBhbGxbaV07XG4gICAgICBpZiAobiA8PSB0aGlzLmxlbihiKSB8fCBpID09PSBhbGwubGVuZ3RoIC0gMSkge1xuICAgICAgICBuID0gTWF0aC5taW4obiwgdGhpcy5sZW4oYikpO1xuICAgICAgICBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihiLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7IGxldCB0OiBUZXh0IHwgbnVsbCwgbGFzdDogVGV4dCB8IG51bGwgPSBudWxsO1xuICAgICAgICB3aGlsZSAoKHQgPSB3Lm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB7IGlmIChsYXRlID8gbiA8IHQuZGF0YS5sZW5ndGggOiBuIDw9IHQuZGF0YS5sZW5ndGgpIHJldHVybiBbdCwgbl07IG4gLT0gdC5kYXRhLmxlbmd0aDsgbGFzdCA9IHQ7IH1cbiAgICAgICAgcmV0dXJuIGxhc3QgPyBbbGFzdCwgbGFzdC5kYXRhLmxlbmd0aF0gOiBbYiwgMF07XG4gICAgICB9XG4gICAgICBuIC09IHRoaXMubGVuKGIpICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIFt0aGlzLmVkLCAwXTtcbiAgfVxuICByYW5nZShvOiBSYW5nZTIpIHsgY29uc3QgW2EsIGFvXSA9IHRoaXMucG9pbnRBdChvLnMsIG8ucyAhPT0gby5lKSwgW2IsIGJvXSA9IHRoaXMucG9pbnRBdChvLmUpOyBjb25zdCByZyA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHJnLnNldFN0YXJ0KGEsIGFvKTsgcmcuc2V0RW5kKGIsIGJvKTsgcmV0dXJuIHJnOyB9XG4gIHByaXZhdGUgc2hvd1JhbmdlKHg6IEVsZW1lbnQgfCBSYW5nZSkge1xuICAgIGNvbnN0IHIgPSB4LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiID0gdGhpcy5lZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgaWYgKCFyLmhlaWdodCkgcmV0dXJuO1xuICAgIGlmIChyLmJvdHRvbSA+IGIuYm90dG9tIC0gMTIpIHRoaXMuZWQuc2Nyb2xsVG9wICs9IE1hdGgubWluKHIuYm90dG9tIC0gYi5ib3R0b20gKyAxMiwgci50b3AgLSBiLnRvcCAtIDEyKTtcbiAgICBlbHNlIGlmIChyLnRvcCA8IGIudG9wICsgMTIpIHRoaXMuZWQuc2Nyb2xsVG9wIC09IGIudG9wICsgMTIgLSByLnRvcDtcbiAgfVxuXG4gIC8vIC0tLS0gc2VsZWN0aW9uIC0tLS1cbiAgcHJpdmF0ZSBsaXZlKCkgeyBjb25zdCBzID0gZ2V0U2VsZWN0aW9uKCk7IGlmICghcyB8fCAhcy5yYW5nZUNvdW50KSByZXR1cm4gbnVsbDsgY29uc3QgZyA9IHMuZ2V0UmFuZ2VBdCgwKTsgcmV0dXJuIHRoaXMuZWQuY29udGFpbnMoZy5zdGFydENvbnRhaW5lcikgJiYgdGhpcy5lZC5jb250YWlucyhnLmVuZENvbnRhaW5lcikgPyBnIDogbnVsbDsgfVxuICBnZXQoKTogUmFuZ2UyIHtcbiAgICBjb25zdCBnID0gdGhpcy5saXZlKCk7XG4gICAgaWYgKGcpIHsgY29uc3QgYSA9IHRoaXMub2Zmc2V0T2YoZy5zdGFydENvbnRhaW5lciwgZy5zdGFydE9mZnNldCksIGIgPSB0aGlzLm9mZnNldE9mKGcuZW5kQ29udGFpbmVyLCBnLmVuZE9mZnNldCk7IHJldHVybiB7IHM6IE1hdGgubWluKGEsIGIpLCBlOiBNYXRoLm1heChhLCBiKSB9OyB9XG4gICAgaWYgKCF0aGlzLmNhcmV0KSB7IGNvbnN0IHQgPSB0aGlzLnRvdGFsKCk7IHRoaXMuY2FyZXQgPSB7IHM6IHQsIGU6IHQgfTsgfVxuICAgIHJldHVybiB7IHM6IHRoaXMuY2FyZXQucywgZTogdGhpcy5jYXJldC5lIH07XG4gIH1cbiAgc2V0KG86IFJhbmdlMiwgZm9jdXMgPSBmYWxzZSkge1xuICAgIHRoaXMuY2FyZXQgPSB7IHM6IG8ucywgZTogby5lIH07XG4gICAgaWYgKGZvY3VzICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuZWQpIHRoaXMuZWQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLmVkKSByZXR1cm47XG4gICAgY29uc3QgcyA9IGdldFNlbGVjdGlvbigpOyBpZiAoIXMpIHJldHVybjsgcy5yZW1vdmVBbGxSYW5nZXMoKTsgcy5hZGRSYW5nZSh0aGlzLnJhbmdlKG8pKTtcbiAgfVxuXG4gIC8vIC0tLS0gdGlkeWluZyAtLS0tXG4gIHByaXZhdGUgdGlkeSgpIHtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIHRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYixpLGNvZGUsYScpKSB7XG4gICAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSBjb250aW51ZTtcbiAgICAgIGlmICghZWwudGV4dENvbnRlbnQpIHsgZWwucmVtb3ZlKCk7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAodGhpcy51cChlbC5wYXJlbnROb2RlLCBlbC50YWdOYW1lKSkgdGhpcy51bndyYXAoZWwpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIHRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYixpLGNvZGUsYScpKSB7XG4gICAgICBpZiAoIWVsLmlzQ29ubmVjdGVkKSBjb250aW51ZTtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgbGV0IG54ID0gZWwubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlIChueCAmJiBueC5ub2RlVHlwZSA9PT0gMyAmJiAhKG54IGFzIFRleHQpLmRhdGEpIHsgY29uc3QgZCA9IG54OyBueCA9IG54Lm5leHRTaWJsaW5nOyBkLnJlbW92ZSgpOyB9XG4gICAgICAgIGlmICghbnggfHwgbngubm9kZVR5cGUgIT09IDEgfHwgKG54IGFzIEVsZW1lbnQpLnRhZ05hbWUgIT09IGVsLnRhZ05hbWUgfHwgKG54IGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZSgnaHJlZicpICE9PSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkgYnJlYWs7XG4gICAgICAgIGVsLmFwcGVuZCguLi5ueC5jaGlsZE5vZGVzKTsgbngucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmxpbmVzKCkpIHsgY29uc3QgYnIgPSBbLi4uYi5xdWVyeVNlbGVjdG9yQWxsKCdicicpXTsgaWYgKGIudGV4dENvbnRlbnQpIGJyLmZvckVhY2goeCA9PiB4LnJlbW92ZSgpKTsgZWxzZSBpZiAoIWJyLmxlbmd0aCkgYi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsgZWxzZSBici5zbGljZSgxKS5mb3JFYWNoKHggPT4geC5yZW1vdmUoKSk7IH1cbiAgICBpZiAoIXRoaXMubGluZXMoKS5sZW5ndGgpIHsgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsgcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsgdGhpcy5lZC5yZXBsYWNlQ2hpbGRyZW4ocCk7IH1cbiAgICB0aGlzLmVkLm5vcm1hbGl6ZSgpO1xuICB9XG4gIHByaXZhdGUgcmVidWlsZChzcGVjOiBbc3RyaW5nLCBOb2RlXVtdKSB7XG4gICAgY29uc3QgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsgbGV0IGxpc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBbdCwgYl0gb2Ygc3BlYykge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQgPT09ICdxdW90ZScgPyAnYmxvY2txdW90ZScgOiB0ID09PSAndWwnIHx8IHQgPT09ICdvbCcgPyAnbGknIDogdCk7XG4gICAgICBlbC5hcHBlbmQoLi4uYi5jaGlsZE5vZGVzKTtcbiAgICAgIGlmICh0ID09PSAndWwnIHx8IHQgPT09ICdvbCcpIHsgaWYgKCFsaXN0IHx8IGxpc3QudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0KSBmcmFnLmFwcGVuZENoaWxkKGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpKTsgbGlzdC5hcHBlbmRDaGlsZChlbCk7IH1cbiAgICAgIGVsc2UgeyBsaXN0ID0gbnVsbDsgZnJhZy5hcHBlbmRDaGlsZChlbCk7IH1cbiAgICB9XG4gICAgdGhpcy5lZC5yZXBsYWNlQ2hpbGRyZW4oZnJhZyk7IHRoaXMudGlkeSgpO1xuICB9XG4gIHByaXZhdGUgc3BlY09mKCk6IFtzdHJpbmcsIE5vZGVdW10geyByZXR1cm4gdGhpcy5saW5lcygpLm1hcChiID0+IFt0aGlzLnR5cGVPZihiKSwgYl0pOyB9XG4gIHByaXZhdGUgbWVzc3koKSB7XG4gICAgZm9yIChjb25zdCBuIG9mIHRoaXMuZWQuY2hpbGROb2Rlcykge1xuICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDMgPyAobiBhcyBUZXh0KS5kYXRhLnRyaW0oKSA6IG4ubm9kZVR5cGUgPT09IDEgJiYgIS9eKFB8SDJ8QkxPQ0tRVU9URXxVTHxPTCkkLy50ZXN0KChuIGFzIEVsZW1lbnQpLnRhZ05hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLm5vZGVUeXBlID09PSAxICYmIC9eKFVMfE9MKSQvLnRlc3QoKG4gYXMgRWxlbWVudCkudGFnTmFtZSkgJiYgWy4uLm4uY2hpbGROb2Rlc10uc29tZSh4ID0+IHgubm9kZVR5cGUgIT09IDEgfHwgKHggYXMgRWxlbWVudCkudGFnTmFtZSAhPT0gJ0xJJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLmVkLnF1ZXJ5U2VsZWN0b3IoJ1tzdHlsZV0sW2NsYXNzXSxzcGFuLGZvbnQsZGl2LGE6bm90KFtocmVmXSksOmlzKHAsaDIsYmxvY2txdW90ZSxsaSkgOm5vdChiLGksY29kZSxhLGJyKScpO1xuICB9XG5cbiAgLy8gLS0tLSBwYXJzZSAtLS0tXG4gIHByaXZhdGUgcGFyc2Uocm9vdDogTm9kZSwga2VlcDogYm9vbGVhbik6IExpbmVbXSB7XG4gICAgY29uc3Qgb3V0OiB7IHQ6IHN0cmluZzsgZnJhZzogRG9jdW1lbnRGcmFnbWVudCB9W10gPSBbXTsgbGV0IGN1cjogeyB0OiBzdHJpbmc7IGZyYWc6IERvY3VtZW50RnJhZ21lbnQgfSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHdhbGsgPSAobm9kZTogTm9kZSwgdDogc3RyaW5nLCBwcmU6IGJvb2xlYW4sIG1hcmtzOiBbc3RyaW5nLCBzdHJpbmc/XVtdKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgICAgIGlmIChuLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgY29uc3QgZCA9IChuIGFzIFRleHQpLmRhdGE7XG4gICAgICAgICAgbGV0IHMgPSBrZWVwID8gZCA6IHByZSA/IGQucmVwbGFjZSgvXFxyXFxuPy9nLCAnXFxuJykgOiBkLnJlcGxhY2UoL1tcXHMgXSsvZywgJyAnKTtcbiAgICAgICAgICBpZiAoIWtlZXApIHMgPSBzLnJlcGxhY2UoLyAvZywgJyAnKTtcbiAgICAgICAgICBpZiAoIWN1ciAmJiAhcy50cmltKCkgJiYgKG5vZGUgPT09IHJvb3QgfHwgL14oVUx8T0x8REx8VEFCTEV8VEJPRFl8VEhFQUR8VEZPT1R8VFIpJC8udGVzdCgobm9kZSBhcyBFbGVtZW50KS50YWdOYW1lKSkpIGNvbnRpbnVlO1xuICAgICAgICAgIChwcmUgJiYgIWtlZXAgPyBzLnNwbGl0KCdcXG4nKSA6IFtzXSkuZm9yRWFjaCgocCwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkpIGN1ciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoIXAgfHwgKCFjdXIgJiYgIWtlZXAgJiYgIXAudHJpbSgpKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFjdXIpIG91dC5wdXNoKGN1ciA9IHsgdCwgZnJhZzogZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIH0pO1xuICAgICAgICAgICAgbGV0IHg6IE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwKTtcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSBtYXJrcy5sZW5ndGggLSAxOyBtID49IDA7IG0tLSkgeyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChtYXJrc1ttXVswXS50b0xvd2VyQ2FzZSgpKTsgaWYgKG1hcmtzW21dWzFdKSB3LnNldEF0dHJpYnV0ZSgnaHJlZicsIG1hcmtzW21dWzFdISk7IHcuYXBwZW5kQ2hpbGQoeCk7IHggPSB3OyB9XG4gICAgICAgICAgICBjdXIuZnJhZy5hcHBlbmRDaGlsZCh4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobi5ub2RlVHlwZSAhPT0gMSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGVsID0gbiBhcyBFbGVtZW50LCB0ZyA9IGVsLnRhZ05hbWU7XG4gICAgICAgIGlmIChTS0lQLnRlc3QodGcpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygndm8tcnRlLW5ldycpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3NzID0gKGVsLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRnID09PSAnQlInKSB7IGN1ciA9IG51bGw7IGNvbnRpbnVlOyB9XG4gICAgICAgIGlmIChCTE9DSy50ZXN0KHRnKSkge1xuICAgICAgICAgIGNvbnN0IG50ID0gL15IWzEtNl0kLy50ZXN0KHRnKSA/ICdoMicgOiB0ZyA9PT0gJ0xJJyA/IChlbC5wYXJlbnRFbGVtZW50ICYmIGVsLnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ09MJyA/ICdvbCcgOiAndWwnKSA6IHRnID09PSAnQkxPQ0tRVU9URScgPyAncXVvdGUnIDogdDtcbiAgICAgICAgICBjdXIgPSBudWxsOyBjb25zdCB3YXMgPSBvdXQubGVuZ3RoO1xuICAgICAgICAgIHdhbGsoZWwsIG50LCBwcmUgfHwgdGcgPT09ICdQUkUnLCBtYXJrcyk7XG4gICAgICAgICAgaWYgKGtlZXAgJiYgb3V0Lmxlbmd0aCA9PT0gd2FzICYmICFlbC5xdWVyeVNlbGVjdG9yKCdwLGRpdixoMSxoMixoMyxoNCxoNSxoNixsaSxibG9ja3F1b3RlLHByZSx1bCxvbCcpKSBvdXQucHVzaCh7IHQ6IG50LCBmcmFnOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgfSk7XG4gICAgICAgICAgY3VyID0gbnVsbDsgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG0gPSBtYXJrczsgY29uc3QgYWRkID0gKHRhZzogc3RyaW5nLCBocmVmPzogc3RyaW5nKSA9PiB7IGlmICghbS5zb21lKHggPT4geFswXSA9PT0gdGFnKSkgbSA9IFsuLi5tLCBbdGFnLCBocmVmXV07IH07XG4gICAgICAgIGlmICh0ZyA9PT0gJ0InIHx8IHRnID09PSAnU1RST05HJyA/ICEvZm9udC13ZWlnaHRcXHMqOlxccyoobm9ybWFsfFsxLTRdMDApLy50ZXN0KGNzcykgOiAvZm9udC13ZWlnaHRcXHMqOlxccyooYm9sZHxbNi05XTAwKS8udGVzdChjc3MpKSBhZGQoJ0InKTtcbiAgICAgICAgaWYgKHRnID09PSAnSScgfHwgdGcgPT09ICdFTScgfHwgL2ZvbnQtc3R5bGVcXHMqOlxccyppdGFsaWMvLnRlc3QoY3NzKSkgYWRkKCdJJyk7XG4gICAgICAgIGlmICgvXihDT0RFfEtCRHxTQU1QfFRUKSQvLnRlc3QodGcpKSBhZGQoJ0NPREUnKTtcbiAgICAgICAgaWYgKHRnID09PSAnQScpIHsgY29uc3QgaCA9IHNhZmVVcmwoZWwuZ2V0QXR0cmlidXRlKCdocmVmJykpOyBpZiAoaCkgYWRkKCdBJywgaCk7IH1cbiAgICAgICAgd2FsayhlbCwgdCwgcHJlLCBtKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsocm9vdCwgJ3AnLCBmYWxzZSwgW10pO1xuICAgIGlmICgha2VlcCkgZm9yIChjb25zdCB4IG9mIG91dCkge1xuICAgICAgY29uc3QgdHM6IFRleHRbXSA9IFtdLCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih4LmZyYWcsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTsgbGV0IHQ6IFRleHQgfCBudWxsOyB3aGlsZSAoKHQgPSB3Lm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB0cy5wdXNoKHQpO1xuICAgICAgaWYgKHRzLmxlbmd0aCkgeyB0c1swXS5kYXRhID0gdHNbMF0uZGF0YS5yZXBsYWNlKC9eXFxzKy8sICcnKTsgdHNbdHMubGVuZ3RoIC0gMV0uZGF0YSA9IHRzW3RzLmxlbmd0aCAtIDFdLmRhdGEucmVwbGFjZSgvXFxzKyQvLCAnJyk7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dC5maWx0ZXIoeCA9PiBrZWVwIHx8IHguZnJhZy50ZXh0Q29udGVudCkubWFwKHggPT4gKHsgLi4ueCwgbGVuOiAoeC5mcmFnLnRleHRDb250ZW50IHx8ICcnKS5sZW5ndGggfSkpO1xuICB9XG4gIHByaXZhdGUgcGxhaW4oczogc3RyaW5nKTogTGluZVtdIHsgcmV0dXJuIHMucmVwbGFjZSgvXFxyXFxuPy9nLCAnXFxuJykuc3BsaXQoJ1xcbicpLmZpbHRlcihsID0+IGwudHJpbSgpKS5tYXAobCA9PiB7IGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7IGZyYWcuYXBwZW5kKGwpOyByZXR1cm4geyB0OiAncCcsIGZyYWcsIGxlbjogbC5sZW5ndGggfTsgfSk7IH1cbiAgcHJpdmF0ZSBjbGVhbigpIHsgY29uc3QgbyA9IHRoaXMuZ2V0KCk7IHRoaXMucmVidWlsZCh0aGlzLnBhcnNlKHRoaXMuZWQsIHRydWUpLm1hcCh4ID0+IFt4LnQsIHguZnJhZ10pKTsgdGhpcy5zZXQobyk7IH1cblxuICAvLyAtLS0tIGhpc3RvcnkgLS0tLVxuICBwcml2YXRlIGNoYW5nZWQoKSB7IHRoaXMuaG9vay5jaGFuZ2U/LigpOyB9XG4gIHByaXZhdGUgY29tbWl0KHByZT86IFJhbmdlMikge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLkgudCk7IGNvbnN0IGh0bWwgPSB0aGlzLmVkLmlubmVySFRNTCwgdG9wID0gdGhpcy5ILmxpc3RbdGhpcy5ILmF0XSwgYmVmb3JlID0gdGhpcy5ILnByZSB8fCBwcmUgfHwgbnVsbDtcbiAgICB0aGlzLkguZGlydHkgPSBmYWxzZTsgdGhpcy5ILnByZSA9IG51bGw7XG4gICAgaWYgKCF0b3AgfHwgdG9wLmh0bWwgIT09IGh0bWwpIHsgdGhpcy5ILmxpc3Quc3BsaWNlKHRoaXMuSC5hdCArIDEpOyB0aGlzLkgubGlzdC5wdXNoKHsgaHRtbCwgc2VsOiB0aGlzLmdldCgpLCBwcmU6IGJlZm9yZSB9KTsgaWYgKHRoaXMuSC5saXN0Lmxlbmd0aCA+IDMwMCkgdGhpcy5ILmxpc3Quc2hpZnQoKTsgdGhpcy5ILmF0ID0gdGhpcy5ILmxpc3QubGVuZ3RoIC0gMTsgfVxuICAgIHRoaXMuY2hhbmdlZCgpO1xuICB9XG4gIGZsdXNoKCkgeyBpZiAodGhpcy5ILmRpcnR5KSB0aGlzLmNvbW1pdCgpOyB9XG4gIHByaXZhdGUgdHlwZWQocHJlPzogUmFuZ2UyIHwgbnVsbCkgeyBpZiAoIXRoaXMuSC5kaXJ0eSkgeyB0aGlzLkgucHJlID0gcHJlIHx8IG51bGw7IHRoaXMuSC5saXN0LnNwbGljZSh0aGlzLkguYXQgKyAxKTsgfSB0aGlzLkguZGlydHkgPSB0cnVlOyBjbGVhclRpbWVvdXQodGhpcy5ILnQpOyB0aGlzLkgudCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb21taXQoKSwgNzAwKTsgdGhpcy5jaGFuZ2VkKCk7IH1cbiAgcHJpdmF0ZSByZXN0b3JlKGh0bWw6IHN0cmluZywgc2VsOiBSYW5nZTIgfCBudWxsKSB7IHRoaXMuZWQuaW5uZXJIVE1MID0gaHRtbDsgdGhpcy5wZW5kID0gbnVsbDsgdGhpcy5zZXQoc2VsIHx8IHsgczogMCwgZTogMCB9KTsgdGhpcy5jaGFuZ2VkKCk7IH1cbiAgdW5kbygpIHsgdGhpcy5mbHVzaCgpOyBpZiAodGhpcy5ILmF0IDw9IDApIHJldHVybjsgY29uc3QgY3VyID0gdGhpcy5ILmxpc3RbdGhpcy5ILmF0XTsgdGhpcy5ILmF0LS07IHRoaXMucmVzdG9yZSh0aGlzLkgubGlzdFt0aGlzLkguYXRdLmh0bWwsIGN1ci5wcmUgfHwgdGhpcy5ILmxpc3RbdGhpcy5ILmF0XS5zZWwpOyB9XG4gIHJlZG8oKSB7IHRoaXMuZmx1c2goKTsgaWYgKHRoaXMuSC5hdCA+PSB0aGlzLkgubGlzdC5sZW5ndGggLSAxKSByZXR1cm47IHRoaXMuSC5hdCsrOyB0aGlzLnJlc3RvcmUodGhpcy5ILmxpc3RbdGhpcy5ILmF0XS5odG1sLCB0aGlzLkgubGlzdFt0aGlzLkguYXRdLnNlbCk7IH1cbiAgbG9hZChodG1sOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsgdC5pbm5lckhUTUwgPSBodG1sIHx8ICcnO1xuICAgIHRoaXMucmVidWlsZCh0aGlzLnBhcnNlKHQuY29udGVudCwgZmFsc2UpLm1hcCh4ID0+IFt4LnQsIHguZnJhZ10pKTsgdGhpcy5jYXJldCA9IG51bGw7IHRoaXMucGVuZCA9IG51bGw7IHRoaXMucmV2ID0gbnVsbDtcbiAgICB0aGlzLkgubGlzdCA9IFt7IGh0bWw6IHRoaXMuZWQuaW5uZXJIVE1MLCBzZWw6IHsgczogMCwgZTogMCB9LCBwcmU6IG51bGwgfV07IHRoaXMuSC5hdCA9IDA7IHRoaXMuSC5kaXJ0eSA9IGZhbHNlOyBjbGVhclRpbWVvdXQodGhpcy5ILnQpOyB0aGlzLmNoYW5nZWQoKTtcbiAgfVxuXG4gIC8vIC0tLS0gZWRpdHMgLS0tLVxuICBwcml2YXRlIHRleHRzKCkgeyBjb25zdCBvdXQ6IFtUZXh0LCBudW1iZXJdW10gPSBbXTsgbGV0IG4gPSAwOyB0aGlzLmxpbmVzKCkuZm9yRWFjaCgoYiwgaSkgPT4geyBpZiAoaSkgbisrOyBjb25zdCB3ID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihiLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCk7IGxldCB0OiBUZXh0IHwgbnVsbDsgd2hpbGUgKCh0ID0gdy5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkgeyBvdXQucHVzaChbdCwgbl0pOyBuICs9IHQuZGF0YS5sZW5ndGg7IH0gfSk7IHJldHVybiBvdXQ7IH1cbiAgcHJpdmF0ZSBjdXQoYXQ6IG51bWJlcikgeyBmb3IgKGNvbnN0IFt0LCBuXSBvZiB0aGlzLnRleHRzKCkpIGlmIChhdCA+IG4gJiYgYXQgPCBuICsgdC5kYXRhLmxlbmd0aCkgeyB0LnNwbGl0VGV4dChhdCAtIG4pOyByZXR1cm47IH0gfVxuICBwcml2YXRlIGNvdmVyZWQobzogUmFuZ2UyKSB7IHRoaXMuY3V0KG8uZSk7IHRoaXMuY3V0KG8ucyk7IHJldHVybiB0aGlzLnRleHRzKCkuZmlsdGVyKChbdCwgbl0pID0+IHQuZGF0YS5sZW5ndGggJiYgbiA+PSBvLnMgJiYgbiArIHQuZGF0YS5sZW5ndGggPD0gby5lKS5tYXAoeCA9PiB4WzBdKTsgfVxuICBwcml2YXRlIGhhcyh0YWc6IHN0cmluZywgbzogUmFuZ2UyKSB7XG4gICAgaWYgKG8ucyA9PT0gby5lKSB7XG4gICAgICBpZiAodGhpcy5wZW5kICYmIHRoaXMucGVuZC5hdCA9PT0gby5zICYmIHRhZyBpbiB0aGlzLnBlbmQubSkgcmV0dXJuIHRoaXMucGVuZC5tW3RhZ107XG4gICAgICBjb25zdCBnID0gdGhpcy5saXZlKCk7IHJldHVybiAhIXRoaXMudXAoZyAmJiBnLmNvbGxhcHNlZCA/IGcuc3RhcnRDb250YWluZXIgOiB0aGlzLnBvaW50QXQoby5zKVswXSwgdGFnKTtcbiAgICB9XG4gICAgY29uc3QgdHMgPSB0aGlzLnRleHRzKCkuZmlsdGVyKChbdCwgbl0pID0+IHQuZGF0YS5sZW5ndGggJiYgbiA8IG8uZSAmJiBuICsgdC5kYXRhLmxlbmd0aCA+IG8ucyk7XG4gICAgcmV0dXJuIHRzLmxlbmd0aCA+IDAgJiYgdHMuZXZlcnkoKFt0XSkgPT4gdGhpcy51cCh0LCB0YWcpKTtcbiAgfVxuICBpbmxpbmUodGFnOiBzdHJpbmcsIGhyZWY/OiBzdHJpbmcgfCBudWxsLCBvID0gdGhpcy5nZXQoKSkge1xuICAgIGlmIChvLnMgPT09IG8uZSkge1xuICAgICAgaWYgKHRhZyA9PT0gJ0EnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMucGVuZCB8fCB0aGlzLnBlbmQuYXQgIT09IG8ucykgdGhpcy5wZW5kID0geyBhdDogby5zLCBtOiB7fSB9O1xuICAgICAgdGhpcy5wZW5kLm1bdGFnXSA9ICF0aGlzLmhhcyh0YWcsIG8pOyB0aGlzLmNoYW5nZWQoKTsgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoKCk7XG4gICAgY29uc3QgdHMgPSB0aGlzLmNvdmVyZWQobyk7IGlmICghdHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgYWRkID0gaHJlZiAhPT0gdW5kZWZpbmVkID8gaHJlZiAhPT0gbnVsbCA6ICF0cy5ldmVyeSh0ID0+IHRoaXMudXAodCwgdGFnKSk7XG4gICAgaWYgKGFkZCkgdHMuZm9yRWFjaCh0ID0+IHsgY29uc3QgaGFkID0gdGhpcy51cCh0LCB0YWcpOyBpZiAoIWhhZCkgdGhpcy53cmFwKHQsIHRhZywgaHJlZik7IGVsc2UgaWYgKGhyZWYpIGhhZC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTsgfSk7XG4gICAgZWxzZSBuZXcgU2V0KHRzLm1hcCh0ID0+IHRoaXMudXAodCwgdGFnKSkpLmZvckVhY2goZWwgPT4ge1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qga2VlcDogVGV4dFtdID0gW10sIHcgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGVsLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCksIGggPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsgbGV0IHQ6IFRleHQgfCBudWxsO1xuICAgICAgd2hpbGUgKCh0ID0gdy5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkgaWYgKCF0cy5pbmNsdWRlcyh0KSkga2VlcC5wdXNoKHQpO1xuICAgICAgdGhpcy51bndyYXAoZWwpOyBrZWVwLmZvckVhY2goeCA9PiB0aGlzLndyYXAoeCwgdGFnLCBoKSk7XG4gICAgfSk7XG4gICAgdGhpcy50aWR5KCk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChvKTtcbiAgfVxuICBwcml2YXRlIHR5cGVTdHlsZWQoczogc3RyaW5nKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuZ2V0KCksIG0gPSB0aGlzLnBlbmQhLm07IHRoaXMucGVuZCA9IG51bGw7XG4gICAgY29uc3QgZyA9IHRoaXMubGl2ZSgpLCBbbiwga10gPSBnICYmIGcuY29sbGFwc2VkID8gW2cuc3RhcnRDb250YWluZXIsIGcuc3RhcnRPZmZzZXRdIGFzIFtOb2RlLCBudW1iZXJdIDogdGhpcy5wb2ludEF0KG8ucyk7XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChuLCBrKTsgcmcuY29sbGFwc2UodHJ1ZSk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgT2JqZWN0LmtleXMobSkpIGlmICghbVt0YWddKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMudXAocmcuc3RhcnRDb250YWluZXIsIHRhZyk7IGlmICghZWwpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGFpbCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHRhaWwuc2V0U3RhcnQocmcuc3RhcnRDb250YWluZXIsIHJnLnN0YXJ0T2Zmc2V0KTsgdGFpbC5zZXRFbmRBZnRlcihlbCk7XG4gICAgICBlbC5hZnRlcih0YWlsLmV4dHJhY3RDb250ZW50cygpKTsgcmcuc2V0U3RhcnRBZnRlcihlbCk7IHJnLmNvbGxhcHNlKHRydWUpO1xuICAgIH1cbiAgICBsZXQgeDogTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIE9iamVjdC5rZXlzKG0pKSBpZiAobVt0YWddICYmICF0aGlzLnVwKHJnLnN0YXJ0Q29udGFpbmVyLCB0YWcpKSB7IGNvbnN0IHcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZy50b0xvd2VyQ2FzZSgpKTsgdy5hcHBlbmRDaGlsZCh4KTsgeCA9IHc7IH1cbiAgICByZy5pbnNlcnROb2RlKHgpOyB0aGlzLnRpZHkoKTsgdGhpcy5zZXQoeyBzOiBvLnMgKyBzLmxlbmd0aCwgZTogby5zICsgcy5sZW5ndGggfSk7IHRoaXMudHlwZWQobyk7XG4gIH1cbiAgYmxvY2sodHlwZTogc3RyaW5nLCBvID0gdGhpcy5nZXQoKSkge1xuICAgIHRoaXMuZmx1c2goKTsgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBhID0gdGhpcy5saW5lQXQoby5zKSwgeiA9IHRoaXMubGluZUF0KG8uZSk7XG4gICAgY29uc3QgdG8gPSBhbGwuc2xpY2UoYSwgeiArIDEpLmV2ZXJ5KGIgPT4gdGhpcy50eXBlT2YoYikgPT09IHR5cGUpID8gJ3AnIDogdHlwZTtcbiAgICB0aGlzLnJlYnVpbGQoYWxsLm1hcCgoYiwgaSk6IFtzdHJpbmcsIE5vZGVdID0+IFtpID49IGEgJiYgaSA8PSB6ID8gdG8gOiB0aGlzLnR5cGVPZihiKSwgYl0pKTsgdGhpcy5zZXQobyk7IHRoaXMuY29tbWl0KG8pO1xuICB9XG4gIHByaXZhdGUgZGVsKG86IFJhbmdlMik6IFJhbmdlMiB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBpID0gdGhpcy5saW5lQXQoby5zKSwgaiA9IHRoaXMubGluZUF0KG8uZSksIFthLCBhb10gPSB0aGlzLnBvaW50QXQoby5zLCB0cnVlKSwgW2IsIGJvXSA9IHRoaXMucG9pbnRBdChvLmUpO1xuICAgIGlmIChpID09PSBqKSB7IGNvbnN0IHJnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsgcmcuc2V0U3RhcnQoYSwgYW8pOyByZy5zZXRFbmQoYiwgYm8pOyByZy5kZWxldGVDb250ZW50cygpOyB0aGlzLnRpZHkoKTsgcmV0dXJuIHsgczogby5zLCBlOiBvLnMgfTsgfVxuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyBoZWFkLnNldFN0YXJ0KGEsIGFvKTsgaGVhZC5zZXRFbmQoYWxsW2ldLCBhbGxbaV0uY2hpbGROb2Rlcy5sZW5ndGgpOyBoZWFkLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgY29uc3QgdGFpbCA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7IHRhaWwuc2V0U3RhcnQoYWxsW2pdLCAwKTsgdGFpbC5zZXRFbmQoYiwgYm8pOyB0YWlsLmRlbGV0ZUNvbnRlbnRzKCk7XG4gICAgYWxsW2ldLmFwcGVuZCguLi5hbGxbal0uY2hpbGROb2Rlcyk7XG4gICAgdGhpcy5yZWJ1aWxkKGFsbC5maWx0ZXIoKF8sIGspID0+IGsgPD0gaSB8fCBrID4gaikubWFwKCh4KTogW3N0cmluZywgTm9kZV0gPT4gW3RoaXMudHlwZU9mKHgpLCB4XSkpO1xuICAgIHJldHVybiB7IHM6IG8ucywgZTogby5zIH07XG4gIH1cbiAgc3BsaXQobyA9IHRoaXMuZ2V0KCkpIHtcbiAgICB0aGlzLmZsdXNoKCk7IGNvbnN0IHByZSA9IG87IGlmIChvLnMgIT09IG8uZSkgbyA9IHRoaXMuZGVsKG8pO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubGluZXMoKSwgaSA9IHRoaXMubGluZUF0KG8ucyksIGIgPSBhbGxbaV0sIHQgPSB0aGlzLnR5cGVPZihiKSwgc3BlYyA9IHRoaXMuc3BlY09mKCksIG5leHQgPSB0ID09PSAnaDInID8gJ3AnIDogdDtcbiAgICBpZiAoIXRoaXMubGVuKGIpICYmIHQgIT09ICdwJykgeyBzcGVjW2ldWzBdID0gJ3AnOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChwcmUpOyByZXR1cm47IH1cbiAgICBpZiAodGhpcy5sZW4oYikgJiYgby5zID09PSB0aGlzLnN0YXJ0T2YoaSkpIHsgc3BlYy5zcGxpY2UoaSwgMCwgW25leHQsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKV0pOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KHsgczogby5zICsgMSwgZTogby5zICsgMSB9KTsgdGhpcy5jb21taXQocHJlKTsgcmV0dXJuOyB9XG4gICAgY29uc3QgW24sIGtdID0gdGhpcy5wb2ludEF0KG8ucyksIHJnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsgcmcuc2V0U3RhcnQobiwgayk7IHJnLnNldEVuZChiLCBiLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICBjb25zdCBuYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsgbmIuYXBwZW5kQ2hpbGQocmcuZXh0cmFjdENvbnRlbnRzKCkpO1xuICAgIHNwZWMuc3BsaWNlKGkgKyAxLCAwLCBbbmV4dCwgbmJdKTsgdGhpcy5yZWJ1aWxkKHNwZWMpOyB0aGlzLnNldCh7IHM6IG8ucyArIDEsIGU6IG8ucyArIDEgfSk7IHRoaXMuY29tbWl0KHByZSk7XG4gIH1cbiAgcHJpdmF0ZSBqb2luQmFjayhvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBzcGVjID0gdGhpcy5zcGVjT2YoKTtcbiAgICBpZiAoc3BlY1tpXVswXSAhPT0gJ3AnKSB7IHNwZWNbaV1bMF0gPSAncCc7IHRoaXMucmVidWlsZChzcGVjKTsgdGhpcy5zZXQobyk7IHRoaXMuY29tbWl0KG8pOyByZXR1cm47IH1cbiAgICBpZiAoIWkpIHJldHVybjtcbiAgICBhbGxbaSAtIDFdLmFwcGVuZCguLi5hbGxbaV0uY2hpbGROb2Rlcyk7IHNwZWMuc3BsaWNlKGksIDEpOyB0aGlzLnJlYnVpbGQoc3BlYyk7IHRoaXMuc2V0KHsgczogby5zIC0gMSwgZTogby5zIC0gMSB9KTsgdGhpcy5jb21taXQobyk7XG4gIH1cbiAgcHJpdmF0ZSBqb2luTmV4dChvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBzcGVjID0gdGhpcy5zcGVjT2YoKTsgaWYgKGkgPj0gYWxsLmxlbmd0aCAtIDEpIHJldHVybjtcbiAgICBhbGxbaV0uYXBwZW5kKC4uLmFsbFtpICsgMV0uY2hpbGROb2Rlcyk7IHNwZWMuc3BsaWNlKGkgKyAxLCAxKTsgdGhpcy5yZWJ1aWxkKHNwZWMpOyB0aGlzLnNldChvKTsgdGhpcy5jb21taXQobyk7XG4gIH1cbiAgcHJpdmF0ZSBpbnNlcnQoczogc3RyaW5nLCBvOiBSYW5nZTIpIHtcbiAgICBjb25zdCBbbiwga10gPSB0aGlzLnBvaW50QXQoby5zKTtcbiAgICBpZiAobi5ub2RlVHlwZSA9PT0gMykgKG4gYXMgVGV4dCkuaW5zZXJ0RGF0YShrLCBzKTsgZWxzZSBuLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzKSwgbi5jaGlsZE5vZGVzW2tdIHx8IG51bGwpO1xuICAgIHRoaXMudGlkeSgpOyByZXR1cm4gby5zICsgcy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSBpbnNlcnRMaW5lcyhpdGVtczogTGluZVtdLCBvOiBSYW5nZTIpIHtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIG8ucztcbiAgICBpZiAoby5zICE9PSBvLmUpIG8gPSB0aGlzLmRlbChvKTtcbiAgICBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCksIGkgPSB0aGlzLmxpbmVBdChvLnMpLCBiID0gYWxsW2ldLCBbbiwga10gPSB0aGlzLnBvaW50QXQoby5zKSwgc3BlYyA9IHRoaXMuc3BlY09mKCk7XG4gICAgY29uc3QgcmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOyByZy5zZXRTdGFydChuLCBrKTsgcmcuc2V0RW5kKGIsIGIuY2hpbGROb2Rlcy5sZW5ndGgpOyBjb25zdCB0YWlsID0gcmcuZXh0cmFjdENvbnRlbnRzKCk7XG4gICAgaWYgKCFiLnRleHRDb250ZW50ICYmIGl0ZW1zWzBdLnQgIT09ICdwJykgc3BlY1tpXVswXSA9IGl0ZW1zWzBdLnQ7XG4gICAgbGV0IGF0ID0gby5zICsgaXRlbXNbMF0ubGVuOyBiLmFwcGVuZChpdGVtc1swXS5mcmFnKTtcbiAgICBjb25zdCByZXN0ID0gaXRlbXMuc2xpY2UoMSkubWFwKCh4KTogW3N0cmluZywgTm9kZV0gPT4geyBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOyBwLmFwcGVuZCh4LmZyYWcpOyBhdCArPSAxICsgeC5sZW47IHJldHVybiBbeC50LCBwXTsgfSk7XG4gICAgc3BlYy5zcGxpY2UoaSArIDEsIDAsIC4uLnJlc3QpOyAocmVzdC5sZW5ndGggPyByZXN0W3Jlc3QubGVuZ3RoIC0gMV1bMV0gYXMgSFRNTEVsZW1lbnQgOiBiKS5hcHBlbmQodGFpbCk7XG4gICAgdGhpcy5yZWJ1aWxkKHNwZWMpOyByZXR1cm4gYXQ7XG4gIH1cbiAgbGluayhvOiBSYW5nZTIsIGhyZWY6IHN0cmluZyB8IG51bGwpIHtcbiAgICB0aGlzLmZsdXNoKCk7XG4gICAgaWYgKCFocmVmKSB7IGNvbnN0IHJnID0gdGhpcy5yYW5nZShvKTsgWy4uLnRoaXMuZWQucXVlcnlTZWxlY3RvckFsbCgnYScpXS5maWx0ZXIoYSA9PiByZy5pbnRlcnNlY3RzTm9kZShhKSkuZm9yRWFjaChhID0+IHRoaXMudW53cmFwKGEpKTsgdGhpcy50aWR5KCk7IHRoaXMuc2V0KG8pOyB0aGlzLmNvbW1pdChvKTsgcmV0dXJuOyB9XG4gICAgaWYgKG8ucyAhPT0gby5lKSByZXR1cm4gdGhpcy5pbmxpbmUoJ0EnLCBocmVmLCBvKTtcbiAgICBjb25zdCBhID0gdGhpcy51cCh0aGlzLnBvaW50QXQoby5zKVswXSwgJ0EnKTtcbiAgICBpZiAoYSkgeyBhLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpOyB0aGlzLnNldChvKTsgdGhpcy5jb21taXQobyk7IHJldHVybjsgfVxuICAgIGNvbnN0IGxhYmVsID0gaHJlZi5yZXBsYWNlKC9ebWFpbHRvOi9pLCAnJyksIGVuZCA9IHRoaXMuaW5zZXJ0KGxhYmVsLCBvKTtcbiAgICB0aGlzLmNvdmVyZWQoeyBzOiBvLnMsIGU6IGVuZCB9KS5mb3JFYWNoKHQgPT4gdGhpcy53cmFwKHQsICdBJywgaHJlZikpOyB0aGlzLnRpZHkoKTsgdGhpcy5zZXQoeyBzOiBlbmQsIGU6IGVuZCB9KTsgdGhpcy5jb21taXQobyk7XG4gIH1cblxuICAvLyAtLS0tIHN1Z2dlc3Rpb24gLS0tLVxuICBzdWdnZXN0KG86IFJhbmdlMiwga2luZDogJ3N3YXAnIHwgJ2FkZCcpIHtcbiAgICB0aGlzLmZsdXNoKCk7IHRoaXMucGVuZCA9IG51bGw7XG4gICAgY29uc3QgbncgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IG53LmNsYXNzTmFtZSA9ICd2by1ydGUtbmV3JzsgbncuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJztcbiAgICBjb25zdCBvbGRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgaWYgKGtpbmQgPT09ICdzd2FwJykge1xuICAgICAgY29uc3QgYWxsID0gdGhpcy5saW5lcygpLCBhID0gdGhpcy5saW5lQXQoby5zKSwgeiA9IHRoaXMubGluZUF0KG8uZSk7XG4gICAgICBmb3IgKGxldCBpID0gejsgaSA+PSBhOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcyA9IE1hdGgubWF4KG8ucywgdGhpcy5zdGFydE9mKGkpKSwgZSA9IE1hdGgubWluKG8uZSwgdGhpcy5zdGFydE9mKGkpICsgdGhpcy5sZW4oYWxsW2ldKSk7IGlmIChlIDw9IHMpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCByZyA9IHRoaXMucmFuZ2UoeyBzLCBlIH0pLCBzcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgc3AuY2xhc3NOYW1lID0gJ3ZvLXJ0ZS1vbGQnO1xuICAgICAgICBzcC5hcHBlbmRDaGlsZChyZy5leHRyYWN0Q29udGVudHMoKSk7IHJnLmluc2VydE5vZGUoc3ApOyBvbGRzLnVuc2hpZnQoc3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob2xkcy5sZW5ndGgpIG9sZHNbb2xkcy5sZW5ndGggLSAxXS5hZnRlcihudyk7IGVsc2UgdGhpcy5yYW5nZSh7IHM6IG8uZSwgZTogby5lIH0pLmluc2VydE5vZGUobncpO1xuICAgIHRoaXMucmV2ID0geyBvLCBraW5kLCBvbGRzLCBudyB9O1xuICAgIHJldHVybiAoczogc3RyaW5nKSA9PiB7IGlmICh0aGlzLnJldiAmJiB0aGlzLnJldi5udyA9PT0gbncpIHsgY29uc3QgdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgdy5jbGFzc05hbWUgPSAndm8tdyc7IHcudGV4dENvbnRlbnQgPSBzOyBudy5hcHBlbmRDaGlsZCh3KTsgdGhpcy5zaG93UmFuZ2Uodyk7IH0gfTtcbiAgfVxuICBwcml2YXRlIGRyb3AoKSB7IGlmICghdGhpcy5yZXYpIHJldHVybiBudWxsOyBjb25zdCByID0gdGhpcy5yZXY7IHIub2xkcy5mb3JFYWNoKHggPT4gdGhpcy51bndyYXAoeCkpOyByLm53LnJlbW92ZSgpOyB0aGlzLnJldiA9IG51bGw7IHRoaXMudGlkeSgpOyByZXR1cm4gcjsgfVxuICBhY2NlcHQoKSB7XG4gICAgY29uc3QgcyA9IHRoaXMucmV2ID8gdGhpcy5yZXYubncudGV4dENvbnRlbnQgfHwgJycgOiAnJzsgY29uc3QgciA9IHRoaXMuZHJvcCgpOyBpZiAoIXIpIHJldHVybjtcbiAgICBjb25zdCBpdGVtcyA9IHMuc3BsaXQoL1xcbisvKS5maWx0ZXIoQm9vbGVhbikubWFwKGwgPT4geyBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOyBmcmFnLmFwcGVuZChsKTsgcmV0dXJuIHsgdDogJ3AnLCBmcmFnLCBsZW46IGwubGVuZ3RoIH07IH0pO1xuICAgIGNvbnN0IGF0ID0gdGhpcy5pbnNlcnRMaW5lcyhpdGVtcywgci5raW5kID09PSAnc3dhcCcgPyByLm8gOiB7IHM6IHIuby5lLCBlOiByLm8uZSB9KTtcbiAgICB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy5jb21taXQoci5vKTtcbiAgfVxuICBkaXNjYXJkKCkgeyBjb25zdCByID0gdGhpcy5kcm9wKCk7IGlmIChyKSB0aGlzLnNldChyLm8pOyB0aGlzLmNoYW5nZWQoKTsgfVxuICBuZXdUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnJldiA/IHRoaXMucmV2Lm53LnRleHRDb250ZW50IHx8ICcnIDogJyc7IH1cblxuICAvLyAtLS0tIGJyb3dzZXIgZXZlbnRzLCByb3V0ZWQgdGhyb3VnaCB0aGUgZWRpdHMgLS0tLVxuICBwcml2YXRlIG9uQmVmb3JlSW5wdXQoZTogSW5wdXRFdmVudCkge1xuICAgIGNvbnN0IHQgPSBlLmlucHV0VHlwZTtcbiAgICBpZiAodGhpcy5yZXYpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyByZXR1cm47IH1cbiAgICBpZiAodCA9PT0gJ2hpc3RvcnlVbmRvJyB8fCB0ID09PSAnaGlzdG9yeVJlZG8nKSB7IGUucHJldmVudERlZmF1bHQoKTsgaWYgKHQgPT09ICdoaXN0b3J5VW5kbycpIHRoaXMudW5kbygpOyBlbHNlIHRoaXMucmVkbygpOyByZXR1cm47IH1cbiAgICBpZiAodC5zdGFydHNXaXRoKCdmb3JtYXQnKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGlmICh0ID09PSAnZm9ybWF0Qm9sZCcpIHRoaXMuaW5saW5lKCdCJyk7IGVsc2UgaWYgKHQgPT09ICdmb3JtYXRJdGFsaWMnKSB0aGlzLmlubGluZSgnSScpOyByZXR1cm47IH1cbiAgICBpZiAodCA9PT0gJ2luc2VydFBhcmFncmFwaCcgfHwgdCA9PT0gJ2luc2VydExpbmVCcmVhaycpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLnNwbGl0KCk7IHJldHVybjsgfVxuICAgIGlmICh0ID09PSAnaW5zZXJ0RnJvbVBhc3RlJyB8fCB0ID09PSAnaW5zZXJ0RnJvbURyb3AnIHx8IHQgPT09ICdkZWxldGVCeURyYWcnIHx8IHQgPT09ICdkZWxldGVCeUN1dCcpIHJldHVybjtcbiAgICBjb25zdCBvID0gdGhpcy5nZXQoKSwgaSA9IHRoaXMubGluZUF0KG8ucyk7XG4gICAgaWYgKHQgPT09ICdpbnNlcnRUZXh0JyAmJiBlLmRhdGEgJiYgdGhpcy5wZW5kICYmIG8ucyA9PT0gby5lICYmIHRoaXMucGVuZC5hdCA9PT0gby5zKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy50eXBlU3R5bGVkKGUuZGF0YSk7IHJldHVybjsgfVxuICAgIGlmIChvLnMgPT09IG8uZSAmJiAvXmRlbGV0ZS4qQmFja3dhcmQkLy50ZXN0KHQpICYmIG8ucyA9PT0gdGhpcy5zdGFydE9mKGkpKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5mbHVzaCgpOyB0aGlzLmpvaW5CYWNrKG8pOyByZXR1cm47IH1cbiAgICBpZiAoby5zID09PSBvLmUgJiYgL15kZWxldGUuKkZvcndhcmQkLy50ZXN0KHQpICYmIG8ucyA9PT0gdGhpcy5zdGFydE9mKGkpICsgdGhpcy5sZW4odGhpcy5saW5lcygpW2ldKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHRoaXMuZmx1c2goKTsgdGhpcy5qb2luTmV4dChvKTsgcmV0dXJuOyB9XG4gICAgaWYgKG8ucyAhPT0gby5lICYmIGkgIT09IHRoaXMubGluZUF0KG8uZSkgJiYgKHQuc3RhcnRzV2l0aCgnZGVsZXRlJykgfHwgdCA9PT0gJ2luc2VydFRleHQnIHx8IHQgPT09ICdpbnNlcnRSZXBsYWNlbWVudFRleHQnKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmZsdXNoKCk7IGNvbnN0IHAgPSB0aGlzLmRlbChvKTsgbGV0IGF0ID0gcC5zO1xuICAgICAgY29uc3QgcyA9IGUuZGF0YSB8fCAoZS5kYXRhVHJhbnNmZXIgJiYgZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dC9wbGFpbicpKSB8fCAnJztcbiAgICAgIGlmIChzICYmIHQuc3RhcnRzV2l0aCgnaW5zZXJ0JykpIGF0ID0gdGhpcy5pbnNlcnQocy5yZXBsYWNlKC9cXHMqXFxuXFxzKi9nLCAnICcpLCBwKTtcbiAgICAgIHRoaXMuc2V0KHsgczogYXQsIGU6IGF0IH0pOyB0aGlzLmNvbW1pdChvKTsgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuSC5kaXJ0eSkgdGhpcy5ILnByZSA9IG87XG4gIH1cbiAgcHJpdmF0ZSBvbkRyb3AoZTogRHJhZ0V2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpOyBpZiAodGhpcy5yZXYgfHwgIWUuZGF0YVRyYW5zZmVyKSByZXR1cm47XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnBsYWluKGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKSk7IGlmICghaXRlbXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgRG9jdW1lbnQgJiB7IGNhcmV0UmFuZ2VGcm9tUG9pbnQ/OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFJhbmdlIHwgbnVsbDsgY2FyZXRQb3NpdGlvbkZyb21Qb2ludD86ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4geyBvZmZzZXROb2RlOiBOb2RlOyBvZmZzZXQ6IG51bWJlciB9IHwgbnVsbCB9O1xuICAgIGxldCBhdDogW05vZGUsIG51bWJlcl0gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZG9jLmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQpIHsgY29uc3QgcHAgPSBkb2MuY2FyZXRQb3NpdGlvbkZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7IGlmIChwcCkgYXQgPSBbcHAub2Zmc2V0Tm9kZSwgcHAub2Zmc2V0XTsgfVxuICAgIGVsc2UgaWYgKGRvYy5jYXJldFJhbmdlRnJvbVBvaW50KSB7IGNvbnN0IHIgPSBkb2MuY2FyZXRSYW5nZUZyb21Qb2ludChlLmNsaWVudFgsIGUuY2xpZW50WSk7IGlmIChyKSBhdCA9IFtyLnN0YXJ0Q29udGFpbmVyLCByLnN0YXJ0T2Zmc2V0XTsgfVxuICAgIGlmICghYXQgfHwgIXRoaXMuZWQuY29udGFpbnMoYXRbMF0pKSByZXR1cm47XG4gICAgdGhpcy5mbHVzaCgpOyBjb25zdCBhMCA9IHRoaXMub2Zmc2V0T2YoYXRbMF0sIGF0WzFdKSwgZW5kID0gdGhpcy5pbnNlcnRMaW5lcyhpdGVtcywgeyBzOiBhMCwgZTogYTAgfSk7IHRoaXMuc2V0KHsgczogZW5kLCBlOiBlbmQgfSwgdHJ1ZSk7IHRoaXMuY29tbWl0KHsgczogYTAsIGU6IGEwIH0pO1xuICB9XG4gIHByaXZhdGUgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZS5pc0NvbXBvc2luZyB8fCB0aGlzLmhvb2sua2V5Py4oZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5yZXYpIHJldHVybjtcbiAgICBjb25zdCBtb2QgPSBpc01hYygpID8gZS5tZXRhS2V5ICYmICFlLmN0cmxLZXkgOiBlLmN0cmxLZXkgJiYgIWUubWV0YUtleTtcbiAgICBpZiAoIW1vZCkgcmV0dXJuO1xuICAgIGNvbnN0IGsgPSBlLmtleS50b0xvd2VyQ2FzZSgpLCBjID0gZS5jb2RlO1xuICAgIGNvbnN0IGFjdCA9IGUuYWx0S2V5ID8gKGMgPT09ICdEaWdpdDEnID8gKCkgPT4gdGhpcy5ibG9jaygnaDInKSA6IGMgPT09ICdEaWdpdDAnID8gKCkgPT4gdGhpcy5ibG9jaygncCcpIDogbnVsbClcbiAgICAgIDogZS5zaGlmdEtleSA/IChjID09PSAnRGlnaXQ3JyA/ICgpID0+IHRoaXMuYmxvY2soJ29sJykgOiBjID09PSAnRGlnaXQ4JyA/ICgpID0+IHRoaXMuYmxvY2soJ3VsJykgOiBjID09PSAnRGlnaXQ5JyA/ICgpID0+IHRoaXMuYmxvY2soJ3F1b3RlJykgOiBrID09PSAneicgPyAoKSA9PiB0aGlzLnJlZG8oKSA6IG51bGwpXG4gICAgICA6IGsgPT09ICdiJyA/ICgpID0+IHRoaXMuaW5saW5lKCdCJykgOiBrID09PSAnaScgPyAoKSA9PiB0aGlzLmlubGluZSgnSScpIDogayA9PT0gJ2UnID8gKCkgPT4gdGhpcy5pbmxpbmUoJ0NPREUnKSA6IGsgPT09ICd6JyA/ICgpID0+IHRoaXMudW5kbygpIDogayA9PT0gJ3knID8gKCkgPT4gdGhpcy5yZWRvKCkgOiBudWxsO1xuICAgIGlmIChhY3QpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBhY3QoKTsgfVxuICB9XG5cbiAgLy8gLS0tLSBwdWJsaWMgaGVscGVycyB1c2VkIGJ5IHRoZSBjb21wb25lbnQgLS0tLVxuICBmb2N1cygpIHsgdGhpcy5zZXQodGhpcy5nZXQoKSwgdHJ1ZSk7IH1cbiAgaHRtbCgpIHsgcmV0dXJuIHRoaXMuZWQuaW5uZXJIVE1MOyB9XG4gIHJldmlld2luZygpIHsgcmV0dXJuICEhdGhpcy5yZXY7IH1cbiAgY2FuVW5kbygpIHsgcmV0dXJuIHRoaXMuSC5hdCA+IDAgfHwgdGhpcy5ILmRpcnR5OyB9XG4gIGNhblJlZG8oKSB7IHJldHVybiB0aGlzLkguYXQgPCB0aGlzLkgubGlzdC5sZW5ndGggLSAxOyB9XG4gIGVtcHR5KCkgeyBjb25zdCBhbGwgPSB0aGlzLmxpbmVzKCk7IHJldHVybiBhbGwubGVuZ3RoID09PSAxICYmICF0aGlzLmxlbihhbGxbMF0pICYmIHRoaXMudHlwZU9mKGFsbFswXSkgPT09ICdwJzsgfVxuICB3b3JkcygpIHsgY29uc3QgcyA9IHRoaXMubGluZXMoKS5tYXAoYiA9PiBiLnRleHRDb250ZW50KS5qb2luKCcgJykudHJpbSgpOyByZXR1cm4gcyA/IHMuc3BsaXQoL1xccysvKS5sZW5ndGggOiAwOyB9XG4gIGxpbmUoYXQ6IG51bWJlcik6IFJhbmdlMiB7IGNvbnN0IGkgPSB0aGlzLmxpbmVBdChhdCksIHMgPSB0aGlzLnN0YXJ0T2YoaSk7IHJldHVybiB7IHMsIGU6IHMgKyB0aGlzLmxlbih0aGlzLmxpbmVzKClbaV0pIH07IH1cbiAgc3RhdGUoKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuZ2V0KCksIGFsbCA9IHRoaXMubGluZXMoKSwgdHMgPSBhbGwuc2xpY2UodGhpcy5saW5lQXQoby5zKSwgdGhpcy5saW5lQXQoby5lKSArIDEpLm1hcChiID0+IHRoaXMudHlwZU9mKGIpKSwgZyA9IHRoaXMubGl2ZSgpO1xuICAgIGNvbnN0IGEgPSB0aGlzLnVwKG8ucyA9PT0gby5lICYmIGcgPyBnLnN0YXJ0Q29udGFpbmVyIDogdGhpcy5wb2ludEF0KG8ucywgby5zICE9PSBvLmUpWzBdLCAnQScpO1xuICAgIHJldHVybiB7IEI6IHRoaXMuaGFzKCdCJywgbyksIEk6IHRoaXMuaGFzKCdJJywgbyksIENPREU6IHRoaXMuaGFzKCdDT0RFJywgbyksIEE6IG8ucyA9PT0gby5lID8gISFhIDogdGhpcy5oYXMoJ0EnLCBvKSwgaHJlZjogYSA/IGEuZ2V0QXR0cmlidXRlKCdocmVmJykgOiBudWxsLCBibG9jazogdHMuZXZlcnkodCA9PiB0ID09PSB0c1swXSkgPyB0c1swXSA6IG51bGwgfTtcbiAgfVxuICByZW1vdmUobzogUmFuZ2UyKSB7IHRoaXMuZmx1c2goKTsgdGhpcy5zZXQodGhpcy5kZWwobykpOyB0aGlzLmNvbW1pdChvKTsgfVxuICB0eXBlKHM6IHN0cmluZykgeyBjb25zdCBvID0gdGhpcy5nZXQoKTsgdGhpcy5mbHVzaCgpOyBjb25zdCBhdCA9IHRoaXMuaW5zZXJ0KHMsIG8pOyB0aGlzLnNldCh7IHM6IGF0LCBlOiBhdCB9KTsgdGhpcy50eXBlZChvKTsgdGhpcy5zaG93UmFuZ2UodGhpcy5yYW5nZSh7IHM6IGF0LCBlOiBhdCB9KSk7IH1cbiAgc2hvdyhvOiBSYW5nZTIpIHsgdGhpcy5zaG93UmFuZ2UodGhpcy5yYW5nZShvKSk7IH1cbiAgZGVzdHJveSgpIHsgY2xlYXJUaW1lb3V0KHRoaXMuSC50KTsgdGhpcy5vZmZzLmZvckVhY2goZiA9PiBmKCkpOyB0aGlzLm9mZnMgPSBbXTsgfVxufVxuXG4vKiAtLS0tLS0tLS0tIHRoZSBkZW1vJ3Mgd3JpdGVyOiBjYW5uZWQgcmV3cml0ZXMgZm9yIHRoZSBwcmV2aWV3J3MgZHJhZnQsIGFuZCBzaW1wbGUgcnVsZXMgZm9yIGFueXRoaW5nIGVsc2UgLS0tLS0tLS0tLSAqL1xuY29uc3QgQ0FOTkVEOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgJ1dlIGtub3cgcHJpY2luZyBjaGFuZ2VzIGNhbiBmZWVsIGxpa2UgYSBsb3QsIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGhhcyBwbGVudHkgb2YgdGltZSB0byBsb29rIGF0IHRoZSBuZXcgcGxhbnMgYW5kIGFzayB1cyBxdWVzdGlvbnMgYmVmb3JlIGFueXRoaW5nIGNoYW5nZXMuJzpcbiAgICB7IHNob3J0ZXI6IFwiV2UncmUgZ2l2aW5nIGV2ZXJ5b25lIHRpbWUgdG8gcmV2aWV3IHRoZSBuZXcgcGxhbnMgYW5kIGFzayBxdWVzdGlvbnMgYmVmb3JlIGFueXRoaW5nIGNoYW5nZXMuXCIsIGltcHJvdmU6ICdQcmljaW5nIGNoYW5nZXMgY2FuIGZlZWwgbGlrZSBhIGxvdCwgc28gZXZlcnlvbmUgZ2V0cyBwbGVudHkgb2YgdGltZSB0byByZXZpZXcgdGhlIG5ldyBwbGFucyBhbmQgYXNrIHF1ZXN0aW9ucyBiZWZvcmUgYW55dGhpbmcgY2hhbmdlcy4nIH0sXG4gICdOZXcgcHJpY2luZyBnb2VzIGxpdmUgb24gTWFyY2ggMy4nOiB7IGltcHJvdmU6ICdPdXIgbmV3IHByaWNpbmcgZ29lcyBsaXZlIG9uIE1hcmNoIDMuJywgc2hvcnRlcjogJ05ldyBwcmljaW5nIHN0YXJ0cyBNYXJjaCAzLicgfSxcbiAgJ1N0YXJ0ZXIgdGVhbXMgZ2V0IHR3byBtb3JlIHNlYXRzIGZvciBmcmVlLCBhbmQgZXZlcnkgcGxhbiBub3cgaW5jbHVkZXMgdGhlIGFnZW50Lic6IHsgaW1wcm92ZTogJ1N0YXJ0ZXIgdGVhbXMgZ2V0IHR3byBleHRyYSBzZWF0cyBhdCBubyBjb3N0LCBhbmQgZXZlcnkgcGxhbiBub3cgaW5jbHVkZXMgdGhlIGFnZW50LicsIHNob3J0ZXI6ICdTdGFydGVyIHRlYW1zIGdldCB0d28gZnJlZSBzZWF0cywgYW5kIGV2ZXJ5IHBsYW4gaW5jbHVkZXMgdGhlIGFnZW50LicgfSxcbn07XG5jb25zdCBUWVBPOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyB0ZWg6ICd0aGUnLCByZWNpZXZlOiAncmVjZWl2ZScsIHNlcGVyYXRlOiAnc2VwYXJhdGUnLCBkZWZpbmF0ZWx5OiAnZGVmaW5pdGVseScsIGFsb3Q6ICdhIGxvdCcsIGRvbnQ6IFwiZG9uJ3RcIiwgY2FudDogXCJjYW4ndFwiLCB3b250OiBcIndvbid0XCIsIGltOiBcIkknbVwiLCBpdmU6IFwiSSd2ZVwiLCB0aGllcjogJ3RoZWlyJywgdW50aWxsOiAndW50aWwnLCBvY2N1cmVkOiAnb2NjdXJyZWQnLCB3aWNoOiAnd2hpY2gnLCBiZWN1YXNlOiAnYmVjYXVzZScsIHlvdXJlOiBcInlvdSdyZVwiLCBkb2VzbnQ6IFwiZG9lc24ndFwiLCBpc250OiBcImlzbid0XCIsIHRvbW1vcm93OiAndG9tb3Jyb3cnLCBhY2Nyb3NzOiAnYWNyb3NzJyB9O1xuY29uc3QgRklMTEVSOiBbUmVnRXhwLCBzdHJpbmddW10gPSBbWy9cXGIocmVhbGx5fHZlcnl8anVzdHxhY3R1YWxseXxiYXNpY2FsbHl8cXVpdGV8c2ltcGx5fGRlZmluaXRlbHl8Y2VydGFpbmx5fGxpdGVyYWxseXx0b3RhbGx5KVxccysvZ2ksICcnXSwgWy9cXGJpbiBvcmRlciB0b1xcYi9naSwgJ3RvJ10sIFsvXFxibWFrZSBzdXJlICh0aGF0ICk/L2dpLCAnZW5zdXJlICddLCBbL1xcYmR1ZSB0byB0aGUgZmFjdCB0aGF0XFxiL2dpLCAnYmVjYXVzZSddLCBbL1xcYmF0IHRoaXMgcG9pbnQgaW4gdGltZVxcYi9naSwgJ25vdyddLCBbL1xcYmEgbG90IG9mXFxiL2dpLCAnbWFueSddLCBbL1xcYnBsZW50eSBvZlxcYi9naSwgJ2Vub3VnaCddLCBbL1xcYmlzIGFibGUgdG9cXGIvZ2ksICdjYW4nXV07XG5jb25zdCBCRVRURVI6IFtSZWdFeHAsIHN0cmluZ11bXSA9IFtbL1xcYndlIHdpbGxcXGIvZ2ksIFwid2UnbGxcIl0sIFsvXFxid2UgYXJlXFxiL2dpLCBcIndlJ3JlXCJdLCBbL1xcYml0IGlzXFxiL2dpLCBcIml0J3NcIl0sIFsvXFxiZG8gbm90XFxiL2dpLCBcImRvbid0XCJdLCBbL1xcYmNhbm5vdFxcYi9naSwgXCJjYW4ndFwiXSwgWy9cXGJ2ZXJ5IGltcG9ydGFudFxcYi9naSwgJ2Vzc2VudGlhbCddLCBbL1xcYmdvb2RcXGIvZ2ksICdzdHJvbmcnXSwgWy9cXGJiaWdcXGIvZ2ksICdtYWpvciddLCBbL1xcYnN0dWZmXFxiL2dpLCAnZGV0YWlscyddLCBbL1xcYmtpbmQgb2ZcXHMrL2dpLCAnJ10sIFsvXFxiYXQgbm8gZXh0cmEgY29zdFxcYi9naSwgJ2ZyZWUnXV07XG4vKiogVGhlIGRlbW8ncyBzdGFuZC1pbiBmb3IgYSBtb2RlbDogY2FubmVkIHJld3JpdGVzIGZvciB0aGUgcHJldmlldydzIGRyYWZ0IGFib3V0IGEgcHJpY2luZyBsYXVuY2gsIGFuZCBzaW1wbGUgcnVsZXMgZm9yIGFueXRoaW5nIGVsc2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW1vV3JpdGUoYWN0aW9uOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgZG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmaXggPSAoczogc3RyaW5nKSA9PiBzLnJlcGxhY2UoL1sgXFx0XXsyLH0vZywgJyAnKS5yZXBsYWNlKC9cXHMrKFssLiE/OzpdKS9nLCAnJDEnKS5yZXBsYWNlKC9cXGJpXFxiL2csICdJJylcbiAgICAucmVwbGFjZSgvXFxiW2Etel0rXFxiL2dpLCB3ID0+IHsgY29uc3QgZiA9IFRZUE9bdy50b0xvd2VyQ2FzZSgpXTsgcmV0dXJuIGYgPyAod1swXSA9PT0gd1swXS50b1VwcGVyQ2FzZSgpID8gZlswXS50b1VwcGVyQ2FzZSgpICsgZi5zbGljZSgxKSA6IGYpIDogdzsgfSlcbiAgICAucmVwbGFjZSgvKF58Wy4hP11cXHMrKShbYS16XSkvZywgKF8sIGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBhICsgYi50b1VwcGVyQ2FzZSgpKS5yZXBsYWNlKC8oW2EtejAtOV0pXFxzKiQvaSwgKG0sIGE6IHN0cmluZykgPT4gcy50cmltKCkuc3BsaXQoL1xccysvKS5sZW5ndGggPiAzID8gYSArICcuJyA6IG0pO1xuICBpZiAoYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgY29uc3QgbmV4dCA9IC9wcmljfHBsYW58c2VhdHxsYXVuY2gvaS50ZXN0KGRvYylcbiAgICAgID8gWydDdXJyZW50IGN1c3RvbWVycyBrZWVwIHRoZWlyIHByaWNlIHVudGlsIHRoZWlyIG5leHQgcmVuZXdhbCwgYW5kIGV2ZXJ5IGFkbWluIGdldHMgYW4gZW1haWwgdGhhdCBzdW1zIHVwIHdoYXQgY2hhbmdlcyBmb3IgdGhlaXIgdGVhbS4nLCAnSWYgYW55dGhpbmcgaXMgdW5jbGVhciwgcmVwbHkgdG8gdGhpcyBlbWFpbCBhbmQgd2Ugd2lsbCB3YWxrIHlvdSB0aHJvdWdoIGl0LiddXG4gICAgICA6IFsnTmV4dCwgd2Ugd2lsbCBzaGFyZSBhIHNob3J0IHN1bW1hcnkgc28gZXZlcnlvbmUga25vd3Mgd2hhdCBjaGFuZ2VzIGFuZCB3aGVuLicsICdSZXBseSB3aXRoIGFueSBxdWVzdGlvbnMgYW5kIHdlIHdpbGwgZ2V0IGJhY2sgdG8geW91IHdpdGhpbiBhIGRheS4nXTtcbiAgICByZXR1cm4gbmV4dC5maW5kKHggPT4gIWRvYy5pbmNsdWRlcyh4KSkgfHwgbmV4dFtuZXh0Lmxlbmd0aCAtIDFdO1xuICB9XG4gIGlmIChhY3Rpb24gPT09ICdncmFtbWFyJykgcmV0dXJuIGZpeCh0ZXh0KTtcbiAgY29uc3QgcnVsZXMgPSAoczogc3RyaW5nLCBsaXN0OiBbUmVnRXhwLCBzdHJpbmddW10pID0+IGxpc3QucmVkdWNlKCh4LCBbYSwgYl0pID0+IHgucmVwbGFjZShhLCBiKSwgcyk7XG4gIHJldHVybiAodGV4dC5tYXRjaCgvW15dKj8oPzpbLiE/XSsoPz1cXHN8JCl8JClcXHMqL2cpIHx8IFt0ZXh0XSkuZmlsdGVyKEJvb2xlYW4pLm1hcChzID0+IHtcbiAgICBjb25zdCBrID0gcy50cmltKCksIGhpdCA9IENBTk5FRFtrXSAmJiBDQU5ORURba11bYWN0aW9uXTsgaWYgKGhpdCkgcmV0dXJuIHMucmVwbGFjZShrLCBoaXQpO1xuICAgIGxldCB4ID0gZml4KHJ1bGVzKHMsIGFjdGlvbiA9PT0gJ3Nob3J0ZXInID8gRklMTEVSIDogWy4uLkZJTExFUi5zbGljZSgwLCAyKSwgLi4uQkVUVEVSXSkpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzaG9ydGVyJyAmJiB4LnRyaW0oKS5sZW5ndGggPiA2MCAmJiB4Lmxlbmd0aCA+IHMubGVuZ3RoICogLjg1ICYmIHguaW5jbHVkZXMoJywgJykpIHggPSB4LnNsaWNlKDAsIHguaW5kZXhPZignLCAnKSkgKyAnLicgKyAoL1xccyQvLnRlc3QocykgPyAnICcgOiAnJyk7XG4gICAgcmV0dXJuIHg7XG4gIH0pLmpvaW4oJycpO1xufVxuLyoqIFRoZSBkZWZhdWx0IGBhaWA6IGRlbW9Xcml0ZSdzIGFuc3dlciwgc3RyZWFtZWQgYSB3b3JkIGF0IGEgdGltZSBhZnRlciBhIHNob3J0IHBhdXNlLCBhcyBhIG1vZGVsIHdvdWxkICovXG5leHBvcnQgY29uc3QgZGVtb0FpOiBSaWNoVGV4dEFpID0gYXN5bmMgZnVuY3Rpb24qICh7IGFjdGlvbiwgdGV4dCwgZG9jdW1lbnQ6IGRvYywgc2lnbmFsIH0pIHtcbiAgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZTx2b2lkPihyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XG4gIGNvbnN0IHJlZHVjZSA9IHR5cGVvZiBtYXRjaE1lZGlhICE9PSAndW5kZWZpbmVkJyAmJiBtYXRjaE1lZGlhKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7XG4gIGNvbnN0IG91dCA9IGRlbW9Xcml0ZShhY3Rpb24sIHRleHQsIGRvYyk7XG4gIGlmIChyZWR1Y2UpIHsgeWllbGQgb3V0OyByZXR1cm47IH1cbiAgYXdhaXQgd2FpdCg0NTApO1xuICBmb3IgKGNvbnN0IHcgb2Ygb3V0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpIHx8IFtdKSB7IGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuOyB5aWVsZCB3OyBhd2FpdCB3YWl0KDQ4KTsgfVxufTtcblxuY29uc3QgQUNUSU9OUzogUmljaFRleHRBaUFjdGlvbltdID0gW1xuICB7IGtleTogJ2ltcHJvdmUnLCBsYWJlbDogJ0ltcHJvdmUgd3JpdGluZycsIGljb246ICdzcGFyaycgfSxcbiAgeyBrZXk6ICdzaG9ydGVyJywgbGFiZWw6ICdNYWtlIHNob3J0ZXInLCBpY29uOiAnbWludXMnIH0sXG4gIHsga2V5OiAnZ3JhbW1hcicsIGxhYmVsOiAnRml4IGdyYW1tYXInLCBpY29uOiAnY2hlY2snIH0sXG4gIHsga2V5OiAnY29udGludWUnLCBsYWJlbDogJ0NvbnRpbnVlIHdyaXRpbmcnLCBpY29uOiAnZWRpdCcsIGtpbmQ6ICdhZGQnIH0sXG5dO1xuY29uc3Qga2V5c09mID0gKGs6IHN0cmluZywgbWFjOiBib29sZWFuKSA9PiBrID09PSAncmVkbycgPyAobWFjID8gJ+KHp+KMmFonIDogJ0N0cmwrWScpXG4gIDogay5zcGxpdCgnICcpLm1hcCh4ID0+ICgoeyBtb2Q6IG1hYyA/ICfijJgnIDogJ0N0cmwnLCBhbHQ6IG1hYyA/ICfijKUnIDogJ0FsdCcsIHNoaWZ0OiBtYWMgPyAn4oenJyA6ICdTaGlmdCcgfSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbeF0gfHwgeCkuam9pbihtYWMgPyAnJyA6ICcrJyk7XG5jb25zdCBUT09MUzogeyBmOiBSaWNoVGV4dEZvcm1hdCB8ICdhJzsgbGFiZWw6IHN0cmluZzsgaWNvbjogVm9JY29uTmFtZTsgazogc3RyaW5nIH1bXSA9IFtcbiAgeyBmOiAnaDInLCBsYWJlbDogJ0hlYWRpbmcnLCBpY29uOiAnZmlsZS10ZXh0JywgazogJ21vZCBhbHQgMScgfSwgeyBmOiAnYicsIGxhYmVsOiAnQm9sZCcsIGljb246ICdlZGl0JywgazogJ21vZCBCJyB9LCB7IGY6ICdpJywgbGFiZWw6ICdJdGFsaWMnLCBpY29uOiAncHInLCBrOiAnbW9kIEknIH0sXG4gIHsgZjogJ2NvZGUnLCBsYWJlbDogJ0lubGluZSBjb2RlJywgaWNvbjogJ3Rlcm0nLCBrOiAnbW9kIEUnIH0sIHsgZjogJ2EnLCBsYWJlbDogJ0xpbmsnLCBpY29uOiAnZXh0JywgazogJ21vZCBLJyB9LFxuICB7IGY6ICd1bCcsIGxhYmVsOiAnQnVsbGV0ZWQgbGlzdCcsIGljb246ICdtb3JlJywgazogJ21vZCBzaGlmdCA4JyB9LCB7IGY6ICdvbCcsIGxhYmVsOiAnTnVtYmVyZWQgbGlzdCcsIGljb246ICdtb3JlJywgazogJ21vZCBzaGlmdCA3JyB9LCB7IGY6ICdxdW90ZScsIGxhYmVsOiAnUXVvdGUnLCBpY29uOiAnY29tbWVudCcsIGs6ICdtb2Qgc2hpZnQgOScgfSxcbl07XG50eXBlIEpvYiA9IHsgbzogUmFuZ2UyOyB0OiBSYW5nZTI7IHNsYXNoOiBudW1iZXIgfCBudWxsOyBzZWw6IGJvb2xlYW47IGJ0bj86IGJvb2xlYW4gfTtcblxuLyoqIEEgbWluaW1hbCBlZGl0b3IgZm9yIGEgZHJhZnQgYW4gYWdlbnQgaGVscHMgd2l0aC4gU2VsZWN0IHRleHQgYW5kIHByZXNzIEFzayBBSSAob3IgTW9kK0osIG9yIHR5cGUgLyBvbiBhIG5ldyBsaW5lKSwgYW5kIGFcbiAgICBzdWdnZXN0aW9uIHN0cmVhbXMgaW4gYmVzaWRlIHRoZSB0ZXh0LCB0aGUgb2xkIHdvcmRzIHN0cnVjayB0aHJvdWdoLCB0byBhY2NlcHQgd2l0aCBUYWIvRW50ZXIgb3IgZGlzY2FyZCB3aXRoIEVzY2FwZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLXJpY2gtdGV4dC1lZGl0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBkYXRhLXZvPVwiXCJcbiAgICAgICNyb290XG4gICAgICBjbGFzcz1cInZvLXJ0ZVwiXG4gICAgICBbYXR0ci5kYXRhLXN0XT1cInJldmlldyA/ICdyZXZpZXcnIDogJ2VkaXQnXCJcbiAgICAgIChrZXlkb3duKT1cIm9uUm9vdEtleSgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJvblJvb3RQb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICN0YlxuICAgICAgICBjbGFzcz1cInZvLXJ0ZS10YlwiXG4gICAgICAgIHJvbGU9XCJ0b29sYmFyXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkZvcm1hdHRpbmdcIlxuICAgICAgICAobW91c2Vkb3duKT1cImtlZXBGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwidGJLZXkoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKHQgb2YgdG9vbHM7IHRyYWNrIHQuZjsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICBAaWYgKGkgPT09IDUpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcnRlLXNlcFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1iXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJ0LmYgPT09ICdhJyAmJiB0Lm9uICYmICFyZXZpZXdcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1mXT1cInQuZlwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQubGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidC5sYWJlbCArICcgwrcgJyArIHQua2JkXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIXJldmlld1wiXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwiZm9jdXNUYiA9PT0gaSA/IDAgOiAtMVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cInQuZiA9PT0gJ2EnID8gJ2RpYWxvZycgOiBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidC5mID09PSAnYScgPyAhIWxrIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwidC5mICE9PSAnYScgPyAoIXJldmlldyAmJiB0Lm9uKSA6IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5KHQuZiwgJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwidC5pY29uXCIgc2l6ZT1cIm1kXCI+PC92by1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BcIj48L3NwYW4+XG4gICAgICAgIEBpZiAoYWkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1haVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQXNrIEFJXCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiISFqb2JcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiJ0VkaXQgb3Igd3JpdGUgd2l0aCBBSSDCtyAnICsgYWlLYmRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhcmV2aWV3XCJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJmb2N1c1RiID09PSB0b29scy5sZW5ndGggPyAwIDogLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWlCdXR0b24oJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInNwYXJrXCI+PC92by1pY29uPjxzcGFuPkFzayBBSTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlcbiAgICAgICAgY2xhc3M9XCJ2by1ydGUtYm9keVwiXG4gICAgICAgIFtjbGFzcy52by1lbXB0eV09XCJlbXB0eSAmJiAhcmV2aWV3XCJcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG4gICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgc3BlbGxjaGVjaz1cInRydWVcIlxuICAgICAgPjwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tcnRlLWZ0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ydGUtaWRsZVwiIChtb3VzZWRvd24pPVwia2VlcEZvY3VzKCRldmVudClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXJ0ZS13YyB2by1udW1cIj57eyB3b3JkcyA9PT0gMSA/ICcxIHdvcmQnIDogd29yZHMgKyAnIHdvcmRzJyB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKGFpICE9PSBmYWxzZSAmJiBoaW50KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXJ0ZS1oaW50XCI+e3sgaGludCB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS11blwiIGFyaWEtbGFiZWw9XCJVbmRvXCIgW2F0dHIudGl0bGVdPVwiJ1VuZG8gwrcgJyArIHVuZG9LYmRcIiBbZGlzYWJsZWRdPVwiISFyZXZpZXcgfHwgIWNhblVuZG9cIiAoY2xpY2spPVwiZG9VbmRvKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwidW5kb1wiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS1yZVwiIGFyaWEtbGFiZWw9XCJSZWRvXCIgW2F0dHIudGl0bGVdPVwiJ1JlZG8gwrcgJyArIHJlZG9LYmRcIiBbZGlzYWJsZWRdPVwiISFyZXZpZXcgfHwgIWNhblJlZG9cIiAoY2xpY2spPVwiZG9SZWRvKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwicmVkb1wiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ydGUtcmV2XCIgKG1vdXNlZG93bik9XCJrZWVwRm9jdXMoJGV2ZW50KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tcnRlLXN0XCI+XG4gICAgICAgICAgICBAaWYgKHJldmlldyAmJiAhcmV2aWV3LnJlYWR5KSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdGhpbmsgdm8tb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48aT48L2k+PGk+PC9pPjxpPjwvaT48aT48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNoaW1cIj57eyByZXZpZXdMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKHJldmlldykge1xuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIj48L3ZvLWljb24+PHNwYW4+U3VnZ2VzdGlvbiByZWFkeTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tZ2hvc3Qgdm8tc20gdm8tcnRlLW5vXCIgKGNsaWNrKT1cImZpbmlzaChmYWxzZSwgJGV2ZW50LmlzVHJ1c3RlZClcIj5EaXNjYXJkPHNwYW4gY2xhc3M9XCJ2by1rYmRcIj5Fc2M8L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWFjY2VudCB2by1zbSB2by1ydGUtb2tcIiBbZGlzYWJsZWRdPVwiIXJldmlldz8ucmVhZHlcIiAoY2xpY2spPVwiZmluaXNoKHRydWUsICRldmVudC5pc1RydXN0ZWQpXCI+QWNjZXB0PHNwYW4gY2xhc3M9XCJ2by1rYmRcIj5UYWI8L3NwYW4+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoYWkgIT09IGZhbHNlKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAjYXNrRWxcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInZvLXJ0ZS1hc2tcIlxuICAgICAgICAgIFtjbGFzcy52by1zaG93XT1cImJ1YmJsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkFzayBBSSBhYm91dCB0aGUgc2VsZWN0aW9uXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25Bc2tCdXR0b24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIj48L3ZvLWljb24+PHNwYW4+QXNrIEFJPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgI21lbnVFbFxuICAgICAgICAgIGNsYXNzPVwidm8tcG9wIHZvLXJ0ZS1tZW51XCJcbiAgICAgICAgICBbY2xhc3Mudm8tb3Blbl09XCIhIWpvYlwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aWQgKyAnLXBoJ1wiXG4gICAgICAgICAgW2F0dHIuaW5lcnRdPVwiam9iID8gbnVsbCA6ICcnXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJtZW51S2V5KCRldmVudClcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXBoXCIgW2lkXT1cInVpZCArICctcGgnXCI+e3sgbWVudUhlYWRpbmcgfX08L2Rpdj5cbiAgICAgICAgICBAZm9yIChhIG9mIGl0ZW1zOyB0cmFjayBhLmtleSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1taVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWFdPVwiYS5rZXlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImEub2ZmXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWVudUl0ZW0oYSwgJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAoYS5pY29uKSB7IDx2by1pY29uIFtuYW1lXT1cImEuaWNvblwiPjwvdm8taWNvbj4gfVxuICAgICAgICAgICAgICA8c3Bhbj57eyBhLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPGRpdlxuICAgICAgICAjbG5rRWxcbiAgICAgICAgY2xhc3M9XCJ2by1wb3Agdm8tcnRlLWxua1wiXG4gICAgICAgIFtjbGFzcy52by1vcGVuXT1cIiEhbGtcIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgYXJpYS1sYWJlbD1cIkxpbmtcIlxuICAgICAgICBbYXR0ci5pbmVydF09XCJsayA/IG51bGwgOiAnJ1wiXG4gICAgICAgIChrZXlkb3duKT1cImxua0tleSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cImxua0JsdXIoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgICN1cmxFbFxuICAgICAgICAgIGNsYXNzPVwidm8tcnRlLXVybFwiXG4gICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJQYXN0ZSBvciB0eXBlIGEgbGlua1wiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIkxpbmsgYWRkcmVzc1wiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ1cmxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJiYWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAoaW5wdXQpPVwib25VcmxJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWFjY2VudCB2by1zbSB2by1ydGUtbG9rXCIgKGNsaWNrKT1cImFwcGx5TGluaygnJylcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICBAaWYgKGhhc0hyZWYgJiYgbGspIHtcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliIHZvLXJ0ZS1scm1cIiBhcmlhLWxhYmVsPVwiUmVtb3ZlIGxpbmtcIiB0aXRsZT1cIlJlbW92ZSBsaW5rXCIgKGNsaWNrKT1cImFwcGx5TGluayhudWxsKVwiPjx2by1pY29uIG5hbWU9XCJ0cmFzaFwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxwIGNsYXNzPVwidm8tcnRlLWxpdmVcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj57eyBzYXkgfX08L3A+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9yaWNoLXRleHQtZWRpdG9yLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFJpY2hUZXh0RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAvKiogVGhlIHRleHQgYXMgSFRNTDogcGFyYWdyYXBocywgb25lIGhlYWRpbmcgbGV2ZWwgKGBoMmApLCBsaXN0cywgcXVvdGVzIGFuZCBpbnNpZGUgdGhlbSBib2xkL2l0YWxpYy9jb2RlL2xpbmtzLiAqL1xuICBASW5wdXQoKSB2YWx1ZT86IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1dyaXRlIGEgZHJhZnQsIG9yIHR5cGUgLyBvbiBhIG5ldyBsaW5lIGZvciBBSSc7XG4gIEBJbnB1dCgpIGxhYmVsID0gJ0RyYWZ0JztcbiAgQElucHV0KCkgaGludDogc3RyaW5nIHwgbnVsbCA9ICdTZWxlY3QgdGV4dCB0byBhc2sgQUknO1xuICAvKiogV3JpdGVzIHRoZSBBSSdzIHN1Z2dlc3Rpb25zLiBEZWZhdWx0cyB0byB0aGUgZGVtbyB3cml0ZXI7IHBhc3MgeW91ciBtb2RlbCBjYWxsLCBvciBmYWxzZSB0byBoaWRlIHRoZSBBSSAqL1xuICBASW5wdXQoKSBhaTogUmljaFRleHRBaSB8IGZhbHNlID0gZGVtb0FpO1xuICAvKiogVGhlIEFJIG1lbnUuIERlZmF1bHRzIHRvIEltcHJvdmUgd3JpdGluZywgTWFrZSBzaG9ydGVyLCBGaXggZ3JhbW1hciBhbmQgQ29udGludWUgd3JpdGluZyAqL1xuICBASW5wdXQoKSBhaUFjdGlvbnM6IFJpY2hUZXh0QWlBY3Rpb25bXSA9IEFDVElPTlM7XG5cbiAgLyoqIENhbGxlZCB3aXRoIHRoZSBIVE1MIGFmdGVyIGVhY2ggY2hhbmdlIHRoZSBwZXJzb24gbWFrZXMgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBDYWxsZWQgd2hlbiBhIHN1Z2dlc3Rpb24gaXMgYWNjZXB0ZWQgb3IgZGlzY2FyZGVkICovXG4gIEBPdXRwdXQoKSBzdWdnZXN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxSaWNoVGV4dFN1Z2dlc3Rpb25SZXN1bHQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncm9vdCcpIHByaXZhdGUgcm9vdFJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCd0YicpIHByaXZhdGUgdGJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnYm9keScpIHByaXZhdGUgYm9keVJlZiE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdhc2tFbCcpIHByaXZhdGUgYXNrUmVmPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21lbnVFbCcpIHByaXZhdGUgbWVudVJlZj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdsbmtFbCcpIHByaXZhdGUgbG5rUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3VybEVsJykgcHJpdmF0ZSB1cmxSZWYhOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbW90aW9uID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlbmc6IFJ0ZUVuZ2luZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVtaXR0ZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHF1aWV0ID0gZmFsc2U7XG4gIHByaXZhdGUgcGlja2VkOiBSYW5nZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJ1blRva2VuOiB7IGN0bDogQWJvcnRDb250cm9sbGVyOyBhY3Rpb246IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZG93bj86IChlOiBQb2ludGVyRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVzaXplPzogKCkgPT4gdm9pZDtcblxuICByZWFkb25seSB1aWQgPSAncnRlLScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA3KTtcbiAgbWFjID0gZmFsc2U7XG4gIHRvb2xzID0gVE9PTFMubWFwKHQgPT4gKHsgLi4udCwgb246IGZhbHNlLCBrYmQ6ICcnIH0pKTtcbiAgaXRlbXMgPSB0aGlzLmFpQWN0aW9ucy5tYXAoYSA9PiAoeyAuLi5hLCBvZmY6IGZhbHNlIH0pKTtcbiAgZm9jdXNUYiA9IDA7XG4gIHdvcmRzID0gMDsgZW1wdHkgPSB0cnVlOyBjYW5VbmRvID0gZmFsc2U7IGNhblJlZG8gPSBmYWxzZTsgaGFzSHJlZiA9IGZhbHNlO1xuICBqb2I6IEpvYiB8IG51bGwgPSBudWxsO1xuICBsazogeyBvOiBSYW5nZTI7IGJ0bj86IGJvb2xlYW4gfSB8IG51bGwgPSBudWxsO1xuICB1cmwgPSAnJzsgYmFkID0gZmFsc2U7IGJ1YmJsZSA9IGZhbHNlO1xuICByZXZpZXc6IHsgYWN0aW9uOiBzdHJpbmc7IHJlYWR5OiBib29sZWFuIH0gfCBudWxsID0gbnVsbDtcbiAgc2F5ID0gJyc7XG4gIGFpS2JkID0gJyc7IHVuZG9LYmQgPSAnJzsgcmVkb0tiZCA9ICcnO1xuXG4gIHByaXZhdGUgZ2V0IGJvZHlFbCgpIHsgcmV0dXJuIHRoaXMuYm9keVJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgZ2V0IG1lbnVIZWFkaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuam9iPy5zZWwpIHJldHVybiAnRWRpdCB0aGUgc2VsZWN0aW9uJztcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5zb21lKHggPT4gIXgub2ZmICYmICh4LmtpbmQgfHwgJ3N3YXAnKSA9PT0gJ3N3YXAnKSA/ICdFZGl0IHRoaXMgcGFyYWdyYXBoJyA6ICdXcml0ZSB3aXRoIEFJJztcbiAgfVxuICBnZXQgcmV2aWV3TGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuYWlBY3Rpb25zLmZpbmQoYSA9PiBhLmtleSA9PT0gdGhpcy5yZXZpZXc/LmFjdGlvbik/LmxhYmVsIHx8ICcnOyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydhaUFjdGlvbnMnXSkgdGhpcy5pdGVtcyA9IHRoaXMuYWlBY3Rpb25zLm1hcChhID0+ICh7IC4uLmEsIG9mZjogZmFsc2UgfSkpO1xuICAgIGlmIChjaGFuZ2VzWyd2YWx1ZSddICYmIHRoaXMuZW5nICYmIHRoaXMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLmVtaXR0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmVuZy5yZXZpZXdpbmcoKSkgeyB0aGlzLnJ1blRva2VuPy5jdGwuYWJvcnQoKTsgdGhpcy5ydW5Ub2tlbiA9IG51bGw7IHRoaXMucmV2aWV3ID0gbnVsbDsgfVxuICAgICAgdGhpcy5sb2FkKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hYyA9IGlzTWFjKCk7XG4gICAgdGhpcy5haUtiZCA9IGtleXNPZignbW9kIEonLCB0aGlzLm1hYyk7IHRoaXMudW5kb0tiZCA9IGtleXNPZignbW9kIFonLCB0aGlzLm1hYyk7IHRoaXMucmVkb0tiZCA9IGtleXNPZigncmVkbycsIHRoaXMubWFjKTtcbiAgICB0aGlzLnRvb2xzID0gVE9PTFMubWFwKHQgPT4gKHsgLi4udCwgb246IGZhbHNlLCBrYmQ6IGtleXNPZih0LmssIHRoaXMubWFjKSB9KSk7XG4gICAgY29uc3QgRSA9IG5ldyBSdGVFbmdpbmUodGhpcy5ib2R5RWwsIHtcbiAgICAgIGNoYW5nZTogKCkgPT4gdGhpcy5wYWludCgpLFxuICAgICAgc2VsZWN0OiAoKSA9PiB7IHRoaXMucGFpbnQoKTsgdGhpcy5zaG93QnViYmxlKCk7IH0sXG4gICAgICBpbnB1dDogZSA9PiB7IGlmIChlLmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnICYmIGUuZGF0YSA9PT0gJy8nKSB7IGNvbnN0IG8gPSBFLmdldCgpOyBpZiAoby5zID09PSBvLmUgJiYgRS5saW5lKG8ucykucyA9PT0gby5zIC0gMSkgdGhpcy5vcGVuTWVudSgnc2xhc2gnKTsgfSB9LFxuICAgICAga2V5OiBlID0+IHRoaXMuZW5naW5lS2V5KGUpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5nID0gRTtcbiAgICB0aGlzLmxvYWQodGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgICB0aGlzLmRvd24gPSAoZTogUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICAgIGlmICh0aGlzLmpvYiAmJiAhdGhpcy5tZW51UmVmPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpICYmICF0aGlzLmFza1JlZj8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSAmJiAhKHQgYXMgRWxlbWVudCkuY2xvc2VzdD8uKCcudm8tcnRlLWFpJykpIHRoaXMuY2xvc2VNZW51KGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmxrICYmICF0aGlzLmxua1JlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpICYmICEodCBhcyBFbGVtZW50KS5jbG9zZXN0Py4oJ1tkYXRhLWY9XCJhXCJdJykpIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTtcbiAgICAgIGlmIChlLmlzVHJ1c3RlZCAmJiAhdGhpcy5hc2tSZWY/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgJiYgIXRoaXMuam9iKSB7IHRoaXMuYnViYmxlID0gZmFsc2U7IGlmICghdGhpcy5yb290UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkpIHRoaXMucGljayhudWxsKTsgfVxuICAgIH07XG4gICAgdGhpcy5yZXNpemUgPSAoKSA9PiB7IHRoaXMuY2xvc2VNZW51KGZhbHNlKTsgdGhpcy5jbG9zZUxpbmsoZmFsc2UpOyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyB9O1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5kb3duKTsgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemUpO1xuICAgIHRoaXMucGFpbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucnVuVG9rZW4/LmN0bC5hYm9ydCgpOyB0aGlzLnJ1blRva2VuID0gbnVsbDsgdGhpcy5waWNrKG51bGwpOyB0aGlzLmVuZz8uZGVzdHJveSgpOyB0aGlzLmVuZyA9IG51bGw7XG4gICAgaWYgKHRoaXMuZG93bikgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLmRvd24pO1xuICAgIGlmICh0aGlzLnJlc2l6ZSkgcmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWR1Y2UoKSB7IHJldHVybiB0aGlzLm1vdGlvbi5yZWR1Y2UoKTsgfVxuICBwcml2YXRlIGFubm91bmNlKHQ6IHN0cmluZykgeyB0aGlzLnNheSA9ICcnOyBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5zYXkgPSB0OyB9LCA2MCk7IH1cblxuICBwcml2YXRlIHBhaW50KCkge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47XG4gICAgY29uc3QgcyA9IEUuc3RhdGUoKTtcbiAgICB0aGlzLnRvb2xzID0gdGhpcy50b29scy5tYXAodCA9PiAoeyAuLi50LCBvbjogdC5mID09PSAnYScgPyBzLkEgOiAvXihoMnx1bHxvbHxxdW90ZSkkLy50ZXN0KHQuZikgPyBzLmJsb2NrID09PSB0LmYgOiAhIShzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pW3QuZi50b1VwcGVyQ2FzZSgpXSB9KSk7XG4gICAgdGhpcy5oYXNIcmVmID0gISFzLmhyZWY7XG4gICAgdGhpcy53b3JkcyA9IEUud29yZHMoKTsgdGhpcy5lbXB0eSA9IEUuZW1wdHkoKTsgdGhpcy5jYW5VbmRvID0gRS5jYW5VbmRvKCk7IHRoaXMuY2FuUmVkbyA9IEUuY2FuUmVkbygpO1xuICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLm1hcChhID0+ICh7IC4uLmEsIG9mZjogKGEua2luZCB8fCAnc3dhcCcpID09PSAnc3dhcCcgJiYgISF0aGlzLmpvYiAmJiAhKEUudGV4dCh0aGlzLmpvYi50KS50cmltKCkpIH0pKTtcbiAgICBpZiAoIUUucmV2aWV3aW5nKCkgJiYgIXRoaXMucXVpZXQpIHsgY29uc3QgaHRtbCA9IEUuaHRtbCgpOyBpZiAoaHRtbCAhPT0gdGhpcy5lbWl0dGVkKSB7IHRoaXMuZW1pdHRlZCA9IGh0bWw7IHRoaXMudmFsdWVDaGFuZ2UuZW1pdChodG1sKTsgfSB9XG4gIH1cblxuICBwcml2YXRlIGxvYWQoaHRtbDogc3RyaW5nKSB7IGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47IHRoaXMucXVpZXQgPSB0cnVlOyBFLmxvYWQoaHRtbCk7IHRoaXMucXVpZXQgPSBmYWxzZTsgdGhpcy5lbWl0dGVkID0gRS5odG1sKCk7IHRoaXMucGFpbnQoKTsgfVxuXG4gIC8vIC0tLS0gcGxhY2VtZW50IG9mIHRoZSBwb3BvdmVycyBpbnNpZGUgdGhlIGVkaXRvciAtLS0tXG4gIHByaXZhdGUgcmVjdHNPZihvOiBSYW5nZTIpOiBbRE9NUmVjdCwgRE9NUmVjdF0ge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZyEsIHJzID0gWy4uLkUucmFuZ2UobykuZ2V0Q2xpZW50UmVjdHMoKV0uZmlsdGVyKHggPT4geC53aWR0aCB8fCB4LmhlaWdodCk7XG4gICAgaWYgKHJzLmxlbmd0aCkgcmV0dXJuIFtyc1swXSwgcnNbcnMubGVuZ3RoIC0gMV1dO1xuICAgIGNvbnN0IG4gPSBFLnJhbmdlKEUubGluZShvLnMpKS5zdGFydENvbnRhaW5lciwgZWwgPSAobi5ub2RlVHlwZSA9PT0gMyA/IG4ucGFyZW50RWxlbWVudCA6IG4pIGFzIEVsZW1lbnQsIHJyID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtyciwgcnJdO1xuICB9XG4gIHByaXZhdGUgcGxhY2UoZWw6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLCBvOiBSYW5nZTIsIGFib3ZlID0gZmFsc2UpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLnJvb3RSZWY/Lm5hdGl2ZUVsZW1lbnQ7IGlmICghZWwgfHwgIWJveCkgcmV0dXJuO1xuICAgIGNvbnN0IGIgPSBib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHcgPSBlbC5vZmZzZXRXaWR0aCwgaCA9IGVsLm9mZnNldEhlaWdodCwgdG9wID0gKHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgNDQpIC0gMiwgW2YsIGxdID0gdGhpcy5yZWN0c09mKG8pO1xuICAgIGNvbnN0IG92ZXIgPSBmLnRvcCAtIGIudG9wIC0gaCAtIDYsIHVuZGVyID0gbC5ib3R0b20gLSBiLnRvcCArIDY7XG4gICAgY29uc3QgeSA9IGFib3ZlID8gKG92ZXIgPj0gdG9wID8gb3ZlciA6IHVuZGVyKSA6IHVuZGVyICsgaCA8PSBiLmhlaWdodCAtIDQgfHwgb3ZlciA8IHRvcCA/IHVuZGVyIDogb3ZlcjtcbiAgICBlbC5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZChNYXRoLm1heCg2LCBNYXRoLm1pbigoYWJvdmUgPyBmIDogbCkubGVmdCAtIGIubGVmdCAtIChhYm92ZSA/IDAgOiA4KSwgYi53aWR0aCAtIHcgLSA2KSkpICsgJ3B4JztcbiAgICBlbC5zdHlsZS50b3AgPSBNYXRoLnJvdW5kKE1hdGgubWF4KDQsIE1hdGgubWluKHksIGIuaGVpZ2h0IC0gaCAtIDQpKSkgKyAncHgnO1xuICB9XG4gIHByaXZhdGUgcGljayhvOiBSYW5nZTIgfCBudWxsKSB7XG4gICAgY29uc3QgcmVnID0gdHlwZW9mIENTUyAhPT0gJ3VuZGVmaW5lZCcgPyAoQ1NTIGFzIHVua25vd24gYXMgeyBoaWdobGlnaHRzPzogTWFwPHN0cmluZywgU2V0PFJhbmdlPj4gfSkuaGlnaGxpZ2h0cyA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBITCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgSGlnaGxpZ2h0PzogbmV3ICgpID0+IFNldDxSYW5nZT4gfSkuSGlnaGxpZ2h0IDogdW5kZWZpbmVkO1xuICAgIGlmICghcmVnIHx8ICFITCkgcmV0dXJuO1xuICAgIGxldCBoID0gcmVnLmdldCgncnRlLXBpY2snKTsgaWYgKCFoKSB7IGggPSBuZXcgSEwoKTsgcmVnLnNldCgncnRlLXBpY2snLCBoKTsgfVxuICAgIGlmICh0aGlzLnBpY2tlZCkgaC5kZWxldGUodGhpcy5waWNrZWQpO1xuICAgIHRoaXMucGlja2VkID0gbyAmJiBvLnMgIT09IG8uZSAmJiB0aGlzLmVuZyA/IHRoaXMuZW5nLnJhbmdlKG8pIDogbnVsbDtcbiAgICBpZiAodGhpcy5waWNrZWQpIGguYWRkKHRoaXMucGlja2VkKTtcbiAgfVxuICBwcml2YXRlIHNob3dCdWJibGUobz86IFJhbmdlMikge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFKSByZXR1cm47XG4gICAgY29uc3QgZyA9IGdldFNlbGVjdGlvbigpLCBzZWwgPSBvIHx8IChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmJvZHlFbCAmJiBnICYmIGcucmFuZ2VDb3VudCAmJiAhZy5pc0NvbGxhcHNlZCA/IEUuZ2V0KCkgOiBudWxsKTtcbiAgICBpZiAoIXNlbCB8fCBFLnJldmlld2luZygpIHx8IHRoaXMuam9iIHx8IHRoaXMubGsgfHwgdGhpcy5haSA9PT0gZmFsc2UgfHwgIUUudGV4dChzZWwpLnRyaW0oKSkgeyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyByZXR1cm47IH1cbiAgICB0aGlzLnBsYWNlKHRoaXMuYXNrUmVmPy5uYXRpdmVFbGVtZW50LCBzZWwsIHRydWUpOyB0aGlzLmJ1YmJsZSA9IHRydWU7XG4gIH1cblxuICAvLyAtLS0tIHRvb2xiYXIgLS0tLVxuICBrZWVwRm9jdXMoZTogTW91c2VFdmVudCkgeyBpZiAoKGUudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoJ2J1dHRvbicpKSBlLnByZXZlbnREZWZhdWx0KCk7IH1cbiAgcHJpdmF0ZSB0YkJ1dHRvbnMoKSB7IHJldHVybiBbLi4uKHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uOm5vdCg6ZGlzYWJsZWQpJykpXTsgfVxuICB0YktleShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgYWxsID0gdGhpcy50YkJ1dHRvbnMoKSwgaSA9IGFsbC5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpOyBpZiAoaSA8IDApIHJldHVybjtcbiAgICBjb25zdCBnbyA9ICh7IEFycm93UmlnaHQ6IGFsbFsoaSArIDEpICUgYWxsLmxlbmd0aF0sIEFycm93TGVmdDogYWxsWyhpIC0gMSArIGFsbC5sZW5ndGgpICUgYWxsLmxlbmd0aF0sIEhvbWU6IGFsbFswXSwgRW5kOiBhbGxbYWxsLmxlbmd0aCAtIDFdIH0gYXMgUmVjb3JkPHN0cmluZywgSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ+KVtlLmtleV07XG4gICAgaWYgKGdvKSB7IGUucHJldmVudERlZmF1bHQoKTsgZ28uZm9jdXMoKTsgdGhpcy5mb2N1c1RiID0gdGhpcy50YkJ1dHRvbkluZGV4KGdvKTsgfVxuICB9XG4gIHByaXZhdGUgdGJCdXR0b25JbmRleChiOiBIVE1MQnV0dG9uRWxlbWVudCkgeyByZXR1cm4gWy4uLnRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKV0uaW5kZXhPZihiKTsgfVxuICBhcHBseShmOiBSaWNoVGV4dEZvcm1hdCB8ICdhJywgZTogTW91c2VFdmVudCkge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZzsgaWYgKCFFIHx8IEUucmV2aWV3aW5nKCkpIHJldHVybjtcbiAgICBjb25zdCBtaW5lID0gZS5pc1RydXN0ZWQsIGtleSA9IGUuZGV0YWlsID09PSAwO1xuICAgIGlmIChmID09PSAnYScpIHsgaWYgKHRoaXMubGspIHRoaXMuY2xvc2VMaW5rKHRydWUpOyBlbHNlIHRoaXMub3BlbkxpbmsobWluZSwgbWluZSAmJiBrZXkpOyByZXR1cm47IH1cbiAgICBpZiAoZiA9PT0gJ2InIHx8IGYgPT09ICdpJyB8fCBmID09PSAnY29kZScpIEUuaW5saW5lKGYudG9VcHBlckNhc2UoKSk7IGVsc2UgRS5ibG9jayhmKTtcbiAgICBpZiAobWluZSkgRS5mb2N1cygpO1xuICB9XG4gIGRvVW5kbyhlOiBNb3VzZUV2ZW50KSB7IHRoaXMuZW5nPy51bmRvKCk7IGlmIChlLmlzVHJ1c3RlZCkgdGhpcy5lbmc/LmZvY3VzKCk7IH1cbiAgZG9SZWRvKGU6IE1vdXNlRXZlbnQpIHsgdGhpcy5lbmc/LnJlZG8oKTsgaWYgKGUuaXNUcnVzdGVkKSB0aGlzLmVuZz8uZm9jdXMoKTsgfVxuICBvbkFpQnV0dG9uKGU6IE1vdXNlRXZlbnQpIHsgdGhpcy5vcGVuTWVudShlLmlzVHJ1c3RlZCA/IChlLmRldGFpbCA/ICdjbGljaycgOiAnYnV0dG9uJykgOiAnc2NyaXB0Jyk7IH1cbiAgb25Bc2tCdXR0b24oZTogTW91c2VFdmVudCkgeyB0aGlzLm9wZW5NZW51KGUuaXNUcnVzdGVkID8gJ2NsaWNrJyA6ICdzY3JpcHQnKTsgfVxuXG4gIC8vIC0tLS0gdGhlIEFJIG1lbnUgLS0tLVxuICBwcml2YXRlIG1lbnVJdGVtRWxzKCkgeyByZXR1cm4gWy4uLih0aGlzLm1lbnVSZWY/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ1tyb2xlPVwibWVudWl0ZW1cIl0nKSB8fCBbXSldLmZpbHRlcihtID0+IG0uZ2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgIT09ICd0cnVlJyk7IH1cbiAgcHJpdmF0ZSBmb2N1c0l0ZW0obT86IEhUTUxCdXR0b25FbGVtZW50KSB7IGlmICghbSkgcmV0dXJuOyB0aGlzLm1lbnVJdGVtRWxzKCkuZm9yRWFjaCh4ID0+IHsgeC50YWJJbmRleCA9IHggPT09IG0gPyAwIDogLTE7IH0pOyBtLmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICBvcGVuTWVudShob3c6ICdrZXknIHwgJ2J1dHRvbicgfCAnY2xpY2snIHwgJ3NsYXNoJyB8ICdzY3JpcHQnKSB7XG4gICAgY29uc3QgRSA9IHRoaXMuZW5nOyBpZiAoIUUgfHwgRS5yZXZpZXdpbmcoKSB8fCB0aGlzLmFpID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTsgRS5mbHVzaCgpO1xuICAgIGlmICh0aGlzLmpvYikgeyB0aGlzLmNsb3NlTWVudShob3cgIT09ICdzY3JpcHQnKTsgcmV0dXJuOyB9XG4gICAgY29uc3QgbyA9IEUuZ2V0KCksIHNsYXNoID0gaG93ID09PSAnc2xhc2gnID8gby5zIC0gMSA6IG51bGwsIHNlbCA9IG8ucyAhPT0gby5lO1xuICAgIGxldCB0ID0gc2VsID8gbyA6IEUubGluZShvLnMpOyBpZiAoc2xhc2ggIT09IG51bGwpIHQgPSB7IHM6IHNsYXNoICsgMSwgZTogdC5lIH07XG4gICAgdGhpcy5qb2IgPSB7IG8sIHQsIHNsYXNoLCBzZWwsIGJ0bjogaG93ID09PSAnYnV0dG9uJyB9O1xuICAgIHRoaXMuYnViYmxlID0gZmFsc2U7IHRoaXMucGljayhzZWwgPyBvIDogbnVsbCk7IHRoaXMucGFpbnQoKTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyB0aGlzLnBsYWNlKHRoaXMubWVudVJlZj8ubmF0aXZlRWxlbWVudCwgbyk7IGlmIChob3cgIT09ICdzY3JpcHQnKSB0aGlzLmZvY3VzSXRlbSh0aGlzLm1lbnVJdGVtRWxzKClbMF0pOyB9KTtcbiAgfVxuICBjbG9zZU1lbnUoYmFjazogYm9vbGVhbikge1xuICAgIGNvbnN0IGogPSB0aGlzLmpvYjsgaWYgKCFqKSByZXR1cm47XG4gICAgdGhpcy5qb2IgPSBudWxsOyB0aGlzLnBpY2sobnVsbCk7IHRoaXMucGFpbnQoKTtcbiAgICBpZiAoYmFjayAmJiBqLmJ0bikgeyB0aGlzLmVuZz8uc2V0KGoubyk7IHRoaXMucm9vdFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcudm8tcnRlLWFpJyk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgaWYgKGJhY2spIHRoaXMuZW5nPy5zZXQoai5vLCB0cnVlKTtcbiAgfVxuICBtZW51S2V5KGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm1lbnVJdGVtRWxzKCksIGkgPSBhbGwuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxCdXR0b25FbGVtZW50KTtcbiAgICBjb25zdCBnbyA9ICh7IEFycm93RG93bjogYWxsWyhpICsgMSkgJSBhbGwubGVuZ3RoXSwgQXJyb3dVcDogYWxsWyhpIC0gMSArIGFsbC5sZW5ndGgpICUgYWxsLmxlbmd0aF0sIEhvbWU6IGFsbFswXSwgRW5kOiBhbGxbYWxsLmxlbmd0aCAtIDFdIH0gYXMgUmVjb3JkPHN0cmluZywgSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ+KVtlLmtleV07XG4gICAgaWYgKGdvKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5mb2N1c0l0ZW0oZ28pOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8IGUua2V5ID09PSAnVGFiJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VNZW51KHRydWUpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkubGVuZ3RoID09PSAxICYmIC9cXFMvLnRlc3QoZS5rZXkpICYmICFlLm1ldGFLZXkgJiYgIWUuY3RybEtleSkgeyBjb25zdCBrID0gZS5rZXkudG9Mb3dlckNhc2UoKSwgaGl0ID0gWy4uLmFsbC5zbGljZShpICsgMSksIC4uLmFsbC5zbGljZSgwLCBpICsgMSldLmZpbmQobSA9PiAobS50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChrKSk7IGlmIChoaXQpIHRoaXMuZm9jdXNJdGVtKGhpdCk7IH1cbiAgfVxuICBvbk1lbnVJdGVtKGE6IHsga2V5OiBzdHJpbmc7IG9mZjogYm9vbGVhbiB9LCBlOiBNb3VzZUV2ZW50KSB7IGlmICghYS5vZmYpIHRoaXMuYXNrKGEua2V5LCBlLmlzVHJ1c3RlZCk7IH1cblxuICBwcml2YXRlIGhlcmUoRTogUnRlRW5naW5lKTogSm9iIHsgY29uc3QgbyA9IEUuZ2V0KCksIHNlbCA9IG8ucyAhPT0gby5lOyByZXR1cm4geyBvLCB0OiBzZWwgPyBvIDogRS5saW5lKG8ucyksIHNsYXNoOiBudWxsLCBzZWwgfTsgfVxuICBhc2soa2V5OiBzdHJpbmcsIG1pbmU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIGogPSB0aGlzLmpvYiB8fCAoRSAmJiB0aGlzLmhlcmUoRSkpO1xuICAgIGNvbnN0IGFjdCA9IHRoaXMuYWlBY3Rpb25zLmZpbmQoYSA9PiBhLmtleSA9PT0ga2V5KSwgd3JpdGVyID0gdGhpcy5haTtcbiAgICBpZiAoIUUgfHwgIWogfHwgIWFjdCB8fCB3cml0ZXIgPT09IGZhbHNlIHx8IEUucmV2aWV3aW5nKCkpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlTWVudShmYWxzZSk7XG4gICAgbGV0IHQgPSBqLnQsIGVuZCA9IGouby5lO1xuICAgIGlmIChqLnNsYXNoICE9PSBudWxsKSB7IGNvbnN0IHNsID0gai5zbGFzaDsgRS5yZW1vdmUoeyBzOiBzbCwgZTogc2wgKyAxIH0pOyBjb25zdCBiYWNrID0gKHg6IG51bWJlcikgPT4geCA+IHNsID8geCAtIDEgOiB4OyB0ID0geyBzOiBiYWNrKHQucyksIGU6IGJhY2sodC5lKSB9OyBlbmQgPSBiYWNrKGVuZCk7IH1cbiAgICBjb25zdCBraW5kID0gYWN0LmtpbmQgfHwgJ3N3YXAnO1xuICAgIGlmIChraW5kID09PSAnYWRkJykgdCA9IHsgczogZW5kLCBlOiBlbmQgfTtcbiAgICBlbHNlIGlmICghRS50ZXh0KHQpLnRyaW0oKSkgcmV0dXJuO1xuICAgIGNvbnN0IGRvYyA9IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KSwgYmVmb3JlID0gRS50ZXh0KHsgczogMCwgZTogdC5zIH0pLCBhZnRlciA9IEUudGV4dCh7IHM6IHQuZSwgZTogRS50b3RhbCgpIH0pLCBzYWlkID0gRS50ZXh0KHQpO1xuICAgIGNvbnN0IHdyaXRlID0gRS5zdWdnZXN0KHQsIGtpbmQpLCBjdGwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCksIG1lID0geyBjdGwsIGFjdGlvbjoga2V5IH07XG4gICAgdGhpcy5ydW5Ub2tlbiA9IG1lOyBsZXQgZ290ID0gJycsIGZpcnN0ID0gdHJ1ZTtcbiAgICBjb25zdCBwdXQgPSAoczogc3RyaW5nKSA9PiB7IGlmIChmaXJzdCAmJiBraW5kID09PSAnYWRkJyAmJiBiZWZvcmUgJiYgIS9cXHMkLy50ZXN0KGJlZm9yZSkgJiYgIS9eXFxzLy50ZXN0KHMpKSBzID0gJyAnICsgczsgZmlyc3QgPSBmYWxzZTsgZ290ICs9IHM7IHdyaXRlKHMpOyB9O1xuICAgIHRoaXMucmV2aWV3ID0geyBhY3Rpb246IGtleSwgcmVhZHk6IGZhbHNlIH07IHRoaXMuYnViYmxlID0gZmFsc2U7IHRoaXMucGFpbnQoKTtcbiAgICB0aGlzLmFubm91bmNlKGAke2FjdC5sYWJlbH06IHdyaXRpbmcgYSBzdWdnZXN0aW9uYCk7XG4gICAgaWYgKG1pbmUpIEUuZm9jdXMoKTtcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gd3JpdGVyKHsgYWN0aW9uOiBrZXksIHRleHQ6IGtpbmQgPT09ICdhZGQnID8gJycgOiBzYWlkLCBiZWZvcmUsIGFmdGVyLCBkb2N1bWVudDogZG9jLCBzaWduYWw6IGN0bC5zaWduYWwgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAnc3RyaW5nJyB8fCByZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgY29uc3QgcyA9IGF3YWl0IHJlczsgaWYgKHRoaXMucnVuVG9rZW4gIT09IG1lKSByZXR1cm47XG4gICAgICAgICAgaWYgKHRoaXMucmVkdWNlKCkpIHB1dChzKTtcbiAgICAgICAgICBlbHNlIGZvciAoY29uc3QgdyBvZiBzLm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpIHx8IFtdKSB7IGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuOyBwdXQodyk7IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA0OCkpOyB9XG4gICAgICAgIH0gZWxzZSBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHJlcykgeyBpZiAodGhpcy5ydW5Ub2tlbiAhPT0gbWUpIHJldHVybjsgcHV0KGNodW5rKTsgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7IGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuOyBjb25zb2xlLmVycm9yKGVycik7IH1cbiAgICAgIGlmICh0aGlzLnJ1blRva2VuICE9PSBtZSkgcmV0dXJuO1xuICAgICAgaWYgKCFnb3QudHJpbSgpKSB7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgcmV0dXJuOyB9XG4gICAgICB0aGlzLnJldmlldyA9IHsgYWN0aW9uOiBrZXksIHJlYWR5OiB0cnVlIH07IHRoaXMucGFpbnQoKTtcbiAgICAgIGNvbnN0IHMgPSBnb3QudHJpbSgpOyB0aGlzLmFubm91bmNlKGBTdWdnZXN0aW9uOiAke3N9JHsvWy4hP10kLy50ZXN0KHMpID8gJycgOiAnLid9IFByZXNzIFRhYiBvciBFbnRlciB0byBhY2NlcHQsIG9yIEVzY2FwZSB0byBkaXNjYXJkLmApO1xuICAgIH0pKCk7XG4gIH1cbiAgZmluaXNoKGtlZXA6IGJvb2xlYW4sIG1pbmU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIHIgPSB0aGlzLnJ1blRva2VuOyBpZiAoIUUgfHwgIUUucmV2aWV3aW5nKCkgfHwgIXIpIHJldHVybjtcbiAgICBpZiAoa2VlcCAmJiAhdGhpcy5yZXZpZXc/LnJlYWR5KSByZXR1cm47XG4gICAgY29uc3Qgc2FpZCA9IEUubmV3VGV4dCgpO1xuICAgIHRoaXMucnVuVG9rZW4gPSBudWxsOyByLmN0bC5hYm9ydCgpO1xuICAgIGlmIChrZWVwKSBFLmFjY2VwdCgpOyBlbHNlIEUuZGlzY2FyZCgpO1xuICAgIHRoaXMucmV2aWV3ID0gbnVsbDsgdGhpcy5wYWludCgpOyB0aGlzLmFubm91bmNlKGtlZXAgPyAnU3VnZ2VzdGlvbiBhY2NlcHRlZCcgOiAnU3VnZ2VzdGlvbiBkaXNjYXJkZWQnKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb24uZW1pdCh7IGFjdGlvbjogci5hY3Rpb24sIHRleHQ6IHNhaWQsIGFjY2VwdGVkOiBrZWVwIH0pO1xuICAgIGlmIChtaW5lKSBFLmZvY3VzKCk7XG4gIH1cblxuICAvLyAtLS0tIHRoZSBsaW5rIGZpZWxkIC0tLS1cbiAgb3BlbkxpbmsobWluZTogYm9vbGVhbiwgYnRuID0gZmFsc2UpIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmc7IGlmICghRSB8fCBFLnJldmlld2luZygpKSByZXR1cm47XG4gICAgdGhpcy5jbG9zZU1lbnUoZmFsc2UpOyBFLmZsdXNoKCk7XG4gICAgY29uc3QgbyA9IEUuZ2V0KCksIHMgPSBFLnN0YXRlKCk7XG4gICAgdGhpcy5sayA9IHsgbywgYnRuIH07IHRoaXMudXJsID0gcy5ocmVmIHx8ICcnOyB0aGlzLmJhZCA9IGZhbHNlOyB0aGlzLmJ1YmJsZSA9IGZhbHNlOyB0aGlzLmhhc0hyZWYgPSAhIXMuaHJlZjsgdGhpcy5waWNrKG8pO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7IHRoaXMucGxhY2UodGhpcy5sbmtSZWYubmF0aXZlRWxlbWVudCwgbyk7IGlmIChtaW5lKSB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfSk7XG4gIH1cbiAgY2xvc2VMaW5rKGJhY2s6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBqID0gdGhpcy5sazsgaWYgKCFqKSByZXR1cm47XG4gICAgdGhpcy5sayA9IG51bGw7IHRoaXMucGljayhudWxsKTtcbiAgICBpZiAoYmFjayAmJiBqLmJ0bikgeyB0aGlzLmVuZz8uc2V0KGoubyk7IHRoaXMudGJSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZj1cImFcIl0nKT8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyB9XG4gICAgZWxzZSBpZiAoYmFjaykgdGhpcy5lbmc/LnNldChqLm8sIHRydWUpO1xuICB9XG4gIHByaXZhdGUgdG9Vcmwodjogc3RyaW5nKSB7IHYgPSB2LnRyaW0oKTsgaWYgKCF2KSByZXR1cm4gbnVsbDsgaWYgKC9eKGh0dHBzPzpcXC9cXC98bWFpbHRvOikvaS50ZXN0KHYpKSByZXR1cm4gdjsgaWYgKC9eW15cXHNAL10rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHYpKSByZXR1cm4gJ21haWx0bzonICsgdjsgaWYgKC9eW1xcdy1dKyhcXC5bXFx3LV0rKSsoOlxcZCspPyhbLz8jXVxcUyopPyQvLnRlc3QodikpIHJldHVybiAnaHR0cHM6Ly8nICsgdjsgcmV0dXJuIG51bGw7IH1cbiAgYXBwbHlMaW5rKGhyZWY6IHN0cmluZyB8IG51bGwpIHtcbiAgICBjb25zdCBFID0gdGhpcy5lbmcsIGogPSB0aGlzLmxrOyBpZiAoIUUgfHwgIWopIHJldHVybjtcbiAgICBpZiAoaHJlZiA9PT0gJycpIHsgY29uc3QgaCA9IHRoaXMudG9VcmwodGhpcy51cmwpOyBpZiAoIWgpIHsgdGhpcy5iYWQgPSB0cnVlOyB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgcmV0dXJuOyB9IGhyZWYgPSBoOyB9XG4gICAgdGhpcy5jbG9zZUxpbmsoZmFsc2UpOyBFLnNldChqLm8pOyBFLmxpbmsoai5vLCBocmVmKTsgRS5mb2N1cygpO1xuICB9XG4gIG9uVXJsSW5wdXQoZTogRXZlbnQpIHsgdGhpcy51cmwgPSAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7IHRoaXMuYmFkID0gZmFsc2U7IH1cbiAgbG5rS2V5KGU6IEtleWJvYXJkRXZlbnQpIHsgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIGUudGFyZ2V0ID09PSB0aGlzLnVybFJlZi5uYXRpdmVFbGVtZW50KSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5hcHBseUxpbmsoJycpOyB9IGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VMaW5rKHRydWUpOyB9IH1cbiAgbG5rQmx1cihlOiBGb2N1c0V2ZW50KSB7IGlmICh0aGlzLmxrICYmIGUucmVsYXRlZFRhcmdldCAmJiAhdGhpcy5sbmtSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQgYXMgTm9kZSkpIHRoaXMuY2xvc2VMaW5rKGZhbHNlKTsgfVxuXG4gIC8vIC0tLS0gcm9vdC1sZXZlbCBrZXlzIC0tLS1cbiAgcHJpdmF0ZSBlbmdpbmVLZXkoZTogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IEUgPSB0aGlzLmVuZyE7XG4gICAgaWYgKEUucmV2aWV3aW5nKCkpIHtcbiAgICAgIGlmICgoZS5rZXkgPT09ICdUYWInIHx8IGUua2V5ID09PSAnRW50ZXInKSAmJiAhZS5zaGlmdEtleSAmJiAhZS5hbHRLZXkgJiYgIWUubWV0YUtleSAmJiAhZS5jdHJsS2V5KSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5maW5pc2godHJ1ZSwgdHJ1ZSk7IHJldHVybiB0cnVlOyB9XG4gICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnIHx8ICgoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3onKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbW9kID0gaXNNYWMoKSA/IGUubWV0YUtleSAmJiAhZS5jdHJsS2V5IDogZS5jdHJsS2V5ICYmICFlLm1ldGFLZXksIGsgPSBlLmtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChtb2QgJiYgIWUuYWx0S2V5ICYmICFlLnNoaWZ0S2V5ICYmIChrID09PSAnaycgfHwgKGsgPT09ICdqJyAmJiB0aGlzLmFpICE9PSBmYWxzZSkpKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaWYgKGsgPT09ICdrJykgdGhpcy5vcGVuTGluayh0cnVlKTsgZWxzZSB0aGlzLm9wZW5NZW51KCdrZXknKTsgcmV0dXJuIHRydWU7IH1cbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7IHRoaXMuYnViYmxlID0gZmFsc2U7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBvblJvb3RLZXkoZTogS2V5Ym9hcmRFdmVudCkgeyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMucmV2aWV3ICYmICF0aGlzLmJvZHlFbC5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmluaXNoKGZhbHNlLCB0cnVlKTsgfSB9XG4gIG9uUm9vdFBvaW50ZXJEb3duKGU6IFBvaW50ZXJFdmVudCkgeyBpZiAoZS5pc1RydXN0ZWQgJiYgIXRoaXMuam9iKSB0aGlzLnBpY2sobnVsbCk7IH1cblxuICAvLyAtLS0tIGltcGVyYXRpdmUgaGFuZGxlLCBmb3Igc2NyaXB0ZWQgZGVtb3MgLS0tLVxuICBmb2N1cygpIHsgdGhpcy5lbmc/LmZvY3VzKCk7IH1cbiAgZ2V0SFRNTCgpIHsgcmV0dXJuIHRoaXMuZW5nPy5odG1sKCkgfHwgJyc7IH1cbiAgZ2V0VGV4dCgpIHsgY29uc3QgRSA9IHRoaXMuZW5nOyByZXR1cm4gRSA/IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KSA6ICcnOyB9XG4gIHNldEhUTUwoaHRtbDogc3RyaW5nKSB7IHRoaXMubG9hZChodG1sKTsgfVxuICBzZWxlY3Qoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgRSA9IHRoaXMuZW5nOyBpZiAoIUUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhdCA9IEUudGV4dCh7IHM6IDAsIGU6IEUudG90YWwoKSB9KS5pbmRleE9mKHMpOyBpZiAoYXQgPCAwIHx8ICFzKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbyA9IHsgczogYXQsIGU6IGF0ICsgcy5sZW5ndGggfTsgRS5zZXQobyk7IEUuc2hvdyhvKTsgdGhpcy5waWNrKG8pOyB0aGlzLnNob3dCdWJibGUobyk7IHRoaXMucGFpbnQoKTsgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHlwZVRleHQoczogc3RyaW5nKSB7IHRoaXMuZW5nPy50eXBlKHMpOyB9XG4gIG5ld0xpbmUoKSB7IHRoaXMuZW5nPy5zcGxpdCgpOyB9XG4gIGZvcm1hdChmOiBSaWNoVGV4dEZvcm1hdCkgeyBjb25zdCBFID0gdGhpcy5lbmc7IGlmICghRSB8fCBFLnJldmlld2luZygpKSByZXR1cm47IGlmIChmID09PSAnYicgfHwgZiA9PT0gJ2knIHx8IGYgPT09ICdjb2RlJykgRS5pbmxpbmUoZi50b1VwcGVyQ2FzZSgpKTsgZWxzZSBFLmJsb2NrKGYpOyB9XG4gIG9wZW5BaSgpIHsgdGhpcy5vcGVuTWVudSgnc2NyaXB0Jyk7IH1cbiAgYXNrQWkoYTogc3RyaW5nKSB7IHRoaXMuYXNrKGEsIGZhbHNlKTsgfVxuICBhY2NlcHQoKSB7IHRoaXMuZmluaXNoKHRydWUsIGZhbHNlKTsgfVxuICBkaXNjYXJkKCkgeyB0aGlzLmZpbmlzaChmYWxzZSwgZmFsc2UpOyB9XG4gIHVuZG8oKSB7IHRoaXMuZW5nPy51bmRvKCk7IH1cbiAgcmVkbygpIHsgdGhpcy5lbmc/LnJlZG8oKTsgfVxufVxuIl19