@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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
// framework/angular/terminal-stream/terminal-stream.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/terminal-stream/TerminalStream.tsx.
|
|
4
|
+
// The shell commands an agent runs, as a compact terminal: the working directory
|
|
5
|
+
// and how the run is going in the header, each command with its output streaming
|
|
6
|
+
// in under it and an exit code or a check with how long it took, and a summary at
|
|
7
|
+
// the foot once it is over. Long output folds to its last lines. The terminal keeps
|
|
8
|
+
// one height (420px) and its output scrolls, staying on the newest line unless the
|
|
9
|
+
// reader has scrolled up. Inputs mirror the React props; React callbacks become
|
|
10
|
+
// @Output EventEmitters.
|
|
11
|
+
//
|
|
12
|
+
// Icon substitutions (documented per the brief): the React source uses `term`,
|
|
13
|
+
// `stop`, `copy`, `check`, `chev-d`, `edit`, `spark`, `ok` and `alert` — all of
|
|
14
|
+
// which exist in the Angular icon set, so no substitution was needed.
|
|
15
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
16
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
const TONE = { ok: 'vo-ok', bad: 'vo-bad', muted: 'vo-mu' };
|
|
19
|
+
const lineOf = (l) => typeof l === 'string' ? { text: l, tone: undefined } : l;
|
|
20
|
+
export class TerminalStreamComponent {
|
|
21
|
+
constructor() {
|
|
22
|
+
/** The working directory, shown in the header, like "~/acme/web". */
|
|
23
|
+
this.cwd = '';
|
|
24
|
+
/** Commands, notes and edits, oldest first. */
|
|
25
|
+
this.entries = [];
|
|
26
|
+
/** How many lines a folded output keeps showing. */
|
|
27
|
+
this.tail = 4;
|
|
28
|
+
/** Whether the output has been copied (shows the Copied tooltip/check). */
|
|
29
|
+
this.copied = false;
|
|
30
|
+
/** Overrides for the labels. */
|
|
31
|
+
this.labels = {};
|
|
32
|
+
/** Emitted by the Stop button while the run is going. */
|
|
33
|
+
this.stop = new EventEmitter();
|
|
34
|
+
/** Emitted with the whole run as text when it is copied. */
|
|
35
|
+
this.copy = new EventEmitter();
|
|
36
|
+
/** Which folded commands (by entry index) are open. */
|
|
37
|
+
this.open = new Set();
|
|
38
|
+
this.pinned = true;
|
|
39
|
+
}
|
|
40
|
+
get L() {
|
|
41
|
+
return {
|
|
42
|
+
running: 'Running',
|
|
43
|
+
passed: 'Passed',
|
|
44
|
+
failed: 'Failed',
|
|
45
|
+
stopped: 'Stopped',
|
|
46
|
+
stop: 'Stop',
|
|
47
|
+
copy: 'Copy',
|
|
48
|
+
copied: 'Copied to clipboard',
|
|
49
|
+
more: (n) => `Show ${n} more line${n === 1 ? '' : 's'}`,
|
|
50
|
+
fewer: 'Show fewer lines',
|
|
51
|
+
edit: 'Edit',
|
|
52
|
+
...this.labels,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
get hasStop() {
|
|
56
|
+
return this.stop.observed;
|
|
57
|
+
}
|
|
58
|
+
get commands() {
|
|
59
|
+
return this.entries.filter((e) => this.kindOf(e) === 'command');
|
|
60
|
+
}
|
|
61
|
+
get state() {
|
|
62
|
+
if (this.status)
|
|
63
|
+
return this.status;
|
|
64
|
+
const busy = this.entries.some((e) => this.kindOf(e) !== 'note' && e.status === 'running');
|
|
65
|
+
if (busy)
|
|
66
|
+
return 'running';
|
|
67
|
+
const last = this.commands[this.commands.length - 1];
|
|
68
|
+
return last?.status === 'failed'
|
|
69
|
+
? 'failed'
|
|
70
|
+
: last?.status === 'stopped'
|
|
71
|
+
? 'stopped'
|
|
72
|
+
: 'passed';
|
|
73
|
+
}
|
|
74
|
+
get running() {
|
|
75
|
+
return this.state === 'running';
|
|
76
|
+
}
|
|
77
|
+
get stateLabel() {
|
|
78
|
+
return this.L[this.state];
|
|
79
|
+
}
|
|
80
|
+
get foot() {
|
|
81
|
+
if (this.summary !== undefined)
|
|
82
|
+
return this.summary;
|
|
83
|
+
const n = new Set(this.commands.map((c) => c.command)).size;
|
|
84
|
+
return [`${n} command${n === 1 ? '' : 's'}`, this.elapsed, this.state]
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.join(' · ');
|
|
87
|
+
}
|
|
88
|
+
kindOf(e) {
|
|
89
|
+
if (e.kind === 'note')
|
|
90
|
+
return 'note';
|
|
91
|
+
if (e.kind === 'edit')
|
|
92
|
+
return 'edit';
|
|
93
|
+
return 'command';
|
|
94
|
+
}
|
|
95
|
+
asNote(e) {
|
|
96
|
+
return e;
|
|
97
|
+
}
|
|
98
|
+
asEdit(e) {
|
|
99
|
+
return e;
|
|
100
|
+
}
|
|
101
|
+
asCommand(e) {
|
|
102
|
+
return e;
|
|
103
|
+
}
|
|
104
|
+
dataS(e) {
|
|
105
|
+
return e.status === 'running'
|
|
106
|
+
? 'run'
|
|
107
|
+
: e.status === 'ok'
|
|
108
|
+
? 'ok'
|
|
109
|
+
: e.status === 'failed'
|
|
110
|
+
? 'bad'
|
|
111
|
+
: 'stop';
|
|
112
|
+
}
|
|
113
|
+
out(e) {
|
|
114
|
+
return e.output ?? [];
|
|
115
|
+
}
|
|
116
|
+
folds(e) {
|
|
117
|
+
return this.out(e).length > this.tail + 1;
|
|
118
|
+
}
|
|
119
|
+
hidden(e) {
|
|
120
|
+
const o = this.out(e);
|
|
121
|
+
return this.folds(e) ? o.slice(0, o.length - this.tail) : [];
|
|
122
|
+
}
|
|
123
|
+
shown(e) {
|
|
124
|
+
const o = this.out(e);
|
|
125
|
+
return this.folds(e) ? o.slice(o.length - this.tail) : o;
|
|
126
|
+
}
|
|
127
|
+
lineText(l) {
|
|
128
|
+
return lineOf(l).text;
|
|
129
|
+
}
|
|
130
|
+
toneClass(l) {
|
|
131
|
+
const tone = lineOf(l).tone;
|
|
132
|
+
return tone ? TONE[tone] : '';
|
|
133
|
+
}
|
|
134
|
+
more(n) {
|
|
135
|
+
return this.L.more(n);
|
|
136
|
+
}
|
|
137
|
+
toggle(i) {
|
|
138
|
+
if (this.open.has(i))
|
|
139
|
+
this.open.delete(i);
|
|
140
|
+
else
|
|
141
|
+
this.open.add(i);
|
|
142
|
+
}
|
|
143
|
+
text() {
|
|
144
|
+
return this.entries
|
|
145
|
+
.flatMap((e) => {
|
|
146
|
+
if (this.kindOf(e) === 'note')
|
|
147
|
+
return ['# ' + this.asNote(e).text];
|
|
148
|
+
if (this.kindOf(e) === 'edit') {
|
|
149
|
+
const ed = this.asEdit(e);
|
|
150
|
+
const counts = ed.added !== undefined || ed.removed !== undefined
|
|
151
|
+
? ` (+${ed.added ?? 0} −${ed.removed ?? 0})`
|
|
152
|
+
: '';
|
|
153
|
+
const diff = ed.status === 'done' || ed.status === undefined ? ed.diff ?? [] : [];
|
|
154
|
+
return [`# ${this.L.edit} ${ed.file}${counts}`, ...diff];
|
|
155
|
+
}
|
|
156
|
+
const cmd = this.asCommand(e);
|
|
157
|
+
return ['$ ' + cmd.command, ...(cmd.output ?? []).map((l) => lineOf(l).text)];
|
|
158
|
+
})
|
|
159
|
+
.join('\n');
|
|
160
|
+
}
|
|
161
|
+
copyAll() {
|
|
162
|
+
this.copy.emit(this.text());
|
|
163
|
+
}
|
|
164
|
+
onScroll() {
|
|
165
|
+
const el = this.bodyRef?.nativeElement;
|
|
166
|
+
if (!el)
|
|
167
|
+
return;
|
|
168
|
+
this.pinned = el.scrollTop + el.clientHeight >= el.scrollHeight - 24;
|
|
169
|
+
}
|
|
170
|
+
// new output keeps the log on its newest line, unless the reader has scrolled up
|
|
171
|
+
ngAfterViewInit() {
|
|
172
|
+
const el = this.bodyRef?.nativeElement;
|
|
173
|
+
if (!el)
|
|
174
|
+
return;
|
|
175
|
+
const stick = () => {
|
|
176
|
+
if (this.pinned)
|
|
177
|
+
el.scrollTop = el.scrollHeight;
|
|
178
|
+
};
|
|
179
|
+
this.mo = new MutationObserver(stick);
|
|
180
|
+
this.mo.observe(el, { childList: true, subtree: true, characterData: true });
|
|
181
|
+
if (typeof ResizeObserver === 'function') {
|
|
182
|
+
this.ro = new ResizeObserver(stick);
|
|
183
|
+
this.ro.observe(el);
|
|
184
|
+
}
|
|
185
|
+
stick();
|
|
186
|
+
}
|
|
187
|
+
ngOnDestroy() {
|
|
188
|
+
this.mo?.disconnect();
|
|
189
|
+
this.ro?.disconnect();
|
|
190
|
+
}
|
|
191
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TerminalStreamComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
192
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TerminalStreamComponent, isStandalone: true, selector: "vo-terminal-stream", inputs: { cwd: "cwd", entries: "entries", status: "status", elapsed: "elapsed", summary: "summary", tail: "tail", copied: "copied", labels: "labels", className: "className" }, outputs: { stop: "stop", copy: "copy" }, viewQueries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }], ngImport: i0, template: `
|
|
193
|
+
<div
|
|
194
|
+
data-vo=""
|
|
195
|
+
[class]="className ? 'vo-tmx vo-panel ' + className : 'vo-tmx vo-panel'"
|
|
196
|
+
[class.vo-live]="running"
|
|
197
|
+
style="container-type: inline-size"
|
|
198
|
+
>
|
|
199
|
+
<div class="vo-tmx-h">
|
|
200
|
+
<span class="vo-tmx-ic"><vo-icon name="term"></vo-icon></span>
|
|
201
|
+
<span class="vo-tmx-cwd">{{ cwd }}</span>
|
|
202
|
+
<span
|
|
203
|
+
class="vo-tmx-st"
|
|
204
|
+
[class.vo-ok]="state === 'passed'"
|
|
205
|
+
[class.vo-bad]="state === 'failed'"
|
|
206
|
+
>
|
|
207
|
+
<span class="vo-g">
|
|
208
|
+
@if (running) {
|
|
209
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
210
|
+
} @else {
|
|
211
|
+
<vo-icon [name]="state === 'passed' ? 'check' : 'stop'" size="xs"></vo-icon>
|
|
212
|
+
}
|
|
213
|
+
</span>
|
|
214
|
+
<span class="vo-tmx-sv vo-num">
|
|
215
|
+
@if (running) {
|
|
216
|
+
{{ elapsed ? L.running + ' · ' + elapsed : L.running }}
|
|
217
|
+
} @else {
|
|
218
|
+
{{ stateLabel }}
|
|
219
|
+
}
|
|
220
|
+
</span>
|
|
221
|
+
</span>
|
|
222
|
+
<span class="vo-sp"></span>
|
|
223
|
+
@if (running && hasStop) {
|
|
224
|
+
<button
|
|
225
|
+
type="button"
|
|
226
|
+
class="vo-pill vo-ghost vo-sm vo-tmx-stop"
|
|
227
|
+
aria-label="Stop the running command"
|
|
228
|
+
(click)="stop.emit()"
|
|
229
|
+
>
|
|
230
|
+
<vo-icon name="stop" size="xs"></vo-icon>{{ L.stop }}
|
|
231
|
+
</button>
|
|
232
|
+
}
|
|
233
|
+
<button
|
|
234
|
+
type="button"
|
|
235
|
+
class="vo-ib vo-tmx-cp"
|
|
236
|
+
[class.vo-copied]="copied"
|
|
237
|
+
aria-label="Copy the output"
|
|
238
|
+
(click)="copyAll()"
|
|
239
|
+
>
|
|
240
|
+
<vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon>
|
|
241
|
+
</button>
|
|
242
|
+
</div>
|
|
243
|
+
|
|
244
|
+
<div
|
|
245
|
+
#body
|
|
246
|
+
class="vo-tmx-body"
|
|
247
|
+
role="log"
|
|
248
|
+
aria-label="Terminal output"
|
|
249
|
+
tabindex="0"
|
|
250
|
+
(scroll)="onScroll()"
|
|
251
|
+
>
|
|
252
|
+
@for (e of entries; track $index; let i = $index) {
|
|
253
|
+
@switch (kindOf(e)) {
|
|
254
|
+
@case ('note') {
|
|
255
|
+
<div class="vo-tmx-note">
|
|
256
|
+
<vo-icon name="spark" size="xs"></vo-icon>
|
|
257
|
+
<span [class.vo-shim]="running && i === entries.length - 1">{{ asNote(e).text }}</span>
|
|
258
|
+
</div>
|
|
259
|
+
}
|
|
260
|
+
@case ('edit') {
|
|
261
|
+
<div class="vo-tmx-blk" [attr.data-s]="asEdit(e).status === 'stopped' ? 'stop' : 'edit'">
|
|
262
|
+
<div class="vo-tmx-cmd">
|
|
263
|
+
<span class="vo-tmx-p"><vo-icon name="edit" size="xs"></vo-icon></span>
|
|
264
|
+
<span class="vo-tmx-c">{{ L.edit }} {{ asEdit(e).file }}</span>
|
|
265
|
+
<span class="vo-tmx-m">
|
|
266
|
+
@if (asEdit(e).status === 'running') {
|
|
267
|
+
<span class="vo-g"><span class="vo-spin" aria-hidden="true"></span></span>
|
|
268
|
+
} @else if (asEdit(e).status === 'stopped') {
|
|
269
|
+
<span class="vo-g"><span class="vo-tag">{{ L.stopped }}</span></span>
|
|
270
|
+
} @else {
|
|
271
|
+
@if (asEdit(e).added !== undefined) {
|
|
272
|
+
<span class="vo-add">+{{ asEdit(e).added }}</span>
|
|
273
|
+
}
|
|
274
|
+
@if (asEdit(e).removed !== undefined) {
|
|
275
|
+
<span class="vo-del">−{{ asEdit(e).removed }}</span>
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
</span>
|
|
279
|
+
</div>
|
|
280
|
+
@if (
|
|
281
|
+
asEdit(e).status !== 'running' &&
|
|
282
|
+
asEdit(e).status !== 'stopped' &&
|
|
283
|
+
asEdit(e).diff &&
|
|
284
|
+
asEdit(e).diff!.length > 0
|
|
285
|
+
) {
|
|
286
|
+
<div class="vo-tmx-df">
|
|
287
|
+
@for (d of asEdit(e).diff; track $index) {
|
|
288
|
+
<div [class.vo-a]="d[0] === '+'" [class.vo-d]="d[0] === '-'">{{ d }}</div>
|
|
289
|
+
}
|
|
290
|
+
</div>
|
|
291
|
+
}
|
|
292
|
+
</div>
|
|
293
|
+
}
|
|
294
|
+
@default {
|
|
295
|
+
<div
|
|
296
|
+
class="vo-tmx-blk"
|
|
297
|
+
[attr.data-s]="dataS(asCommand(e))"
|
|
298
|
+
>
|
|
299
|
+
<div class="vo-tmx-cmd">
|
|
300
|
+
<span class="vo-tmx-p">$</span>
|
|
301
|
+
<span class="vo-tmx-c">{{ asCommand(e).command }}</span>
|
|
302
|
+
<span class="vo-tmx-m">
|
|
303
|
+
<span class="vo-g">
|
|
304
|
+
@switch (asCommand(e).status) {
|
|
305
|
+
@case ('running') {
|
|
306
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
307
|
+
}
|
|
308
|
+
@case ('ok') {
|
|
309
|
+
<span class="vo-ok"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
310
|
+
}
|
|
311
|
+
@case ('failed') {
|
|
312
|
+
<span class="vo-tag vo-bad">Exit {{ asCommand(e).exitCode ?? 1 }}</span>
|
|
313
|
+
}
|
|
314
|
+
@default {
|
|
315
|
+
<span class="vo-tag">{{ L.stopped }}</span>
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
</span>
|
|
319
|
+
@if (asCommand(e).duration) {
|
|
320
|
+
<span class="vo-t vo-num">{{ asCommand(e).duration }}</span>
|
|
321
|
+
}
|
|
322
|
+
</span>
|
|
323
|
+
</div>
|
|
324
|
+
@if (folds(asCommand(e))) {
|
|
325
|
+
<button
|
|
326
|
+
type="button"
|
|
327
|
+
class="vo-tmx-more"
|
|
328
|
+
[attr.aria-expanded]="open.has(i)"
|
|
329
|
+
(click)="toggle(i)"
|
|
330
|
+
>
|
|
331
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
332
|
+
<span>{{ open.has(i) ? L.fewer : more(hidden(asCommand(e)).length) }}</span>
|
|
333
|
+
</button>
|
|
334
|
+
<div class="vo-fold" [class.vo-shut]="!open.has(i)">
|
|
335
|
+
<div>
|
|
336
|
+
<div class="vo-tmx-o">
|
|
337
|
+
@for (l of hidden(asCommand(e)); track $index) {
|
|
338
|
+
<div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
|
|
339
|
+
}
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
</div>
|
|
343
|
+
}
|
|
344
|
+
@if (shown(asCommand(e)).length > 0) {
|
|
345
|
+
<div class="vo-tmx-o">
|
|
346
|
+
@for (l of shown(asCommand(e)); track $index) {
|
|
347
|
+
<div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
|
|
348
|
+
}
|
|
349
|
+
</div>
|
|
350
|
+
}
|
|
351
|
+
</div>
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
</div>
|
|
356
|
+
|
|
357
|
+
<div class="vo-fold vo-tmx-ff" [class.vo-shut]="running || foot === false">
|
|
358
|
+
<div>
|
|
359
|
+
<div
|
|
360
|
+
class="vo-tmx-f"
|
|
361
|
+
[class.vo-stop]="state === 'stopped'"
|
|
362
|
+
[class.vo-bad]="state === 'failed'"
|
|
363
|
+
>
|
|
364
|
+
<span class="vo-g">
|
|
365
|
+
<vo-icon [name]="state === 'passed' ? 'ok' : state === 'failed' ? 'alert' : 'stop'"></vo-icon>
|
|
366
|
+
</span>
|
|
367
|
+
<span class="vo-tmx-fs vo-num">{{ foot || '' }}</span>
|
|
368
|
+
</div>
|
|
369
|
+
</div>
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
`, isInline: true, styles: [".vo-tmx{overflow:hidden;display:flex;flex-direction:column;height:420px}.vo-tmx-h{display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-tmx-ic{display:grid;place-items:center;color:var(--vo-fg2);flex:none}.vo-tmx-cwd{min-width:0;flex:0 1 auto;font-family:var(--vo-mono);font-size:12px;color:var(--vo-fg2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-st{display:inline-flex;align-items:center;gap:6px;min-width:0;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-tmx-st .vo-g{display:grid;place-items:center;flex:none}.vo-tmx-st .vo-spin{width:10px;height:10px}.vo-tmx-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-tmx-h .vo-sp{flex:1}.vo-tmx-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:var(--vo-s-2) 0;font-family:var(--vo-mono);font-size:12px;line-height:1.8;scrollbar-width:thin;scrollbar-color:var(--vo-rail) transparent}.vo-tmx-body::-webkit-scrollbar{width:8px}.vo-tmx-body::-webkit-scrollbar-track{background:transparent}.vo-tmx-body::-webkit-scrollbar-thumb{background:var(--vo-rail);border:2px solid transparent;background-clip:padding-box;border-radius:var(--vo-r-pill)}:root:not([data-style=soft]) .vo-tmx-body:not(:where([data-style=soft],[data-style=soft] *))::-webkit-scrollbar-thumb{border-radius:0}.vo-tmx-blk+.vo-tmx-blk{margin-top:var(--vo-s-1)}.vo-tmx-cmd{display:flex;align-items:center;gap:var(--vo-s-2);padding:0 14px}.vo-tmx-p{width:12px;flex:none;display:grid;place-items:center;color:var(--vo-muted)}.vo-tmx-c{flex:1;min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-m{display:inline-flex;align-items:center;gap:6px;font-family:var(--vo-sans);font-size:12px;color:var(--vo-muted);white-space:nowrap;flex:none}.vo-tmx-m .vo-g{display:grid;place-items:center}.vo-tmx-m .vo-spin{width:10px;height:10px}.vo-tmx-m .vo-ok{color:var(--vo-ok)}.vo-tmx-m .vo-add{color:var(--vo-add)}.vo-tmx-m .vo-del{color:var(--vo-del)}.vo-tmx-o{padding:0 14px 0 34px;color:var(--vo-fg2);white-space:pre-wrap;overflow-wrap:anywhere}.vo-tmx-l.vo-ok{color:var(--vo-ok)}.vo-tmx-l.vo-bad{color:var(--vo-bad)}.vo-tmx-l.vo-mu{color:var(--vo-muted)}.vo-tmx-more{display:flex;align-items:center;gap:6px;margin-left:34px;font-family:var(--vo-sans);font-size:12px;line-height:inherit;color:var(--vo-muted);transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-tmx-more:hover{color:var(--vo-fg)}}.vo-tmx-more svg{transition:transform var(--vo-t) var(--vo-ease)}.vo-tmx-more[aria-expanded=true] svg{transform:rotate(180deg)}.vo-tmx-blk .vo-fold.vo-shut>div{visibility:hidden;transition:visibility 0s var(--vo-t)}.vo-tmx-note{margin:var(--vo-s-2) 14px;padding-left:20px;font-family:var(--vo-sans);font-size:12.5px;line-height:1.5;color:var(--vo-fg2);display:flex;gap:var(--vo-s-2)}.vo-tmx-note>svg{color:var(--vo-accent-fg,var(--vo-accent));flex:none;margin-top:3px}.vo-tmx-note .vo-shim{font-size:inherit}.vo-tmx-f{display:flex;align-items:center;gap:var(--vo-s-2);padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-tmx-f .vo-g{display:grid;place-items:center;flex:none;color:var(--vo-ok)}.vo-tmx-f.vo-stop .vo-g{color:var(--vo-muted)}.vo-tmx-f.vo-bad .vo-g{color:var(--vo-bad)}.vo-tmx-st{height:22px;padding:0 var(--vo-s-2);border-radius:var(--vo-r-tag);background:var(--vo-chip);color:var(--vo-fg2);transition:background .3s,color .3s}.vo-tmx.vo-live .vo-tmx-st{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-fg))}.vo-tmx-st.vo-ok,.vo-tmx-st.vo-ok .vo-g{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tmx-st.vo-bad,.vo-tmx-st.vo-bad .vo-g{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-tmx-h{position:relative}.vo-tmx-h:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:linear-gradient(90deg,transparent,var(--vo-accent-mark,var(--vo-accent)),transparent) 0 0/40% 100% no-repeat;opacity:0;transition:opacity .4s;pointer-events:none}.vo-tmx.vo-live .vo-tmx-h:after{opacity:1;animation:vo-tmxsweep 1.8s var(--vo-ease-io) infinite}@keyframes vo-tmxsweep{0%{background-position:-60% 0}to{background-position:160% 0}}.vo-tmx-blk{position:relative}.vo-tmx-blk:before{content:\"\";position:absolute;left:6px;top:4px;bottom:4px;width:2px;border-radius:1px;background:var(--vo-rail);transition:background .3s}.vo-tmx-blk[data-s=run]:before{background:var(--vo-accent-mark,var(--vo-accent));animation:vo-tmxpulse 1.4s var(--vo-ease-io) infinite}.vo-tmx-blk[data-s=ok]:before{background:color-mix(in srgb,var(--vo-ok) 70%,transparent)}.vo-tmx-blk[data-s=bad]:before{background:var(--vo-bad)}.vo-tmx-blk[data-s=edit]:before{background:var(--vo-merge)}@keyframes vo-tmxpulse{50%{opacity:.35}}.vo-tmx-p{color:var(--vo-accent-fg,var(--vo-fg));font-weight:500}.vo-tmx-blk[data-s=edit] .vo-tmx-p{color:var(--vo-merge)}.vo-tmx-df{margin:2px 14px var(--vo-s-1) 34px;border-radius:var(--vo-r-sm);overflow:hidden}.vo-tmx-df div{padding:0 var(--vo-s-2);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--vo-fg2)}.vo-tmx-df .vo-a{background:color-mix(in srgb,var(--vo-add) 10%,transparent)}.vo-tmx-df .vo-a:first-letter{color:var(--vo-add)}.vo-tmx-df .vo-d{background:color-mix(in srgb,var(--vo-del) 10%,transparent)}.vo-tmx-df .vo-d:first-letter{color:var(--vo-del)}.vo-tmx.vo-live .vo-tmx-body:after{content:\"\";display:block;width:7px;height:14px;margin:var(--vo-s-1) 0 0 34px;background:var(--vo-fg2);animation:vo-bpblink 1.1s steps(1,end) infinite}:root:not([data-style=soft]) .vo-tmx-h:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(90deg,var(--vo-accent-mark) 0 6px,transparent 6px 12px);animation:vo-tmxmarch .6s steps(4) infinite}@keyframes vo-tmxmarch{to{background-position:12px 0}}:root:not([data-style=soft]) .vo-tmx-blk:not(:where([data-style=soft],[data-style=soft] *)):before{width:1px}:root:not([data-style=soft]) .vo-tmx-blk[data-s=run]:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-bpblink 1.1s steps(1,end) infinite}@keyframes vo-bpblink{50%{opacity:0}}@container (max-width:420px){.vo-tmx-ic{display:none}.vo-tmx-h{padding-left:var(--vo-s-3)}.vo-tmx-cmd,.vo-tmx-o{padding:0 var(--vo-s-3)}.vo-tmx-more{margin-left:var(--vo-s-3)}.vo-tmx-note{margin-inline:var(--vo-s-3)}.vo-tmx-f{padding-inline:var(--vo-s-3)}.vo-tmx-df{margin-left:var(--vo-s-3);margin-right:var(--vo-s-3)}.vo-tmx-blk:before{left:3px}.vo-tmx.vo-live .vo-tmx-body:after{margin-left:var(--vo-s-3)}}@media (prefers-reduced-motion:reduce){.vo-tmx.vo-live .vo-tmx-h:after,.vo-tmx-blk[data-s=run]:before,.vo-tmx.vo-live .vo-tmx-body:after{animation:none}}.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-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-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.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-ib.vo-copied{color:var(--vo-ok)}.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-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}@media (prefers-reduced-motion:reduce){.vo-spin{animation:none}.vo-shim{color:var(--vo-fg);background:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
373
|
+
}
|
|
374
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TerminalStreamComponent, decorators: [{
|
|
375
|
+
type: Component,
|
|
376
|
+
args: [{ selector: 'vo-terminal-stream', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
377
|
+
<div
|
|
378
|
+
data-vo=""
|
|
379
|
+
[class]="className ? 'vo-tmx vo-panel ' + className : 'vo-tmx vo-panel'"
|
|
380
|
+
[class.vo-live]="running"
|
|
381
|
+
style="container-type: inline-size"
|
|
382
|
+
>
|
|
383
|
+
<div class="vo-tmx-h">
|
|
384
|
+
<span class="vo-tmx-ic"><vo-icon name="term"></vo-icon></span>
|
|
385
|
+
<span class="vo-tmx-cwd">{{ cwd }}</span>
|
|
386
|
+
<span
|
|
387
|
+
class="vo-tmx-st"
|
|
388
|
+
[class.vo-ok]="state === 'passed'"
|
|
389
|
+
[class.vo-bad]="state === 'failed'"
|
|
390
|
+
>
|
|
391
|
+
<span class="vo-g">
|
|
392
|
+
@if (running) {
|
|
393
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
394
|
+
} @else {
|
|
395
|
+
<vo-icon [name]="state === 'passed' ? 'check' : 'stop'" size="xs"></vo-icon>
|
|
396
|
+
}
|
|
397
|
+
</span>
|
|
398
|
+
<span class="vo-tmx-sv vo-num">
|
|
399
|
+
@if (running) {
|
|
400
|
+
{{ elapsed ? L.running + ' · ' + elapsed : L.running }}
|
|
401
|
+
} @else {
|
|
402
|
+
{{ stateLabel }}
|
|
403
|
+
}
|
|
404
|
+
</span>
|
|
405
|
+
</span>
|
|
406
|
+
<span class="vo-sp"></span>
|
|
407
|
+
@if (running && hasStop) {
|
|
408
|
+
<button
|
|
409
|
+
type="button"
|
|
410
|
+
class="vo-pill vo-ghost vo-sm vo-tmx-stop"
|
|
411
|
+
aria-label="Stop the running command"
|
|
412
|
+
(click)="stop.emit()"
|
|
413
|
+
>
|
|
414
|
+
<vo-icon name="stop" size="xs"></vo-icon>{{ L.stop }}
|
|
415
|
+
</button>
|
|
416
|
+
}
|
|
417
|
+
<button
|
|
418
|
+
type="button"
|
|
419
|
+
class="vo-ib vo-tmx-cp"
|
|
420
|
+
[class.vo-copied]="copied"
|
|
421
|
+
aria-label="Copy the output"
|
|
422
|
+
(click)="copyAll()"
|
|
423
|
+
>
|
|
424
|
+
<vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon>
|
|
425
|
+
</button>
|
|
426
|
+
</div>
|
|
427
|
+
|
|
428
|
+
<div
|
|
429
|
+
#body
|
|
430
|
+
class="vo-tmx-body"
|
|
431
|
+
role="log"
|
|
432
|
+
aria-label="Terminal output"
|
|
433
|
+
tabindex="0"
|
|
434
|
+
(scroll)="onScroll()"
|
|
435
|
+
>
|
|
436
|
+
@for (e of entries; track $index; let i = $index) {
|
|
437
|
+
@switch (kindOf(e)) {
|
|
438
|
+
@case ('note') {
|
|
439
|
+
<div class="vo-tmx-note">
|
|
440
|
+
<vo-icon name="spark" size="xs"></vo-icon>
|
|
441
|
+
<span [class.vo-shim]="running && i === entries.length - 1">{{ asNote(e).text }}</span>
|
|
442
|
+
</div>
|
|
443
|
+
}
|
|
444
|
+
@case ('edit') {
|
|
445
|
+
<div class="vo-tmx-blk" [attr.data-s]="asEdit(e).status === 'stopped' ? 'stop' : 'edit'">
|
|
446
|
+
<div class="vo-tmx-cmd">
|
|
447
|
+
<span class="vo-tmx-p"><vo-icon name="edit" size="xs"></vo-icon></span>
|
|
448
|
+
<span class="vo-tmx-c">{{ L.edit }} {{ asEdit(e).file }}</span>
|
|
449
|
+
<span class="vo-tmx-m">
|
|
450
|
+
@if (asEdit(e).status === 'running') {
|
|
451
|
+
<span class="vo-g"><span class="vo-spin" aria-hidden="true"></span></span>
|
|
452
|
+
} @else if (asEdit(e).status === 'stopped') {
|
|
453
|
+
<span class="vo-g"><span class="vo-tag">{{ L.stopped }}</span></span>
|
|
454
|
+
} @else {
|
|
455
|
+
@if (asEdit(e).added !== undefined) {
|
|
456
|
+
<span class="vo-add">+{{ asEdit(e).added }}</span>
|
|
457
|
+
}
|
|
458
|
+
@if (asEdit(e).removed !== undefined) {
|
|
459
|
+
<span class="vo-del">−{{ asEdit(e).removed }}</span>
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
</span>
|
|
463
|
+
</div>
|
|
464
|
+
@if (
|
|
465
|
+
asEdit(e).status !== 'running' &&
|
|
466
|
+
asEdit(e).status !== 'stopped' &&
|
|
467
|
+
asEdit(e).diff &&
|
|
468
|
+
asEdit(e).diff!.length > 0
|
|
469
|
+
) {
|
|
470
|
+
<div class="vo-tmx-df">
|
|
471
|
+
@for (d of asEdit(e).diff; track $index) {
|
|
472
|
+
<div [class.vo-a]="d[0] === '+'" [class.vo-d]="d[0] === '-'">{{ d }}</div>
|
|
473
|
+
}
|
|
474
|
+
</div>
|
|
475
|
+
}
|
|
476
|
+
</div>
|
|
477
|
+
}
|
|
478
|
+
@default {
|
|
479
|
+
<div
|
|
480
|
+
class="vo-tmx-blk"
|
|
481
|
+
[attr.data-s]="dataS(asCommand(e))"
|
|
482
|
+
>
|
|
483
|
+
<div class="vo-tmx-cmd">
|
|
484
|
+
<span class="vo-tmx-p">$</span>
|
|
485
|
+
<span class="vo-tmx-c">{{ asCommand(e).command }}</span>
|
|
486
|
+
<span class="vo-tmx-m">
|
|
487
|
+
<span class="vo-g">
|
|
488
|
+
@switch (asCommand(e).status) {
|
|
489
|
+
@case ('running') {
|
|
490
|
+
<span class="vo-spin" aria-hidden="true"></span>
|
|
491
|
+
}
|
|
492
|
+
@case ('ok') {
|
|
493
|
+
<span class="vo-ok"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
494
|
+
}
|
|
495
|
+
@case ('failed') {
|
|
496
|
+
<span class="vo-tag vo-bad">Exit {{ asCommand(e).exitCode ?? 1 }}</span>
|
|
497
|
+
}
|
|
498
|
+
@default {
|
|
499
|
+
<span class="vo-tag">{{ L.stopped }}</span>
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
</span>
|
|
503
|
+
@if (asCommand(e).duration) {
|
|
504
|
+
<span class="vo-t vo-num">{{ asCommand(e).duration }}</span>
|
|
505
|
+
}
|
|
506
|
+
</span>
|
|
507
|
+
</div>
|
|
508
|
+
@if (folds(asCommand(e))) {
|
|
509
|
+
<button
|
|
510
|
+
type="button"
|
|
511
|
+
class="vo-tmx-more"
|
|
512
|
+
[attr.aria-expanded]="open.has(i)"
|
|
513
|
+
(click)="toggle(i)"
|
|
514
|
+
>
|
|
515
|
+
<vo-icon name="chev-d" size="xs"></vo-icon>
|
|
516
|
+
<span>{{ open.has(i) ? L.fewer : more(hidden(asCommand(e)).length) }}</span>
|
|
517
|
+
</button>
|
|
518
|
+
<div class="vo-fold" [class.vo-shut]="!open.has(i)">
|
|
519
|
+
<div>
|
|
520
|
+
<div class="vo-tmx-o">
|
|
521
|
+
@for (l of hidden(asCommand(e)); track $index) {
|
|
522
|
+
<div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
|
|
523
|
+
}
|
|
524
|
+
</div>
|
|
525
|
+
</div>
|
|
526
|
+
</div>
|
|
527
|
+
}
|
|
528
|
+
@if (shown(asCommand(e)).length > 0) {
|
|
529
|
+
<div class="vo-tmx-o">
|
|
530
|
+
@for (l of shown(asCommand(e)); track $index) {
|
|
531
|
+
<div class="vo-tmx-l" [class]="toneClass(l)">{{ lineText(l) }}</div>
|
|
532
|
+
}
|
|
533
|
+
</div>
|
|
534
|
+
}
|
|
535
|
+
</div>
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
</div>
|
|
540
|
+
|
|
541
|
+
<div class="vo-fold vo-tmx-ff" [class.vo-shut]="running || foot === false">
|
|
542
|
+
<div>
|
|
543
|
+
<div
|
|
544
|
+
class="vo-tmx-f"
|
|
545
|
+
[class.vo-stop]="state === 'stopped'"
|
|
546
|
+
[class.vo-bad]="state === 'failed'"
|
|
547
|
+
>
|
|
548
|
+
<span class="vo-g">
|
|
549
|
+
<vo-icon [name]="state === 'passed' ? 'ok' : state === 'failed' ? 'alert' : 'stop'"></vo-icon>
|
|
550
|
+
</span>
|
|
551
|
+
<span class="vo-tmx-fs vo-num">{{ foot || '' }}</span>
|
|
552
|
+
</div>
|
|
553
|
+
</div>
|
|
554
|
+
</div>
|
|
555
|
+
</div>
|
|
556
|
+
`, styles: [".vo-tmx{overflow:hidden;display:flex;flex-direction:column;height:420px}.vo-tmx-h{display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-tmx-ic{display:grid;place-items:center;color:var(--vo-fg2);flex:none}.vo-tmx-cwd{min-width:0;flex:0 1 auto;font-family:var(--vo-mono);font-size:12px;color:var(--vo-fg2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-st{display:inline-flex;align-items:center;gap:6px;min-width:0;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-tmx-st .vo-g{display:grid;place-items:center;flex:none}.vo-tmx-st .vo-spin{width:10px;height:10px}.vo-tmx-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-tmx-h .vo-sp{flex:1}.vo-tmx-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:var(--vo-s-2) 0;font-family:var(--vo-mono);font-size:12px;line-height:1.8;scrollbar-width:thin;scrollbar-color:var(--vo-rail) transparent}.vo-tmx-body::-webkit-scrollbar{width:8px}.vo-tmx-body::-webkit-scrollbar-track{background:transparent}.vo-tmx-body::-webkit-scrollbar-thumb{background:var(--vo-rail);border:2px solid transparent;background-clip:padding-box;border-radius:var(--vo-r-pill)}:root:not([data-style=soft]) .vo-tmx-body:not(:where([data-style=soft],[data-style=soft] *))::-webkit-scrollbar-thumb{border-radius:0}.vo-tmx-blk+.vo-tmx-blk{margin-top:var(--vo-s-1)}.vo-tmx-cmd{display:flex;align-items:center;gap:var(--vo-s-2);padding:0 14px}.vo-tmx-p{width:12px;flex:none;display:grid;place-items:center;color:var(--vo-muted)}.vo-tmx-c{flex:1;min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-tmx-m{display:inline-flex;align-items:center;gap:6px;font-family:var(--vo-sans);font-size:12px;color:var(--vo-muted);white-space:nowrap;flex:none}.vo-tmx-m .vo-g{display:grid;place-items:center}.vo-tmx-m .vo-spin{width:10px;height:10px}.vo-tmx-m .vo-ok{color:var(--vo-ok)}.vo-tmx-m .vo-add{color:var(--vo-add)}.vo-tmx-m .vo-del{color:var(--vo-del)}.vo-tmx-o{padding:0 14px 0 34px;color:var(--vo-fg2);white-space:pre-wrap;overflow-wrap:anywhere}.vo-tmx-l.vo-ok{color:var(--vo-ok)}.vo-tmx-l.vo-bad{color:var(--vo-bad)}.vo-tmx-l.vo-mu{color:var(--vo-muted)}.vo-tmx-more{display:flex;align-items:center;gap:6px;margin-left:34px;font-family:var(--vo-sans);font-size:12px;line-height:inherit;color:var(--vo-muted);transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-tmx-more:hover{color:var(--vo-fg)}}.vo-tmx-more svg{transition:transform var(--vo-t) var(--vo-ease)}.vo-tmx-more[aria-expanded=true] svg{transform:rotate(180deg)}.vo-tmx-blk .vo-fold.vo-shut>div{visibility:hidden;transition:visibility 0s var(--vo-t)}.vo-tmx-note{margin:var(--vo-s-2) 14px;padding-left:20px;font-family:var(--vo-sans);font-size:12.5px;line-height:1.5;color:var(--vo-fg2);display:flex;gap:var(--vo-s-2)}.vo-tmx-note>svg{color:var(--vo-accent-fg,var(--vo-accent));flex:none;margin-top:3px}.vo-tmx-note .vo-shim{font-size:inherit}.vo-tmx-f{display:flex;align-items:center;gap:var(--vo-s-2);padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-tmx-f .vo-g{display:grid;place-items:center;flex:none;color:var(--vo-ok)}.vo-tmx-f.vo-stop .vo-g{color:var(--vo-muted)}.vo-tmx-f.vo-bad .vo-g{color:var(--vo-bad)}.vo-tmx-st{height:22px;padding:0 var(--vo-s-2);border-radius:var(--vo-r-tag);background:var(--vo-chip);color:var(--vo-fg2);transition:background .3s,color .3s}.vo-tmx.vo-live .vo-tmx-st{background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-fg))}.vo-tmx-st.vo-ok,.vo-tmx-st.vo-ok .vo-g{background:var(--vo-ok-bg);color:var(--vo-ok)}.vo-tmx-st.vo-bad,.vo-tmx-st.vo-bad .vo-g{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-tmx-h{position:relative}.vo-tmx-h:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:linear-gradient(90deg,transparent,var(--vo-accent-mark,var(--vo-accent)),transparent) 0 0/40% 100% no-repeat;opacity:0;transition:opacity .4s;pointer-events:none}.vo-tmx.vo-live .vo-tmx-h:after{opacity:1;animation:vo-tmxsweep 1.8s var(--vo-ease-io) infinite}@keyframes vo-tmxsweep{0%{background-position:-60% 0}to{background-position:160% 0}}.vo-tmx-blk{position:relative}.vo-tmx-blk:before{content:\"\";position:absolute;left:6px;top:4px;bottom:4px;width:2px;border-radius:1px;background:var(--vo-rail);transition:background .3s}.vo-tmx-blk[data-s=run]:before{background:var(--vo-accent-mark,var(--vo-accent));animation:vo-tmxpulse 1.4s var(--vo-ease-io) infinite}.vo-tmx-blk[data-s=ok]:before{background:color-mix(in srgb,var(--vo-ok) 70%,transparent)}.vo-tmx-blk[data-s=bad]:before{background:var(--vo-bad)}.vo-tmx-blk[data-s=edit]:before{background:var(--vo-merge)}@keyframes vo-tmxpulse{50%{opacity:.35}}.vo-tmx-p{color:var(--vo-accent-fg,var(--vo-fg));font-weight:500}.vo-tmx-blk[data-s=edit] .vo-tmx-p{color:var(--vo-merge)}.vo-tmx-df{margin:2px 14px var(--vo-s-1) 34px;border-radius:var(--vo-r-sm);overflow:hidden}.vo-tmx-df div{padding:0 var(--vo-s-2);white-space:pre-wrap;overflow-wrap:anywhere;color:var(--vo-fg2)}.vo-tmx-df .vo-a{background:color-mix(in srgb,var(--vo-add) 10%,transparent)}.vo-tmx-df .vo-a:first-letter{color:var(--vo-add)}.vo-tmx-df .vo-d{background:color-mix(in srgb,var(--vo-del) 10%,transparent)}.vo-tmx-df .vo-d:first-letter{color:var(--vo-del)}.vo-tmx.vo-live .vo-tmx-body:after{content:\"\";display:block;width:7px;height:14px;margin:var(--vo-s-1) 0 0 34px;background:var(--vo-fg2);animation:vo-bpblink 1.1s steps(1,end) infinite}:root:not([data-style=soft]) .vo-tmx-h:not(:where([data-style=soft],[data-style=soft] *)):after{background:repeating-linear-gradient(90deg,var(--vo-accent-mark) 0 6px,transparent 6px 12px);animation:vo-tmxmarch .6s steps(4) infinite}@keyframes vo-tmxmarch{to{background-position:12px 0}}:root:not([data-style=soft]) .vo-tmx-blk:not(:where([data-style=soft],[data-style=soft] *)):before{width:1px}:root:not([data-style=soft]) .vo-tmx-blk[data-s=run]:not(:where([data-style=soft],[data-style=soft] *)):before{animation:vo-bpblink 1.1s steps(1,end) infinite}@keyframes vo-bpblink{50%{opacity:0}}@container (max-width:420px){.vo-tmx-ic{display:none}.vo-tmx-h{padding-left:var(--vo-s-3)}.vo-tmx-cmd,.vo-tmx-o{padding:0 var(--vo-s-3)}.vo-tmx-more{margin-left:var(--vo-s-3)}.vo-tmx-note{margin-inline:var(--vo-s-3)}.vo-tmx-f{padding-inline:var(--vo-s-3)}.vo-tmx-df{margin-left:var(--vo-s-3);margin-right:var(--vo-s-3)}.vo-tmx-blk:before{left:3px}.vo-tmx.vo-live .vo-tmx-body:after{margin-left:var(--vo-s-3)}}@media (prefers-reduced-motion:reduce){.vo-tmx.vo-live .vo-tmx-h:after,.vo-tmx-blk[data-s=run]:before,.vo-tmx.vo-live .vo-tmx-body:after{animation:none}}.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-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-bad{background:var(--vo-bad-bg);color:var(--vo-bad)}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}.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-ib.vo-copied{color:var(--vo-ok)}.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-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}@media (prefers-reduced-motion:reduce){.vo-spin{animation:none}.vo-shim{color:var(--vo-fg);background:none}}\n"] }]
|
|
557
|
+
}], propDecorators: { cwd: [{
|
|
558
|
+
type: Input
|
|
559
|
+
}], entries: [{
|
|
560
|
+
type: Input
|
|
561
|
+
}], status: [{
|
|
562
|
+
type: Input
|
|
563
|
+
}], elapsed: [{
|
|
564
|
+
type: Input
|
|
565
|
+
}], summary: [{
|
|
566
|
+
type: Input
|
|
567
|
+
}], tail: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], copied: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], labels: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], className: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], stop: [{
|
|
576
|
+
type: Output
|
|
577
|
+
}], copy: [{
|
|
578
|
+
type: Output
|
|
579
|
+
}], bodyRef: [{
|
|
580
|
+
type: ViewChild,
|
|
581
|
+
args: ['body']
|
|
582
|
+
}] } });
|
|
583
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYWwtc3RyZWFtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlcm1pbmFsLXN0cmVhbS90ZXJtaW5hbC1zdHJlYW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLGlGQUFpRjtBQUNqRixpRkFBaUY7QUFDakYsa0ZBQWtGO0FBQ2xGLG9GQUFvRjtBQUNwRixtRkFBbUY7QUFDbkYsZ0ZBQWdGO0FBQ2hGLHlCQUF5QjtBQUN6QixFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFFdEUsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7O0FBZ0UxRSxNQUFNLElBQUksR0FBaUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBRTFGLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBZSxFQUFvQixFQUFFLENBQ25ELE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBOEwzRCxNQUFNLE9BQU8sdUJBQXVCO0lBNUxwQztRQTZMRSxxRUFBcUU7UUFDNUQsUUFBRyxHQUFHLEVBQUUsQ0FBQztRQUVsQiwrQ0FBK0M7UUFDdEMsWUFBTyxHQUFvQixFQUFFLENBQUM7UUFXdkMsb0RBQW9EO1FBQzNDLFNBQUksR0FBRyxDQUFDLENBQUM7UUFFbEIsMkVBQTJFO1FBQ2xFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFeEIsZ0NBQWdDO1FBQ3ZCLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBSXJDLHlEQUF5RDtRQUMvQyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUxQyw0REFBNEQ7UUFDbEQsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFJNUMsdURBQXVEO1FBQzlDLFNBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRTFCLFdBQU0sR0FBRyxJQUFJLENBQUM7S0E2S3ZCO0lBektDLElBQUksQ0FBQztRQUNILE9BQU87WUFDTCxPQUFPLEVBQUUsU0FBUztZQUNsQixNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsUUFBUTtZQUNoQixPQUFPLEVBQUUsU0FBUztZQUNsQixJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxNQUFNO1lBQ1osTUFBTSxFQUFFLHFCQUFxQjtZQUM3QixJQUFJLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO1lBQy9ELEtBQUssRUFBRSxrQkFBa0I7WUFDekIsSUFBSSxFQUFFLE1BQU07WUFDWixHQUFHLElBQUksQ0FBQyxNQUFNO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFZLFFBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDeEIsQ0FBQyxDQUFDLEVBQXdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUM1QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLElBQUssQ0FBb0MsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUMvRixDQUFDO1FBQ0YsSUFBSSxJQUFJO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksRUFBRSxNQUFNLEtBQUssUUFBUTtZQUM5QixDQUFDLENBQUMsUUFBUTtZQUNWLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxLQUFLLFNBQVM7Z0JBQzFCLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ25FLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFnQjtRQUNyQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFnQjtRQUNyQixPQUFPLENBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFnQjtRQUNyQixPQUFPLENBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxDQUFnQjtRQUN4QixPQUFPLENBQW9CLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFrQjtRQUN0QixPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUztZQUMzQixDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUk7Z0JBQ2pCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVE7b0JBQ3JCLENBQUMsQ0FBQyxLQUFLO29CQUNQLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDakIsQ0FBQztJQUVPLEdBQUcsQ0FBQyxDQUFrQjtRQUM1QixPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBa0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLENBQWtCO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBa0I7UUFDdEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsUUFBUSxDQUFDLENBQWU7UUFDdEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxTQUFTLENBQUMsQ0FBZTtRQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDLENBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBUztRQUNkLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxJQUFJO1FBQ1YsT0FBTyxJQUFJLENBQUMsT0FBTzthQUNoQixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sTUFBTSxHQUNWLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssU0FBUztvQkFDaEQsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUc7b0JBQzVDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xGLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsaUZBQWlGO0lBQ2pGLGVBQWU7UUFDYixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztRQUN2QyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDaEIsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU07Z0JBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0UsSUFBSSxPQUFPLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3hCLENBQUM7K0dBbE5VLHVCQUF1QjttR0FBdkIsdUJBQXVCLHdZQXZMeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9MVCwra1NBckxTLGVBQWU7OzRGQXdMZCx1QkFBdUI7a0JBNUxuQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLGlCQUNELGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxlQUFlLENBQUMsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9MVDs4QkFLUSxHQUFHO3NCQUFYLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUdHLElBQUk7c0JBQVosS0FBSztnQkFHRyxNQUFNO3NCQUFkLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksSUFBSTtzQkFBYixNQUFNO2dCQUdHLElBQUk7c0JBQWIsTUFBTTtnQkFFb0IsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvdGVybWluYWwtc3RyZWFtL3Rlcm1pbmFsLXN0cmVhbS5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC90ZXJtaW5hbC1zdHJlYW0vVGVybWluYWxTdHJlYW0udHN4LlxuLy8gVGhlIHNoZWxsIGNvbW1hbmRzIGFuIGFnZW50IHJ1bnMsIGFzIGEgY29tcGFjdCB0ZXJtaW5hbDogdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4vLyBhbmQgaG93IHRoZSBydW4gaXMgZ29pbmcgaW4gdGhlIGhlYWRlciwgZWFjaCBjb21tYW5kIHdpdGggaXRzIG91dHB1dCBzdHJlYW1pbmdcbi8vIGluIHVuZGVyIGl0IGFuZCBhbiBleGl0IGNvZGUgb3IgYSBjaGVjayB3aXRoIGhvdyBsb25nIGl0IHRvb2ssIGFuZCBhIHN1bW1hcnkgYXRcbi8vIHRoZSBmb290IG9uY2UgaXQgaXMgb3Zlci4gTG9uZyBvdXRwdXQgZm9sZHMgdG8gaXRzIGxhc3QgbGluZXMuIFRoZSB0ZXJtaW5hbCBrZWVwc1xuLy8gb25lIGhlaWdodCAoNDIwcHgpIGFuZCBpdHMgb3V0cHV0IHNjcm9sbHMsIHN0YXlpbmcgb24gdGhlIG5ld2VzdCBsaW5lIHVubGVzcyB0aGVcbi8vIHJlYWRlciBoYXMgc2Nyb2xsZWQgdXAuIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyBSZWFjdCBjYWxsYmFja3MgYmVjb21lXG4vLyBAT3V0cHV0IEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gSWNvbiBzdWJzdGl0dXRpb25zIChkb2N1bWVudGVkIHBlciB0aGUgYnJpZWYpOiB0aGUgUmVhY3Qgc291cmNlIHVzZXMgYHRlcm1gLFxuLy8gYHN0b3BgLCBgY29weWAsIGBjaGVja2AsIGBjaGV2LWRgLCBgZWRpdGAsIGBzcGFya2AsIGBva2AgYW5kIGBhbGVydGAg4oCUIGFsbCBvZlxuLy8gd2hpY2ggZXhpc3QgaW4gdGhlIEFuZ3VsYXIgaWNvbiBzZXQsIHNvIG5vIHN1YnN0aXR1dGlvbiB3YXMgbmVlZGVkLlxuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCwgdHlwZSBWb0ljb25OYW1lIH0gZnJvbSAnLi4vY29yZS9pY29uLmNvbXBvbmVudCc7XG5cbi8qKiBvayBpcyBncmVlbiwgYmFkIGlzIHJlZCwgbXV0ZWQgaXMgZ3JleS4gKi9cbmV4cG9ydCB0eXBlIFRlcm1pbmFsVG9uZSA9ICdvaycgfCAnYmFkJyB8ICdtdXRlZCc7XG5cbi8qKiBBIGxpbmUgb2Ygb3V0cHV0LCBvciBgeyB0ZXh0LCB0b25lIH1gIHRvIGNvbG91ciBpdC4gKi9cbmV4cG9ydCB0eXBlIFRlcm1pbmFsTGluZSA9IHN0cmluZyB8IHsgdGV4dDogc3RyaW5nOyB0b25lPzogVGVybWluYWxUb25lIH07XG5cbi8qKiBydW5uaW5nIHNob3dzIGEgc3Bpbm5lcjsgb2sgYSBjaGVjazsgZmFpbGVkIGl0cyBleGl0IGNvZGUgaW4gcmVkOyBzdG9wcGVkIGEgU3RvcHBlZCB0YWcuICovXG5leHBvcnQgdHlwZSBUZXJtaW5hbENvbW1hbmRTdGF0dXMgPSAncnVubmluZycgfCAnb2snIHwgJ2ZhaWxlZCcgfCAnc3RvcHBlZCc7XG5cbi8qKiBBIHNoZWxsIGNvbW1hbmQgdGhlIGFnZW50IHJhbiwgd2l0aCBpdHMgc3RyZWFtZWQgb3V0cHV0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXJtaW5hbENvbW1hbmQge1xuICBraW5kPzogJ2NvbW1hbmQnO1xuICAvKiogTGlrZSBcIm5wbSBydW4gYnVpbGRcIi4gKi9cbiAgY29tbWFuZDogc3RyaW5nO1xuICAvKiogV2hhdCBpdCBwcmludGVkIHNvIGZhci4gTG9uZ2VyIHRoYW4gYHRhaWxgICsgMSBsaW5lcywgYWxsIGJ1dCB0aGUgbGFzdCBgdGFpbGAgZm9sZC4gKi9cbiAgb3V0cHV0PzogVGVybWluYWxMaW5lW107XG4gIHN0YXR1czogVGVybWluYWxDb21tYW5kU3RhdHVzO1xuICAvKiogU2hvd24gd2hlbiBpdCBmYWlsZWQsIGFzIFwiRXhpdCAxXCIuICovXG4gIGV4aXRDb2RlPzogbnVtYmVyO1xuICAvKiogSG93IGxvbmcgaXQgaGFzIHRha2VuLCBsaWtlIFwiNi4xIHNcIi4gKi9cbiAgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGxpbmUgZnJvbSB0aGUgYWdlbnQgYmV0d2VlbiBjb21tYW5kcywgbGlrZSB3aGF0IHdlbnQgd3JvbmcgYW5kIHdoYXQgaXQgd2lsbCBkbyBhYm91dCBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVybWluYWxOb3RlIHtcbiAga2luZDogJ25vdGUnO1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKiBBIGZpbGUgdGhlIGFnZW50IGVkaXRzIGJldHdlZW4gY29tbWFuZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlcm1pbmFsRWRpdCB7XG4gIGtpbmQ6ICdlZGl0JztcbiAgZmlsZTogc3RyaW5nO1xuICAvKiogTGluZXMgYWRkZWQgYW5kIHJlbW92ZWQsIHNob3duIG9uY2UgaXQgaXMgZG9uZS4gKi9cbiAgYWRkZWQ/OiBudW1iZXI7XG4gIHJlbW92ZWQ/OiBudW1iZXI7XG4gIC8qKiBUaGUgY2hhbmdlZCBsaW5lcywgZWFjaCBzdGFydGluZyB3aXRoIFwiLVwiIChyZW1vdmVkLCByZWQpIG9yIFwiK1wiIChhZGRlZCwgZ3JlZW4pLiAqL1xuICBkaWZmPzogc3RyaW5nW107XG4gIHN0YXR1cz86ICdydW5uaW5nJyB8ICdkb25lJyB8ICdzdG9wcGVkJztcbn1cblxuZXhwb3J0IHR5cGUgVGVybWluYWxFbnRyeSA9IFRlcm1pbmFsQ29tbWFuZCB8IFRlcm1pbmFsTm90ZSB8IFRlcm1pbmFsRWRpdDtcbmV4cG9ydCB0eXBlIFRlcm1pbmFsU3RhdHVzID0gJ3J1bm5pbmcnIHwgJ3Bhc3NlZCcgfCAnZmFpbGVkJyB8ICdzdG9wcGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXJtaW5hbExhYmVscyB7XG4gIHJ1bm5pbmc/OiBzdHJpbmc7XG4gIHBhc3NlZD86IHN0cmluZztcbiAgZmFpbGVkPzogc3RyaW5nO1xuICBzdG9wcGVkPzogc3RyaW5nO1xuICBzdG9wPzogc3RyaW5nO1xuICBjb3B5Pzogc3RyaW5nO1xuICBjb3BpZWQ/OiBzdHJpbmc7XG4gIG1vcmU/OiAobjogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIGZld2VyPzogc3RyaW5nO1xuICBlZGl0Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVGVybWluYWxMaW5lVmlldyB7XG4gIHRleHQ6IHN0cmluZztcbiAgdG9uZT86IFRlcm1pbmFsVG9uZTtcbn1cblxuY29uc3QgVE9ORTogUmVjb3JkPFRlcm1pbmFsVG9uZSwgc3RyaW5nPiA9IHsgb2s6ICd2by1vaycsIGJhZDogJ3ZvLWJhZCcsIG11dGVkOiAndm8tbXUnIH07XG5cbmNvbnN0IGxpbmVPZiA9IChsOiBUZXJtaW5hbExpbmUpOiBUZXJtaW5hbExpbmVWaWV3ID0+XG4gIHR5cGVvZiBsID09PSAnc3RyaW5nJyA/IHsgdGV4dDogbCwgdG9uZTogdW5kZWZpbmVkIH0gOiBsO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by10ZXJtaW5hbC1zdHJlYW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbVm9JY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBkYXRhLXZvPVwiXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc05hbWUgPyAndm8tdG14IHZvLXBhbmVsICcgKyBjbGFzc05hbWUgOiAndm8tdG14IHZvLXBhbmVsJ1wiXG4gICAgICBbY2xhc3Mudm8tbGl2ZV09XCJydW5uaW5nXCJcbiAgICAgIHN0eWxlPVwiY29udGFpbmVyLXR5cGU6IGlubGluZS1zaXplXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LWhcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bXgtaWNcIj48dm8taWNvbiBuYW1lPVwidGVybVwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LWN3ZFwiPnt7IGN3ZCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInZvLXRteC1zdFwiXG4gICAgICAgICAgW2NsYXNzLnZvLW9rXT1cInN0YXRlID09PSAncGFzc2VkJ1wiXG4gICAgICAgICAgW2NsYXNzLnZvLWJhZF09XCJzdGF0ZSA9PT0gJ2ZhaWxlZCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1nXCI+XG4gICAgICAgICAgICBAaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cInN0YXRlID09PSAncGFzc2VkJyA/ICdjaGVjaycgOiAnc3RvcCdcIiBzaXplPVwieHNcIj48L3ZvLWljb24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LXN2IHZvLW51bVwiPlxuICAgICAgICAgICAgQGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgICAgIHt7IGVsYXBzZWQgPyBMLnJ1bm5pbmcgKyAnIMK3ICcgKyBlbGFwc2VkIDogTC5ydW5uaW5nIH19XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAge3sgc3RhdGVMYWJlbCB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwXCI+PC9zcGFuPlxuICAgICAgICBAaWYgKHJ1bm5pbmcgJiYgaGFzU3RvcCkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ2by1waWxsIHZvLWdob3N0IHZvLXNtIHZvLXRteC1zdG9wXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTdG9wIHRoZSBydW5uaW5nIGNvbW1hbmRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInN0b3AuZW1pdCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwic3RvcFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj57eyBMLnN0b3AgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ2by1pYiB2by10bXgtY3BcIlxuICAgICAgICAgIFtjbGFzcy52by1jb3BpZWRdPVwiY29waWVkXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29weSB0aGUgb3V0cHV0XCJcbiAgICAgICAgICAoY2xpY2spPVwiY29weUFsbCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cImNvcGllZCA/ICdjaGVjaycgOiAnY29weSdcIj48L3ZvLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgI2JvZHlcbiAgICAgICAgY2xhc3M9XCJ2by10bXgtYm9keVwiXG4gICAgICAgIHJvbGU9XCJsb2dcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiVGVybWluYWwgb3V0cHV0XCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgKHNjcm9sbCk9XCJvblNjcm9sbCgpXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAoZSBvZiBlbnRyaWVzOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgQHN3aXRjaCAoa2luZE9mKGUpKSB7XG4gICAgICAgICAgICBAY2FzZSAoJ25vdGUnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtbm90ZVwiPlxuICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJzcGFya1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3Mudm8tc2hpbV09XCJydW5uaW5nICYmIGkgPT09IGVudHJpZXMubGVuZ3RoIC0gMVwiPnt7IGFzTm90ZShlKS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnZWRpdCcpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1ibGtcIiBbYXR0ci5kYXRhLXNdPVwiYXNFZGl0KGUpLnN0YXR1cyA9PT0gJ3N0b3BwZWQnID8gJ3N0b3AnIDogJ2VkaXQnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1jbWRcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LXBcIj48dm8taWNvbiBuYW1lPVwiZWRpdFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1jXCI+e3sgTC5lZGl0IH19IHt7IGFzRWRpdChlKS5maWxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bXgtbVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGFzRWRpdChlKS5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPjxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKGFzRWRpdChlKS5zdGF0dXMgPT09ICdzdG9wcGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPjxzcGFuIGNsYXNzPVwidm8tdGFnXCI+e3sgTC5zdG9wcGVkIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChhc0VkaXQoZSkuYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZGRcIj4re3sgYXNFZGl0KGUpLmFkZGVkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFzRWRpdChlKS5yZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZGVsXCI+4oiSe3sgYXNFZGl0KGUpLnJlbW92ZWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgIGFzRWRpdChlKS5zdGF0dXMgIT09ICdydW5uaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgYXNFZGl0KGUpLnN0YXR1cyAhPT0gJ3N0b3BwZWQnICYmXG4gICAgICAgICAgICAgICAgICBhc0VkaXQoZSkuZGlmZiAmJlxuICAgICAgICAgICAgICAgICAgYXNFZGl0KGUpLmRpZmYhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtZGZcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZCBvZiBhc0VkaXQoZSkuZGlmZjsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBbY2xhc3Mudm8tYV09XCJkWzBdID09PSAnKydcIiBbY2xhc3Mudm8tZF09XCJkWzBdID09PSAnLSdcIj57eyBkIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXRteC1ibGtcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtc109XCJkYXRhUyhhc0NvbW1hbmQoZSkpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by10bXgtY21kXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1wXCI+JDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LWNcIj57eyBhc0NvbW1hbmQoZSkuY29tbWFuZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdG14LW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoYXNDb21tYW5kKGUpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJ29rJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW9rXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlICgnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZyB2by1iYWRcIj5FeGl0IHt7IGFzQ29tbWFuZChlKS5leGl0Q29kZSA/PyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZ1wiPnt7IEwuc3RvcHBlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChhc0NvbW1hbmQoZSkuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXQgdm8tbnVtXCI+e3sgYXNDb21tYW5kKGUpLmR1cmF0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgQGlmIChmb2xkcyhhc0NvbW1hbmQoZSkpKSB7XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXRteC1tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJvcGVuLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoaSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1kXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBvcGVuLmhhcyhpKSA/IEwuZmV3ZXIgOiBtb3JlKGhpZGRlbihhc0NvbW1hbmQoZSkpLmxlbmd0aCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1mb2xkXCIgW2NsYXNzLnZvLXNodXRdPVwiIW9wZW4uaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChsIG9mIGhpZGRlbihhc0NvbW1hbmQoZSkpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXRteC1sXCIgW2NsYXNzXT1cInRvbmVDbGFzcyhsKVwiPnt7IGxpbmVUZXh0KGwpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd24oYXNDb21tYW5kKGUpKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LW9cIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAobCBvZiBzaG93bihhc0NvbW1hbmQoZSkpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tdG14LWxcIiBbY2xhc3NdPVwidG9uZUNsYXNzKGwpXCI+e3sgbGluZVRleHQobCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by10bXgtZmZcIiBbY2xhc3Mudm8tc2h1dF09XCJydW5uaW5nIHx8IGZvb3QgPT09IGZhbHNlXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2by10bXgtZlwiXG4gICAgICAgICAgICBbY2xhc3Mudm8tc3RvcF09XCJzdGF0ZSA9PT0gJ3N0b3BwZWQnXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1iYWRdPVwic3RhdGUgPT09ICdmYWlsZWQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWdcIj5cbiAgICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwic3RhdGUgPT09ICdwYXNzZWQnID8gJ29rJyA6IHN0YXRlID09PSAnZmFpbGVkJyA/ICdhbGVydCcgOiAnc3RvcCdcIj48L3ZvLWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRteC1mcyB2by1udW1cIj57eyBmb290IHx8ICcnIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vdGVybWluYWwtc3RyZWFtLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsU3RyZWFtQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFRoZSB3b3JraW5nIGRpcmVjdG9yeSwgc2hvd24gaW4gdGhlIGhlYWRlciwgbGlrZSBcIn4vYWNtZS93ZWJcIi4gKi9cbiAgQElucHV0KCkgY3dkID0gJyc7XG5cbiAgLyoqIENvbW1hbmRzLCBub3RlcyBhbmQgZWRpdHMsIG9sZGVzdCBmaXJzdC4gKi9cbiAgQElucHV0KCkgZW50cmllczogVGVybWluYWxFbnRyeVtdID0gW107XG5cbiAgLyoqIFRoZSBydW4gYXMgYSB3aG9sZS4gTGVmdCBvdXQsIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgZW50cmllcy4gKi9cbiAgQElucHV0KCkgc3RhdHVzPzogVGVybWluYWxTdGF0dXM7XG5cbiAgLyoqIEhvdyBsb25nIHRoZSBydW4gaGFzIHRha2VuLCBsaWtlIFwiMDoxOFwiLiBTaG93biBiZXNpZGUgUnVubmluZyBhbmQgaW4gdGhlIHN1bW1hcnkuICovXG4gIEBJbnB1dCgpIGVsYXBzZWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBsaW5lIGF0IHRoZSBmb290IG9uY2UgdGhlIHJ1biBpcyBvdmVyOyBmYWxzZSBoaWRlcyBpdC4gKi9cbiAgQElucHV0KCkgc3VtbWFyeT86IHN0cmluZyB8IGZhbHNlO1xuXG4gIC8qKiBIb3cgbWFueSBsaW5lcyBhIGZvbGRlZCBvdXRwdXQga2VlcHMgc2hvd2luZy4gKi9cbiAgQElucHV0KCkgdGFpbCA9IDQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBjb3BpZWQgKHNob3dzIHRoZSBDb3BpZWQgdG9vbHRpcC9jaGVjaykuICovXG4gIEBJbnB1dCgpIGNvcGllZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVycmlkZXMgZm9yIHRoZSBsYWJlbHMuICovXG4gIEBJbnB1dCgpIGxhYmVsczogVGVybWluYWxMYWJlbHMgPSB7fTtcblxuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEVtaXR0ZWQgYnkgdGhlIFN0b3AgYnV0dG9uIHdoaWxlIHRoZSBydW4gaXMgZ29pbmcuICovXG4gIEBPdXRwdXQoKSBzdG9wID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdpdGggdGhlIHdob2xlIHJ1biBhcyB0ZXh0IHdoZW4gaXQgaXMgY29waWVkLiAqL1xuICBAT3V0cHV0KCkgY29weSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2JvZHknKSBwcml2YXRlIGJvZHlSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKiogV2hpY2ggZm9sZGVkIGNvbW1hbmRzIChieSBlbnRyeSBpbmRleCkgYXJlIG9wZW4uICovXG4gIHJlYWRvbmx5IG9wZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBwcml2YXRlIHBpbm5lZCA9IHRydWU7XG4gIHByaXZhdGUgbW8/OiBNdXRhdGlvbk9ic2VydmVyO1xuICBwcml2YXRlIHJvPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgZ2V0IEwoKTogUmVxdWlyZWQ8VGVybWluYWxMYWJlbHM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcnVubmluZzogJ1J1bm5pbmcnLFxuICAgICAgcGFzc2VkOiAnUGFzc2VkJyxcbiAgICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG4gICAgICBzdG9wcGVkOiAnU3RvcHBlZCcsXG4gICAgICBzdG9wOiAnU3RvcCcsXG4gICAgICBjb3B5OiAnQ29weScsXG4gICAgICBjb3BpZWQ6ICdDb3BpZWQgdG8gY2xpcGJvYXJkJyxcbiAgICAgIG1vcmU6IChuOiBudW1iZXIpID0+IGBTaG93ICR7bn0gbW9yZSBsaW5lJHtuID09PSAxID8gJycgOiAncyd9YCxcbiAgICAgIGZld2VyOiAnU2hvdyBmZXdlciBsaW5lcycsXG4gICAgICBlZGl0OiAnRWRpdCcsXG4gICAgICAuLi50aGlzLmxhYmVscyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGhhc1N0b3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcC5vYnNlcnZlZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmRzKCk6IFRlcm1pbmFsQ29tbWFuZFtdIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmZpbHRlcihcbiAgICAgIChlKTogZSBpcyBUZXJtaW5hbENvbW1hbmQgPT4gdGhpcy5raW5kT2YoZSkgPT09ICdjb21tYW5kJ1xuICAgICk7XG4gIH1cblxuICBnZXQgc3RhdGUoKTogVGVybWluYWxTdGF0dXMge1xuICAgIGlmICh0aGlzLnN0YXR1cykgcmV0dXJuIHRoaXMuc3RhdHVzO1xuICAgIGNvbnN0IGJ1c3kgPSB0aGlzLmVudHJpZXMuc29tZShcbiAgICAgIChlKSA9PiB0aGlzLmtpbmRPZihlKSAhPT0gJ25vdGUnICYmIChlIGFzIFRlcm1pbmFsQ29tbWFuZCB8IFRlcm1pbmFsRWRpdCkuc3RhdHVzID09PSAncnVubmluZydcbiAgICApO1xuICAgIGlmIChidXN5KSByZXR1cm4gJ3J1bm5pbmcnO1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGxhc3Q/LnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICAgID8gJ2ZhaWxlZCdcbiAgICAgIDogbGFzdD8uc3RhdHVzID09PSAnc3RvcHBlZCdcbiAgICAgICAgPyAnc3RvcHBlZCdcbiAgICAgICAgOiAncGFzc2VkJztcbiAgfVxuXG4gIGdldCBydW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAncnVubmluZyc7XG4gIH1cblxuICBnZXQgc3RhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLkxbdGhpcy5zdGF0ZV07XG4gIH1cblxuICBnZXQgZm9vdCgpOiBzdHJpbmcgfCBmYWxzZSB7XG4gICAgaWYgKHRoaXMuc3VtbWFyeSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zdW1tYXJ5O1xuICAgIGNvbnN0IG4gPSBuZXcgU2V0KHRoaXMuY29tbWFuZHMubWFwKChjKSA9PiBjLmNvbW1hbmQpKS5zaXplO1xuICAgIHJldHVybiBbYCR7bn0gY29tbWFuZCR7biA9PT0gMSA/ICcnIDogJ3MnfWAsIHRoaXMuZWxhcHNlZCwgdGhpcy5zdGF0ZV1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcgwrcgJyk7XG4gIH1cblxuICBraW5kT2YoZTogVGVybWluYWxFbnRyeSk6ICdub3RlJyB8ICdlZGl0JyB8ICdjb21tYW5kJyB7XG4gICAgaWYgKGUua2luZCA9PT0gJ25vdGUnKSByZXR1cm4gJ25vdGUnO1xuICAgIGlmIChlLmtpbmQgPT09ICdlZGl0JykgcmV0dXJuICdlZGl0JztcbiAgICByZXR1cm4gJ2NvbW1hbmQnO1xuICB9XG5cbiAgYXNOb3RlKGU6IFRlcm1pbmFsRW50cnkpOiBUZXJtaW5hbE5vdGUge1xuICAgIHJldHVybiBlIGFzIFRlcm1pbmFsTm90ZTtcbiAgfVxuXG4gIGFzRWRpdChlOiBUZXJtaW5hbEVudHJ5KTogVGVybWluYWxFZGl0IHtcbiAgICByZXR1cm4gZSBhcyBUZXJtaW5hbEVkaXQ7XG4gIH1cblxuICBhc0NvbW1hbmQoZTogVGVybWluYWxFbnRyeSk6IFRlcm1pbmFsQ29tbWFuZCB7XG4gICAgcmV0dXJuIGUgYXMgVGVybWluYWxDb21tYW5kO1xuICB9XG5cbiAgZGF0YVMoZTogVGVybWluYWxDb21tYW5kKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZS5zdGF0dXMgPT09ICdydW5uaW5nJ1xuICAgICAgPyAncnVuJ1xuICAgICAgOiBlLnN0YXR1cyA9PT0gJ29rJ1xuICAgICAgICA/ICdvaydcbiAgICAgICAgOiBlLnN0YXR1cyA9PT0gJ2ZhaWxlZCdcbiAgICAgICAgICA/ICdiYWQnXG4gICAgICAgICAgOiAnc3RvcCc7XG4gIH1cblxuICBwcml2YXRlIG91dChlOiBUZXJtaW5hbENvbW1hbmQpOiBUZXJtaW5hbExpbmVbXSB7XG4gICAgcmV0dXJuIGUub3V0cHV0ID8/IFtdO1xuICB9XG5cbiAgZm9sZHMoZTogVGVybWluYWxDb21tYW5kKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3V0KGUpLmxlbmd0aCA+IHRoaXMudGFpbCArIDE7XG4gIH1cblxuICBoaWRkZW4oZTogVGVybWluYWxDb21tYW5kKTogVGVybWluYWxMaW5lW10ge1xuICAgIGNvbnN0IG8gPSB0aGlzLm91dChlKTtcbiAgICByZXR1cm4gdGhpcy5mb2xkcyhlKSA/IG8uc2xpY2UoMCwgby5sZW5ndGggLSB0aGlzLnRhaWwpIDogW107XG4gIH1cblxuICBzaG93bihlOiBUZXJtaW5hbENvbW1hbmQpOiBUZXJtaW5hbExpbmVbXSB7XG4gICAgY29uc3QgbyA9IHRoaXMub3V0KGUpO1xuICAgIHJldHVybiB0aGlzLmZvbGRzKGUpID8gby5zbGljZShvLmxlbmd0aCAtIHRoaXMudGFpbCkgOiBvO1xuICB9XG5cbiAgbGluZVRleHQobDogVGVybWluYWxMaW5lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluZU9mKGwpLnRleHQ7XG4gIH1cblxuICB0b25lQ2xhc3MobDogVGVybWluYWxMaW5lKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b25lID0gbGluZU9mKGwpLnRvbmU7XG4gICAgcmV0dXJuIHRvbmUgPyBUT05FW3RvbmVdIDogJyc7XG4gIH1cblxuICBtb3JlKG46IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuTC5tb3JlKG4pO1xuICB9XG5cbiAgdG9nZ2xlKGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW4uaGFzKGkpKSB0aGlzLm9wZW4uZGVsZXRlKGkpO1xuICAgIGVsc2UgdGhpcy5vcGVuLmFkZChpKTtcbiAgfVxuXG4gIHByaXZhdGUgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXNcbiAgICAgIC5mbGF0TWFwKChlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmtpbmRPZihlKSA9PT0gJ25vdGUnKSByZXR1cm4gWycjICcgKyB0aGlzLmFzTm90ZShlKS50ZXh0XTtcbiAgICAgICAgaWYgKHRoaXMua2luZE9mKGUpID09PSAnZWRpdCcpIHtcbiAgICAgICAgICBjb25zdCBlZCA9IHRoaXMuYXNFZGl0KGUpO1xuICAgICAgICAgIGNvbnN0IGNvdW50cyA9XG4gICAgICAgICAgICBlZC5hZGRlZCAhPT0gdW5kZWZpbmVkIHx8IGVkLnJlbW92ZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IGAgKCske2VkLmFkZGVkID8/IDB9IOKIkiR7ZWQucmVtb3ZlZCA/PyAwfSlgXG4gICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IGVkLnN0YXR1cyA9PT0gJ2RvbmUnIHx8IGVkLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gZWQuZGlmZiA/PyBbXSA6IFtdO1xuICAgICAgICAgIHJldHVybiBbYCMgJHt0aGlzLkwuZWRpdH0gJHtlZC5maWxlfSR7Y291bnRzfWAsIC4uLmRpZmZdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNtZCA9IHRoaXMuYXNDb21tYW5kKGUpO1xuICAgICAgICByZXR1cm4gWyckICcgKyBjbWQuY29tbWFuZCwgLi4uKGNtZC5vdXRwdXQgPz8gW10pLm1hcCgobCkgPT4gbGluZU9mKGwpLnRleHQpXTtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG4gIH1cblxuICBjb3B5QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY29weS5lbWl0KHRoaXMudGV4dCgpKTtcbiAgfVxuXG4gIG9uU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICB0aGlzLnBpbm5lZCA9IGVsLnNjcm9sbFRvcCArIGVsLmNsaWVudEhlaWdodCA+PSBlbC5zY3JvbGxIZWlnaHQgLSAyNDtcbiAgfVxuXG4gIC8vIG5ldyBvdXRwdXQga2VlcHMgdGhlIGxvZyBvbiBpdHMgbmV3ZXN0IGxpbmUsIHVubGVzcyB0aGUgcmVhZGVyIGhhcyBzY3JvbGxlZCB1cFxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmJvZHlSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0aWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGlubmVkKSBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XG4gICAgfTtcbiAgICB0aGlzLm1vID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoc3RpY2spO1xuICAgIHRoaXMubW8ub2JzZXJ2ZShlbCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5ybyA9IG5ldyBSZXNpemVPYnNlcnZlcihzdGljayk7XG4gICAgICB0aGlzLnJvLm9ic2VydmUoZWwpO1xuICAgIH1cbiAgICBzdGljaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5tbz8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMucm8/LmRpc2Nvbm5lY3QoKTtcbiAgfVxufVxuIl19
|