@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,341 @@
1
+ // framework/angular/design-tuner/design-tuner.component.ts
2
+ //
3
+ // Native Angular port of framework/react/design-tuner/DesignTuner.tsx.
4
+ // A live preview beside a few sliders, with a button that hands the tuning to the
5
+ // agent. Drag a slider (or arrow-key it) to tweak the sample card by hand, or press
6
+ // the button to let the agent tween every value to a target, drop a note on what it
7
+ // changed, and flip the targets for the next run. Inputs mirror the React props.
8
+ //
9
+ // Icons: the React source uses a "wand" glyph for the agent button; the Angular
10
+ // icon set has no wand, so the closest magic/agent glyph "spark" is substituted.
11
+ // "check" is used unchanged for the sample card's feature list.
12
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, inject, } from '@angular/core';
13
+ import { VoIconComponent } from '../core/icon.component';
14
+ import { ReducedMotionService } from '../core/reduced-motion.service';
15
+ import * as i0 from "@angular/core";
16
+ const PARAMS = [
17
+ { key: 'rad', label: 'Radius', min: 0, max: 28, value: 16, unit: 'px' },
18
+ { key: 'pad', label: 'Padding', min: 8, max: 32, value: 18, unit: 'px' },
19
+ { key: 'gap', label: 'Spacing', min: 4, max: 24, value: 12, unit: 'px' },
20
+ { key: 'sh', label: 'Shadow', min: 0, max: 0.2, value: 0.08, decimals: 2 },
21
+ ];
22
+ // the agent's first target per key, and the value it flips to on the next run
23
+ const TARGETS = {
24
+ rad: [20, 12],
25
+ pad: [24, 20],
26
+ gap: [14, 10],
27
+ sh: [0.05, 0.1],
28
+ };
29
+ const clamp = (p, v) => Math.max(p.min, Math.min(p.max, v));
30
+ export class DesignTunerComponent {
31
+ constructor() {
32
+ /** The sliders. Defaults to radius, padding, spacing and shadow for the sample card. */
33
+ this.params = PARAMS;
34
+ /** What is being tuned, like "Pricing card". */
35
+ this.title = 'Pricing card';
36
+ /** Quiet line beside the title, like "Edited by you" or "Agent is tuning". */
37
+ this.status = 'Edited by you';
38
+ /** The button's label, like "Tune with agent" or "Tune again". */
39
+ this.actionLabel = 'Tune with agent';
40
+ /** The preview lets the agent tune once on its own after a beat. Set false to turn that off. */
41
+ this.auto = true;
42
+ /** Emitted with the values by key whenever a slider or the agent moves one. */
43
+ this.valuesChange = new EventEmitter();
44
+ /** Emitted when the agent-tune button is pressed. */
45
+ this.tune_ = new EventEmitter();
46
+ this.motion = inject(ReducedMotionService);
47
+ this.rows = [];
48
+ /** The agent is tuning: the button thinks and stops taking clicks. */
49
+ this.tuning = false;
50
+ /** What the agent changed and why, shown above the button. */
51
+ this.note = '';
52
+ /** The sample card's feature list. */
53
+ this.features = ['Unlimited frames', 'Agent reviews', 'Shared tokens'];
54
+ this.timers = new Set();
55
+ this.touched = false;
56
+ }
57
+ ngAfterViewInit() {
58
+ this.rows = this.params.map((p) => {
59
+ const v = clamp(p, this.values?.[p.key] ?? p.value);
60
+ return { param: p, value: v, pct: 0, shown: '', drag: false, hot: false, target: TARGETS[p.key]?.[0] ?? p.max };
61
+ });
62
+ this.rows.forEach((r) => this.set(r, r.value));
63
+ // the preview lets the agent tune once on its own, unless you reach for a slider or the button first
64
+ if (this.auto && !this.motion.reduce()) {
65
+ const t = setTimeout(() => {
66
+ this.timers.delete(t);
67
+ if (!this.touched)
68
+ this.tune();
69
+ }, 1600);
70
+ this.timers.add(t);
71
+ }
72
+ }
73
+ /** The css-ready `--vo-<key>` variables the preview card reads. */
74
+ get vars() {
75
+ const out = {};
76
+ for (const r of this.rows) {
77
+ out['--vo-' + r.param.key] = r.param.decimals
78
+ ? String(+r.value.toFixed(r.param.decimals))
79
+ : Math.round(r.value) + (r.param.unit ?? '');
80
+ }
81
+ return out;
82
+ }
83
+ valueNow(r) {
84
+ return r.param.decimals ? +r.value.toFixed(r.param.decimals) : Math.round(r.value);
85
+ }
86
+ set(r, v) {
87
+ r.value = clamp(r.param, v);
88
+ r.pct = ((r.value - r.param.min) / (r.param.max - r.param.min)) * 100;
89
+ r.shown = r.param.decimals ? r.value.toFixed(r.param.decimals) : Math.round(r.value) + (r.param.unit ?? '');
90
+ this.emit();
91
+ }
92
+ emit() {
93
+ const out = {};
94
+ for (const r of this.rows)
95
+ out[r.param.key] = r.value;
96
+ this.valuesChange.emit(out);
97
+ }
98
+ down(r, e) {
99
+ e.target.setPointerCapture?.(e.pointerId);
100
+ r.drag = true;
101
+ this.touched = true;
102
+ this.status = 'Edited by you';
103
+ this.at(r, e);
104
+ }
105
+ move(r, e) {
106
+ if (r.drag)
107
+ this.at(r, e);
108
+ }
109
+ up(r) {
110
+ r.drag = false;
111
+ }
112
+ at(r, e) {
113
+ const b = e.currentTarget.getBoundingClientRect();
114
+ const t = Math.max(0, Math.min(1, (e.clientX - b.left) / b.width));
115
+ this.set(r, r.param.min + (r.param.max - r.param.min) * t);
116
+ }
117
+ key(r, e) {
118
+ const dir = { ArrowRight: 1, ArrowUp: 1, ArrowLeft: -1, ArrowDown: -1 }[e.key];
119
+ if (!dir)
120
+ return;
121
+ e.preventDefault();
122
+ this.touched = true;
123
+ this.status = 'Edited by you';
124
+ this.set(r, r.value + dir * (r.param.decimals ? Math.pow(10, -r.param.decimals) : 1));
125
+ }
126
+ tune() {
127
+ if (this.tuning)
128
+ return;
129
+ this.touched = true;
130
+ this.tune_.emit();
131
+ this.tuning = true;
132
+ this.status = 'Agent is tuning';
133
+ this.note = '';
134
+ void this.run();
135
+ }
136
+ async run() {
137
+ for (const r of this.rows) {
138
+ r.hot = true;
139
+ await this.tween(r, r.value, r.target);
140
+ await this.wait(120);
141
+ r.hot = false;
142
+ }
143
+ this.note = 'Matched the 4px grid and your card tokens. Softer shadow so the CTA leads.';
144
+ this.tuning = false;
145
+ this.status = 'Tuned by agent';
146
+ this.actionLabel = 'Tune again';
147
+ // flip each target so the next run tweaks the card the other way
148
+ for (const r of this.rows) {
149
+ const [a, b] = TARGETS[r.param.key] ?? [r.param.max, r.param.min];
150
+ r.target = r.target === a ? b : a;
151
+ }
152
+ }
153
+ tween(r, from, to) {
154
+ if (this.motion.reduce()) {
155
+ this.set(r, to);
156
+ return Promise.resolve();
157
+ }
158
+ return new Promise((resolve) => {
159
+ const start = performance.now();
160
+ const dur = 650;
161
+ const step = (now) => {
162
+ const t = Math.min(1, (now - start) / dur);
163
+ const e = 1 - Math.pow(1 - t, 3); // ease-out-cubic ~ cubic-bezier(.22,1,.36,1)
164
+ this.set(r, from + (to - from) * e);
165
+ if (t < 1)
166
+ this.frame = requestAnimationFrame(step);
167
+ else
168
+ resolve();
169
+ };
170
+ this.frame = requestAnimationFrame(step);
171
+ });
172
+ }
173
+ wait(ms) {
174
+ if (this.motion.reduce())
175
+ return Promise.resolve();
176
+ return new Promise((resolve) => {
177
+ const t = setTimeout(() => {
178
+ this.timers.delete(t);
179
+ resolve();
180
+ }, ms);
181
+ this.timers.add(t);
182
+ });
183
+ }
184
+ ngOnDestroy() {
185
+ this.timers.forEach((t) => clearTimeout(t));
186
+ this.timers.clear();
187
+ if (this.frame)
188
+ cancelAnimationFrame(this.frame);
189
+ }
190
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignTunerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DesignTunerComponent, isStandalone: true, selector: "vo-design-tuner", inputs: { params: "params", values: "values", title: "title", status: "status", actionLabel: "actionLabel", auto: "auto" }, outputs: { valuesChange: "valuesChange", tune_: "tune_" }, ngImport: i0, template: `
192
+ <!-- the site lays this out by the width of its card, so the box around it is the container its query measures -->
193
+ <div data-vo="" class="vo-dtx-box" [style.container-type]="'inline-size'" [style.width]="'100%'">
194
+ <div class="vo-dtx">
195
+ <div class="vo-dtx-prev">
196
+ <div class="vo-dtx-card" [style]="vars">
197
+ <span class="vo-tag vo-b vo-dtx-tg">Pro</span>
198
+ <div class="vo-dtx-pr"><b class="vo-num">$24</b><span class="vo-muted">per editor, monthly</span></div>
199
+ <div class="vo-dtx-li">
200
+ @for (f of features; track f) {
201
+ <span><vo-icon name="check" size="xs"></vo-icon>{{ f }}</span>
202
+ }
203
+ </div>
204
+ <button type="button" class="vo-pill vo-accent vo-dtx-cta">Start free trial</button>
205
+ </div>
206
+ </div>
207
+ <div class="vo-dtx-insp vo-panel">
208
+ <div class="vo-dtx-ih"><b>{{ title }}</b><span class="vo-muted vo-dtx-st">{{ status }}</span></div>
209
+ <div class="vo-dtx-rows">
210
+ @for (row of rows; track row.param.key) {
211
+ <div class="vo-dtx-r" [class.vo-hot]="row.hot">
212
+ <span>{{ row.param.label }}</span>
213
+ <div
214
+ class="vo-dtx-sl"
215
+ [class.vo-drag]="row.drag"
216
+ role="slider"
217
+ tabindex="0"
218
+ [attr.aria-label]="row.param.label"
219
+ [attr.aria-valuemin]="row.param.min"
220
+ [attr.aria-valuemax]="row.param.max"
221
+ [attr.aria-valuenow]="valueNow(row)"
222
+ [attr.aria-valuetext]="row.shown"
223
+ (pointerdown)="down(row, $event)"
224
+ (pointermove)="move(row, $event)"
225
+ (pointerup)="up(row)"
226
+ (pointercancel)="up(row)"
227
+ (keydown)="key(row, $event)"
228
+ >
229
+ <span class="vo-f" [style.width.%]="row.pct"></span>
230
+ <span class="vo-k" [style.left.%]="row.pct"></span>
231
+ </div>
232
+ <span class="vo-v vo-num">{{ row.shown }}</span>
233
+ </div>
234
+ }
235
+ </div>
236
+ @if (note) {
237
+ <div class="vo-dtx-note vo-enter">{{ note }}</div>
238
+ }
239
+ <button
240
+ type="button"
241
+ class="vo-pill vo-primary vo-sm vo-dtx-go"
242
+ [class.vo-busy]="tuning"
243
+ [attr.aria-busy]="tuning ? true : null"
244
+ (click)="tune()"
245
+ >
246
+ @if (tuning) {
247
+ <span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>Tuning
248
+ } @else {
249
+ <vo-icon name="spark" size="xs"></vo-icon>{{ actionLabel }}
250
+ }
251
+ </button>
252
+ </div>
253
+ </div>
254
+ </div>
255
+ `, isInline: true, styles: [".vo-dtx{display:grid;grid-template-columns:1fr 280px;gap:14px;align-items:stretch}@media (max-width:720px){.vo-dtx{grid-template-columns:1fr}}@container (max-width:600px){.vo-dtx{grid-template-columns:1fr}.vo-dtx-prev{min-height:240px}}.vo-dtx-prev{border-radius:calc(18px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;padding:var(--vo-s-6);min-height:300px;min-width:0}.vo-dtx-card{--vo-rad:16px;--vo-pad:18px;--vo-gap:12px;--vo-sh:.08;width:min(250px,100%);background:var(--vo-surface);border-radius:var(--vo-rad);padding:var(--vo-pad);display:flex;flex-direction:column;gap:var(--vo-gap);box-shadow:0 1px 2px rgba(0,0,0,var(--vo-sh)),0 8px 24px rgba(0,0,0,calc(var(--vo-sh) * .8))}.vo-dtx-tg{align-self:flex-start}.vo-dtx-pr{display:flex;align-items:baseline;gap:6px}.vo-dtx-pr b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-dtx-pr span{font-size:12px}.vo-dtx-li{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--vo-fg2)}.vo-dtx-li span{display:flex;align-items:center;gap:7px}.vo-dtx-li svg{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-cta{width:100%;border-radius:calc(var(--vo-rad) * .6)}.vo-dtx-insp{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);min-width:0}.vo-dtx-ih{display:flex;align-items:baseline;justify-content:space-between;font-size:13.5px}.vo-dtx-ih b{font-weight:500}.vo-dtx-st{font-size:12px}.vo-dtx-rows{display:flex;flex-direction:column;gap:10px}.vo-dtx-r{display:grid;grid-template-columns:62px 1fr 40px;align-items:center;gap:10px;font-size:12.5px;color:var(--vo-fg2)}.vo-dtx-r .vo-v{text-align:right;color:var(--vo-fg);font-size:12px}.vo-dtx-r.vo-hot .vo-v{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-sl{position:relative;height:22px;display:flex;align-items:center;cursor:pointer;touch-action:none}.vo-dtx-sl:before{content:\"\";position:absolute;left:0;right:0;height:4px;border-radius:2px;background:var(--vo-line)}.vo-dtx-sl .vo-f{position:absolute;left:0;height:4px;border-radius:2px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dtx-sl .vo-k{position:absolute;width:14px;height:14px;margin-left:-7px;border-radius:50%;background:#fff;box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent),0 1px 3px #0000002e;transition:transform .2s}.vo-dtx-sl.vo-drag .vo-k,.vo-dtx-sl:focus-visible .vo-k{transform:scale(1.15)}@media (hover:hover) and (pointer:fine){.vo-dtx-sl:hover .vo-k{transform:scale(1.15)}}.vo-dtx-sl:focus-visible{outline-offset:4px}.vo-dtx-go{align-self:stretch;margin-top:auto}.vo-dtx-go.vo-busy{pointer-events:none}.vo-dtx-note{font-size:12px;color:var(--vo-fg2);padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-accent-bg);line-height:1.45}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-b{background:var(--vo-pb-bg);color:var(--vo-pb)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.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-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}@media (prefers-reduced-motion:reduce){.vo-think.vo-on,.vo-think.vo-on i,.vo-enter{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DesignTunerComponent, decorators: [{
258
+ type: Component,
259
+ args: [{ selector: 'vo-design-tuner', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
260
+ <!-- the site lays this out by the width of its card, so the box around it is the container its query measures -->
261
+ <div data-vo="" class="vo-dtx-box" [style.container-type]="'inline-size'" [style.width]="'100%'">
262
+ <div class="vo-dtx">
263
+ <div class="vo-dtx-prev">
264
+ <div class="vo-dtx-card" [style]="vars">
265
+ <span class="vo-tag vo-b vo-dtx-tg">Pro</span>
266
+ <div class="vo-dtx-pr"><b class="vo-num">$24</b><span class="vo-muted">per editor, monthly</span></div>
267
+ <div class="vo-dtx-li">
268
+ @for (f of features; track f) {
269
+ <span><vo-icon name="check" size="xs"></vo-icon>{{ f }}</span>
270
+ }
271
+ </div>
272
+ <button type="button" class="vo-pill vo-accent vo-dtx-cta">Start free trial</button>
273
+ </div>
274
+ </div>
275
+ <div class="vo-dtx-insp vo-panel">
276
+ <div class="vo-dtx-ih"><b>{{ title }}</b><span class="vo-muted vo-dtx-st">{{ status }}</span></div>
277
+ <div class="vo-dtx-rows">
278
+ @for (row of rows; track row.param.key) {
279
+ <div class="vo-dtx-r" [class.vo-hot]="row.hot">
280
+ <span>{{ row.param.label }}</span>
281
+ <div
282
+ class="vo-dtx-sl"
283
+ [class.vo-drag]="row.drag"
284
+ role="slider"
285
+ tabindex="0"
286
+ [attr.aria-label]="row.param.label"
287
+ [attr.aria-valuemin]="row.param.min"
288
+ [attr.aria-valuemax]="row.param.max"
289
+ [attr.aria-valuenow]="valueNow(row)"
290
+ [attr.aria-valuetext]="row.shown"
291
+ (pointerdown)="down(row, $event)"
292
+ (pointermove)="move(row, $event)"
293
+ (pointerup)="up(row)"
294
+ (pointercancel)="up(row)"
295
+ (keydown)="key(row, $event)"
296
+ >
297
+ <span class="vo-f" [style.width.%]="row.pct"></span>
298
+ <span class="vo-k" [style.left.%]="row.pct"></span>
299
+ </div>
300
+ <span class="vo-v vo-num">{{ row.shown }}</span>
301
+ </div>
302
+ }
303
+ </div>
304
+ @if (note) {
305
+ <div class="vo-dtx-note vo-enter">{{ note }}</div>
306
+ }
307
+ <button
308
+ type="button"
309
+ class="vo-pill vo-primary vo-sm vo-dtx-go"
310
+ [class.vo-busy]="tuning"
311
+ [attr.aria-busy]="tuning ? true : null"
312
+ (click)="tune()"
313
+ >
314
+ @if (tuning) {
315
+ <span class="vo-think vo-on" aria-hidden="true"><i></i><i></i><i></i><i></i></span>Tuning
316
+ } @else {
317
+ <vo-icon name="spark" size="xs"></vo-icon>{{ actionLabel }}
318
+ }
319
+ </button>
320
+ </div>
321
+ </div>
322
+ </div>
323
+ `, styles: [".vo-dtx{display:grid;grid-template-columns:1fr 280px;gap:14px;align-items:stretch}@media (max-width:720px){.vo-dtx{grid-template-columns:1fr}}@container (max-width:600px){.vo-dtx{grid-template-columns:1fr}.vo-dtx-prev{min-height:240px}}.vo-dtx-prev{border-radius:calc(18px * var(--vo-rk));background:var(--vo-chip);display:grid;place-items:center;padding:var(--vo-s-6);min-height:300px;min-width:0}.vo-dtx-card{--vo-rad:16px;--vo-pad:18px;--vo-gap:12px;--vo-sh:.08;width:min(250px,100%);background:var(--vo-surface);border-radius:var(--vo-rad);padding:var(--vo-pad);display:flex;flex-direction:column;gap:var(--vo-gap);box-shadow:0 1px 2px rgba(0,0,0,var(--vo-sh)),0 8px 24px rgba(0,0,0,calc(var(--vo-sh) * .8))}.vo-dtx-tg{align-self:flex-start}.vo-dtx-pr{display:flex;align-items:baseline;gap:6px}.vo-dtx-pr b{font-size:14px;font-weight:500;letter-spacing:-.02em}.vo-dtx-pr span{font-size:12px}.vo-dtx-li{display:flex;flex-direction:column;gap:6px;font-size:13px;color:var(--vo-fg2)}.vo-dtx-li span{display:flex;align-items:center;gap:7px}.vo-dtx-li svg{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-cta{width:100%;border-radius:calc(var(--vo-rad) * .6)}.vo-dtx-insp{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3);min-width:0}.vo-dtx-ih{display:flex;align-items:baseline;justify-content:space-between;font-size:13.5px}.vo-dtx-ih b{font-weight:500}.vo-dtx-st{font-size:12px}.vo-dtx-rows{display:flex;flex-direction:column;gap:10px}.vo-dtx-r{display:grid;grid-template-columns:62px 1fr 40px;align-items:center;gap:10px;font-size:12.5px;color:var(--vo-fg2)}.vo-dtx-r .vo-v{text-align:right;color:var(--vo-fg);font-size:12px}.vo-dtx-r.vo-hot .vo-v{color:var(--vo-accent-fg,var(--vo-accent))}.vo-dtx-sl{position:relative;height:22px;display:flex;align-items:center;cursor:pointer;touch-action:none}.vo-dtx-sl:before{content:\"\";position:absolute;left:0;right:0;height:4px;border-radius:2px;background:var(--vo-line)}.vo-dtx-sl .vo-f{position:absolute;left:0;height:4px;border-radius:2px;background:var(--vo-accent-mark,var(--vo-accent))}.vo-dtx-sl .vo-k{position:absolute;width:14px;height:14px;margin-left:-7px;border-radius:50%;background:#fff;box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent),0 1px 3px #0000002e;transition:transform .2s}.vo-dtx-sl.vo-drag .vo-k,.vo-dtx-sl:focus-visible .vo-k{transform:scale(1.15)}@media (hover:hover) and (pointer:fine){.vo-dtx-sl:hover .vo-k{transform:scale(1.15)}}.vo-dtx-sl:focus-visible{outline-offset:4px}.vo-dtx-go{align-self:stretch;margin-top:auto}.vo-dtx-go.vo-busy{pointer-events:none}.vo-dtx-note{font-size:12px;color:var(--vo-fg2);padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-accent-bg);line-height:1.45}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-tag{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 7px;border-radius:var(--vo-r-tag);font-size:11.5px;font-weight:500;white-space:nowrap;background:var(--vo-chip);color:var(--vo-fg2)}.vo-tag.vo-b{background:var(--vo-pb-bg);color:var(--vo-pb)}.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-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.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-think{width:14px;height:14px;position:relative;flex:none;display:inline-block}.vo-think i{position:absolute;width:3.4px;height:3.4px;border-radius:50%;background:currentColor;left:50%;top:50%;margin:-1.7px}.vo-think i:nth-child(1){transform:translate(-3.6px,-3.6px)}.vo-think i:nth-child(2){transform:translate(3.6px,-3.6px)}.vo-think i:nth-child(3){transform:translate(3.6px,3.6px)}.vo-think i:nth-child(4){transform:translate(-3.6px,3.6px)}.vo-think.vo-on{animation:vo-thinkrot 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i{animation:vo-thinkpulse 1.6s var(--vo-ease-io) infinite}.vo-think.vo-on i:nth-child(2){animation-delay:.2s}.vo-think.vo-on i:nth-child(3){animation-delay:.4s}.vo-think.vo-on i:nth-child(4){animation-delay:.6s}@keyframes vo-thinkrot{0%{transform:rotate(0)}50%{transform:rotate(90deg)}to{transform:rotate(180deg)}}@keyframes vo-thinkpulse{0%,to{opacity:1}50%{opacity:.35}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}@media (prefers-reduced-motion:reduce){.vo-think.vo-on,.vo-think.vo-on i,.vo-enter{animation:none}}\n"] }]
324
+ }], propDecorators: { params: [{
325
+ type: Input
326
+ }], values: [{
327
+ type: Input
328
+ }], title: [{
329
+ type: Input
330
+ }], status: [{
331
+ type: Input
332
+ }], actionLabel: [{
333
+ type: Input
334
+ }], auto: [{
335
+ type: Input
336
+ }], valuesChange: [{
337
+ type: Output
338
+ }], tune_: [{
339
+ type: Output
340
+ }] } });
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduLXR1bmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2Rlc2lnbi10dW5lci9kZXNpZ24tdHVuZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLGtGQUFrRjtBQUNsRixvRkFBb0Y7QUFDcEYsb0ZBQW9GO0FBQ3BGLGlGQUFpRjtBQUNqRixFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLGlGQUFpRjtBQUNqRixnRUFBZ0U7QUFFaEUsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFrQnRFLE1BQU0sTUFBTSxHQUFpQjtJQUMzQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3ZFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7SUFDeEUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtJQUN4RSxFQUFFLEdBQUcs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QUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDOytHQTFLVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixrUUFuRXJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VULGdtS0FqRVMsZUFBZTs7NEZBb0VkLG9CQUFvQjtrQkF4RWhDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxpQkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZUFBZSxDQUFDLFlBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VUOzhCQUtRLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFHSSxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2Rlc2lnbi10dW5lci9kZXNpZ24tdHVuZXIuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvZGVzaWduLXR1bmVyL0Rlc2lnblR1bmVyLnRzeC5cbi8vIEEgbGl2ZSBwcmV2aWV3IGJlc2lkZSBhIGZldyBzbGlkZXJzLCB3aXRoIGEgYnV0dG9uIHRoYXQgaGFuZHMgdGhlIHR1bmluZyB0byB0aGVcbi8vIGFnZW50LiBEcmFnIGEgc2xpZGVyIChvciBhcnJvdy1rZXkgaXQpIHRvIHR3ZWFrIHRoZSBzYW1wbGUgY2FyZCBieSBoYW5kLCBvciBwcmVzc1xuLy8gdGhlIGJ1dHRvbiB0byBsZXQgdGhlIGFnZW50IHR3ZWVuIGV2ZXJ5IHZhbHVlIHRvIGEgdGFyZ2V0LCBkcm9wIGEgbm90ZSBvbiB3aGF0IGl0XG4vLyBjaGFuZ2VkLCBhbmQgZmxpcCB0aGUgdGFyZ2V0cyBmb3IgdGhlIG5leHQgcnVuLiBJbnB1dHMgbWlycm9yIHRoZSBSZWFjdCBwcm9wcy5cbi8vXG4vLyBJY29uczogdGhlIFJlYWN0IHNvdXJjZSB1c2VzIGEgXCJ3YW5kXCIgZ2x5cGggZm9yIHRoZSBhZ2VudCBidXR0b247IHRoZSBBbmd1bGFyXG4vLyBpY29uIHNldCBoYXMgbm8gd2FuZCwgc28gdGhlIGNsb3Nlc3QgbWFnaWMvYWdlbnQgZ2x5cGggXCJzcGFya1wiIGlzIHN1YnN0aXR1dGVkLlxuLy8gXCJjaGVja1wiIGlzIHVzZWQgdW5jaGFuZ2VkIGZvciB0aGUgc2FtcGxlIGNhcmQncyBmZWF0dXJlIGxpc3QuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZWR1Y2VkTW90aW9uU2VydmljZSB9IGZyb20gJy4uL2NvcmUvcmVkdWNlZC1tb3Rpb24uc2VydmljZSc7XG5cbi8qKiBPbmUgc2xpZGVyOiBuYW1lcyBhIHZhbHVlIGFuZCB0aGUgQ1NTIHZhcmlhYmxlIGl0IHNldHMgb24gdGhlIHByZXZpZXcsIGAtLXZvLTxrZXk+YC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHVuZXJQYXJhbSB7XG4gIC8qKiBOYW1lcyB0aGUgdmFsdWUgYW5kIHRoZSBDU1MgdmFyaWFibGUgaXQgc2V0cyBvbiB0aGUgcHJldmlldywgYC0tdm8tPGtleT5gLiAqL1xuICBrZXk6IHN0cmluZztcbiAgLyoqIFNob3duIGJlc2lkZSB0aGUgc2xpZGVyLCBsaWtlIFwiUmFkaXVzXCIuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIG1pbjogbnVtYmVyO1xuICBtYXg6IG51bWJlcjtcbiAgLyoqIFdoZXJlIHRoZSBzbGlkZXIgc3RhcnRzIHdoZW4geW91IGRvbid0IHBhc3MgdmFsdWVzLiAqL1xuICB2YWx1ZTogbnVtYmVyO1xuICAvKiogQWRkZWQgYWZ0ZXIgd2hvbGUgbnVtYmVycywgbGlrZSBcInB4XCIuIExlYXZlIGl0IG91dCBmb3IgcGxhaW4gbnVtYmVycy4gKi9cbiAgdW5pdD86IHN0cmluZztcbiAgLyoqIFNob3dzIGFuZCBzZXRzIHRoZSB2YWx1ZSB3aXRoIHRoaXMgbWFueSBkZWNpbWFscyBpbnN0ZWFkIG9mIHJvdW5kaW5nLCBsaWtlIDIgZm9yIGEgc2hhZG93IHN0cmVuZ3RoLiAqL1xuICBkZWNpbWFscz86IG51bWJlcjtcbn1cblxuY29uc3QgUEFSQU1TOiBUdW5lclBhcmFtW10gPSBbXG4gIHsga2V5OiAncmFkJywgbGFiZWw6ICdSYWRpdXMnLCBtaW46IDAsIG1heDogMjgsIHZhbHVlOiAxNiwgdW5pdDogJ3B4JyB9LFxuICB7IGtleTogJ3BhZCcsIGxhYmVsOiAnUGFkZGluZycsIG1pbjogOCwgbWF4OiAzMiwgdmFsdWU6IDE4LCB1bml0OiAncHgnIH0sXG4gIHsga2V5OiAnZ2FwJywgbGFiZWw6ICdTcGFjaW5nJywgbWluOiA0LCBtYXg6IDI0LCB2YWx1ZTogMTIsIHVuaXQ6ICdweCcgfSxcbiAgeyBrZXk6ICdzaCcsIGxhYmVsOiAnU2hhZG93JywgbWluOiAwLCBtYXg6IDAuMiwgdmFsdWU6IDAuMDgsIGRlY2ltYWxzOiAyIH0sXG5dO1xuXG4vLyB0aGUgYWdlbnQncyBmaXJzdCB0YXJnZXQgcGVyIGtleSwgYW5kIHRoZSB2YWx1ZSBpdCBmbGlwcyB0byBvbiB0aGUgbmV4dCBydW5cbmNvbnN0IFRBUkdFVFM6IFJlY29yZDxzdHJpbmcsIFtudW1iZXIsIG51bWJlcl0+ID0ge1xuICByYWQ6IFsyMCwgMTJdLFxuICBwYWQ6IFsyNCwgMjBdLFxuICBnYXA6IFsxNCwgMTBdLFxuICBzaDogWzAuMDUsIDAuMV0sXG59O1xuXG5jb25zdCBjbGFtcCA9IChwOiBUdW5lclBhcmFtLCB2OiBudW1iZXIpID0+IE1hdGgubWF4KHAubWluLCBNYXRoLm1pbihwLm1heCwgdikpO1xuXG4vKiogQSBzbGlkZXIgcGx1cyBpdHMgbGl2ZSwgc2hvd24gYW5kIGNzcy1yZWFkeSB2YWx1ZS4gKi9cbmludGVyZmFjZSBSb3cge1xuICBwYXJhbTogVHVuZXJQYXJhbTtcbiAgdmFsdWU6IG51bWJlcjtcbiAgcGN0OiBudW1iZXI7XG4gIHNob3duOiBzdHJpbmc7XG4gIGRyYWc6IGJvb2xlYW47XG4gIGhvdDogYm9vbGVhbjtcbiAgdGFyZ2V0OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLWRlc2lnbi10dW5lcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gdGhlIHNpdGUgbGF5cyB0aGlzIG91dCBieSB0aGUgd2lkdGggb2YgaXRzIGNhcmQsIHNvIHRoZSBib3ggYXJvdW5kIGl0IGlzIHRoZSBjb250YWluZXIgaXRzIHF1ZXJ5IG1lYXN1cmVzIC0tPlxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8tZHR4LWJveFwiIFtzdHlsZS5jb250YWluZXItdHlwZV09XCInaW5saW5lLXNpemUnXCIgW3N0eWxlLndpZHRoXT1cIicxMDAlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWR0eFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXByZXZcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWNhcmRcIiBbc3R5bGVdPVwidmFyc1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8tYiB2by1kdHgtdGdcIj5Qcm88L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXByXCI+PGIgY2xhc3M9XCJ2by1udW1cIj4kMjQ8L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZFwiPnBlciBlZGl0b3IsIG1vbnRobHk8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWxpXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGYgb2YgZmVhdHVyZXM7IHRyYWNrIGYpIHtcbiAgICAgICAgICAgICAgICA8c3Bhbj48dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgZiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tYWNjZW50IHZvLWR0eC1jdGFcIj5TdGFydCBmcmVlIHRyaWFsPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWluc3Agdm8tcGFuZWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LWloXCI+PGI+e3sgdGl0bGUgfX08L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1kdHgtc3RcIj57eyBzdGF0dXMgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWR0eC1yb3dzXCI+XG4gICAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LnBhcmFtLmtleSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZHR4LXJcIiBbY2xhc3Mudm8taG90XT1cInJvdy5ob3RcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cucGFyYW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1kdHgtc2xcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLWRyYWddPVwicm93LmRyYWdcIlxuICAgICAgICAgICAgICAgICAgcm9sZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyb3cucGFyYW0ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCJyb3cucGFyYW0ubWluXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtYXhdPVwicm93LnBhcmFtLm1heFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInZhbHVlTm93KHJvdylcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwicm93LnNob3duXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJkb3duKHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAocG9pbnRlcm1vdmUpPVwibW92ZShyb3csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHBvaW50ZXJ1cCk9XCJ1cChyb3cpXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyY2FuY2VsKT1cInVwKHJvdylcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5KHJvdywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1mXCIgW3N0eWxlLndpZHRoLiVdPVwicm93LnBjdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8ta1wiIFtzdHlsZS5sZWZ0LiVdPVwicm93LnBjdFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXYgdm8tbnVtXCI+e3sgcm93LnNob3duIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKG5vdGUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1kdHgtbm90ZSB2by1lbnRlclwiPnt7IG5vdGUgfX08L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInZvLXBpbGwgdm8tcHJpbWFyeSB2by1zbSB2by1kdHgtZ29cIlxuICAgICAgICAgICAgW2NsYXNzLnZvLWJ1c3ldPVwidHVuaW5nXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYnVzeV09XCJ0dW5pbmcgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidHVuZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHR1bmluZykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRoaW5rIHZvLW9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PGk+PC9pPjxpPjwvaT48aT48L2k+PGk+PC9pPjwvc3Bhbj5UdW5pbmdcbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3BhcmtcIiBzaXplPVwieHNcIj48L3ZvLWljb24+e3sgYWN0aW9uTGFiZWwgfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2Rlc2lnbi10dW5lci5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25UdW5lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgc2xpZGVycy4gRGVmYXVsdHMgdG8gcmFkaXVzLCBwYWRkaW5nLCBzcGFjaW5nIGFuZCBzaGFkb3cgZm9yIHRoZSBzYW1wbGUgY2FyZC4gKi9cbiAgQElucHV0KCkgcGFyYW1zOiBUdW5lclBhcmFtW10gPSBQQVJBTVM7XG4gIC8qKiBUaGUgdmFsdWUgb2YgZWFjaCBzbGlkZXIgYnkga2V5LiBMZWF2ZSBpdCBvdXQgdG8gbGV0IHRoZSBzbGlkZXJzIGtlZXAgdGhlaXIgb3duLiAqL1xuICBASW5wdXQoKSB2YWx1ZXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAvKiogV2hhdCBpcyBiZWluZyB0dW5lZCwgbGlrZSBcIlByaWNpbmcgY2FyZFwiLiAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICdQcmljaW5nIGNhcmQnO1xuICAvKiogUXVpZXQgbGluZSBiZXNpZGUgdGhlIHRpdGxlLCBsaWtlIFwiRWRpdGVkIGJ5IHlvdVwiIG9yIFwiQWdlbnQgaXMgdHVuaW5nXCIuICovXG4gIEBJbnB1dCgpIHN0YXR1cyA9ICdFZGl0ZWQgYnkgeW91JztcbiAgLyoqIFRoZSBidXR0b24ncyBsYWJlbCwgbGlrZSBcIlR1bmUgd2l0aCBhZ2VudFwiIG9yIFwiVHVuZSBhZ2FpblwiLiAqL1xuICBASW5wdXQoKSBhY3Rpb25MYWJlbCA9ICdUdW5lIHdpdGggYWdlbnQnO1xuICAvKiogVGhlIHByZXZpZXcgbGV0cyB0aGUgYWdlbnQgdHVuZSBvbmNlIG9uIGl0cyBvd24gYWZ0ZXIgYSBiZWF0LiBTZXQgZmFsc2UgdG8gdHVybiB0aGF0IG9mZi4gKi9cbiAgQElucHV0KCkgYXV0byA9IHRydWU7XG5cbiAgLyoqIEVtaXR0ZWQgd2l0aCB0aGUgdmFsdWVzIGJ5IGtleSB3aGVuZXZlciBhIHNsaWRlciBvciB0aGUgYWdlbnQgbW92ZXMgb25lLiAqL1xuICBAT3V0cHV0KCkgdmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBhZ2VudC10dW5lIGJ1dHRvbiBpcyBwcmVzc2VkLiAqL1xuICBAT3V0cHV0KCkgdHVuZV8gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIHJvd3M6IFJvd1tdID0gW107XG4gIC8qKiBUaGUgYWdlbnQgaXMgdHVuaW5nOiB0aGUgYnV0dG9uIHRoaW5rcyBhbmQgc3RvcHMgdGFraW5nIGNsaWNrcy4gKi9cbiAgdHVuaW5nID0gZmFsc2U7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBjaGFuZ2VkIGFuZCB3aHksIHNob3duIGFib3ZlIHRoZSBidXR0b24uICovXG4gIG5vdGUgPSAnJztcbiAgLyoqIFRoZSBzYW1wbGUgY2FyZCdzIGZlYXR1cmUgbGlzdC4gKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXMgPSBbJ1VubGltaXRlZCBmcmFtZXMnLCAnQWdlbnQgcmV2aWV3cycsICdTaGFyZWQgdG9rZW5zJ107XG5cbiAgcHJpdmF0ZSB0aW1lcnMgPSBuZXcgU2V0PFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+PigpO1xuICBwcml2YXRlIGZyYW1lPzogUmV0dXJuVHlwZTx0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPjtcbiAgcHJpdmF0ZSB0b3VjaGVkID0gZmFsc2U7XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMucGFyYW1zLm1hcCgocCkgPT4ge1xuICAgICAgY29uc3QgdiA9IGNsYW1wKHAsIHRoaXMudmFsdWVzPy5bcC5rZXldID8/IHAudmFsdWUpO1xuICAgICAgcmV0dXJuIHsgcGFyYW06IHAsIHZhbHVlOiB2LCBwY3Q6IDAsIHNob3duOiAnJywgZHJhZzogZmFsc2UsIGhvdDogZmFsc2UsIHRhcmdldDogVEFSR0VUU1twLmtleV0/LlswXSA/PyBwLm1heCB9O1xuICAgIH0pO1xuICAgIHRoaXMucm93cy5mb3JFYWNoKChyKSA9PiB0aGlzLnNldChyLCByLnZhbHVlKSk7XG4gICAgLy8gdGhlIHByZXZpZXcgbGV0cyB0aGUgYWdlbnQgdHVuZSBvbmNlIG9uIGl0cyBvd24sIHVubGVzcyB5b3UgcmVhY2ggZm9yIGEgc2xpZGVyIG9yIHRoZSBidXR0b24gZmlyc3RcbiAgICBpZiAodGhpcy5hdXRvICYmICF0aGlzLm1vdGlvbi5yZWR1Y2UoKSkge1xuICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVycy5kZWxldGUodCk7XG4gICAgICAgIGlmICghdGhpcy50b3VjaGVkKSB0aGlzLnR1bmUoKTtcbiAgICAgIH0sIDE2MDApO1xuICAgICAgdGhpcy50aW1lcnMuYWRkKHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgY3NzLXJlYWR5IGAtLXZvLTxrZXk+YCB2YXJpYWJsZXMgdGhlIHByZXZpZXcgY2FyZCByZWFkcy4gKi9cbiAgZ2V0IHZhcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucm93cykge1xuICAgICAgb3V0WyctLXZvLScgKyByLnBhcmFtLmtleV0gPSByLnBhcmFtLmRlY2ltYWxzXG4gICAgICAgID8gU3RyaW5nKCtyLnZhbHVlLnRvRml4ZWQoci5wYXJhbS5kZWNpbWFscykpXG4gICAgICAgIDogTWF0aC5yb3VuZChyLnZhbHVlKSArIChyLnBhcmFtLnVuaXQgPz8gJycpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgdmFsdWVOb3cocjogUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gci5wYXJhbS5kZWNpbWFscyA/ICtyLnZhbHVlLnRvRml4ZWQoci5wYXJhbS5kZWNpbWFscykgOiBNYXRoLnJvdW5kKHIudmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXQocjogUm93LCB2OiBudW1iZXIpOiB2b2lkIHtcbiAgICByLnZhbHVlID0gY2xhbXAoci5wYXJhbSwgdik7XG4gICAgci5wY3QgPSAoKHIudmFsdWUgLSByLnBhcmFtLm1pbikgLyAoci5wYXJhbS5tYXggLSByLnBhcmFtLm1pbikpICogMTAwO1xuICAgIHIuc2hvd24gPSByLnBhcmFtLmRlY2ltYWxzID8gci52YWx1ZS50b0ZpeGVkKHIucGFyYW0uZGVjaW1hbHMpIDogTWF0aC5yb3VuZChyLnZhbHVlKSArIChyLnBhcmFtLnVuaXQgPz8gJycpO1xuICAgIHRoaXMuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0KCk6IHZvaWQge1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJvd3MpIG91dFtyLnBhcmFtLmtleV0gPSByLnZhbHVlO1xuICAgIHRoaXMudmFsdWVzQ2hhbmdlLmVtaXQob3V0KTtcbiAgfVxuXG4gIGRvd24ocjogUm93LCBlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICAgIHIuZHJhZyA9IHRydWU7XG4gICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXR1cyA9ICdFZGl0ZWQgYnkgeW91JztcbiAgICB0aGlzLmF0KHIsIGUpO1xuICB9XG5cbiAgbW92ZShyOiBSb3csIGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChyLmRyYWcpIHRoaXMuYXQociwgZSk7XG4gIH1cblxuICB1cChyOiBSb3cpOiB2b2lkIHtcbiAgICByLmRyYWcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXQocjogUm93LCBlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiID0gKGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChlLmNsaWVudFggLSBiLmxlZnQpIC8gYi53aWR0aCkpO1xuICAgIHRoaXMuc2V0KHIsIHIucGFyYW0ubWluICsgKHIucGFyYW0ubWF4IC0gci5wYXJhbS5taW4pICogdCk7XG4gIH1cblxuICBrZXkocjogUm93LCBlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZGlyID0gKHsgQXJyb3dSaWdodDogMSwgQXJyb3dVcDogMSwgQXJyb3dMZWZ0OiAtMSwgQXJyb3dEb3duOiAtMSB9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4pW2Uua2V5XTtcbiAgICBpZiAoIWRpcikgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzID0gJ0VkaXRlZCBieSB5b3UnO1xuICAgIHRoaXMuc2V0KHIsIHIudmFsdWUgKyBkaXIgKiAoci5wYXJhbS5kZWNpbWFscyA/IE1hdGgucG93KDEwLCAtci5wYXJhbS5kZWNpbWFscykgOiAxKSk7XG4gIH1cblxuICB0dW5lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR1bmluZykgcmV0dXJuO1xuICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgdGhpcy50dW5lXy5lbWl0KCk7XG4gICAgdGhpcy50dW5pbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhdHVzID0gJ0FnZW50IGlzIHR1bmluZyc7XG4gICAgdGhpcy5ub3RlID0gJyc7XG4gICAgdm9pZCB0aGlzLnJ1bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMucm93cykge1xuICAgICAgci5ob3QgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy50d2VlbihyLCByLnZhbHVlLCByLnRhcmdldCk7XG4gICAgICBhd2FpdCB0aGlzLndhaXQoMTIwKTtcbiAgICAgIHIuaG90ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMubm90ZSA9ICdNYXRjaGVkIHRoZSA0cHggZ3JpZCBhbmQgeW91ciBjYXJkIHRva2Vucy4gU29mdGVyIHNoYWRvdyBzbyB0aGUgQ1RBIGxlYWRzLic7XG4gICAgdGhpcy50dW5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXR1cyA9ICdUdW5lZCBieSBhZ2VudCc7XG4gICAgdGhpcy5hY3Rpb25MYWJlbCA9ICdUdW5lIGFnYWluJztcbiAgICAvLyBmbGlwIGVhY2ggdGFyZ2V0IHNvIHRoZSBuZXh0IHJ1biB0d2Vha3MgdGhlIGNhcmQgdGhlIG90aGVyIHdheVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJvd3MpIHtcbiAgICAgIGNvbnN0IFthLCBiXSA9IFRBUkdFVFNbci5wYXJhbS5rZXldID8/IFtyLnBhcmFtLm1heCwgci5wYXJhbS5taW5dO1xuICAgICAgci50YXJnZXQgPSByLnRhcmdldCA9PT0gYSA/IGIgOiBhO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdHdlZW4ocjogUm93LCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb3Rpb24ucmVkdWNlKCkpIHtcbiAgICAgIHRoaXMuc2V0KHIsIHRvKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgY29uc3QgZHVyID0gNjUwO1xuICAgICAgY29uc3Qgc3RlcCA9IChub3c6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0KSAvIGR1cik7XG4gICAgICAgIGNvbnN0IGUgPSAxIC0gTWF0aC5wb3coMSAtIHQsIDMpOyAvLyBlYXNlLW91dC1jdWJpYyB+IGN1YmljLWJlemllciguMjIsMSwuMzYsMSlcbiAgICAgICAgdGhpcy5zZXQociwgZnJvbSArICh0byAtIGZyb20pICogZSk7XG4gICAgICAgIGlmICh0IDwgMSkgdGhpcy5mcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICAgICAgZWxzZSByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5mcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd2FpdChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW90aW9uLnJlZHVjZSgpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZSh0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSwgbXMpO1xuICAgICAgdGhpcy50aW1lcnMuYWRkKHQpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaCgodCkgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLnRpbWVycy5jbGVhcigpO1xuICAgIGlmICh0aGlzLmZyYW1lKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lKTtcbiAgfVxufVxuIl19