@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,460 @@
|
|
|
1
|
+
// framework/angular/score-breakdown/score-breakdown.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/score-breakdown/ScoreBreakdown.tsx.
|
|
4
|
+
// A score out of 100 whose half-circle gauge is split into one segment per
|
|
5
|
+
// factor, sized by its weight and filled by the points it earned. The rows
|
|
6
|
+
// under it say what each earned and why, the weakest one is flagged in words,
|
|
7
|
+
// and an improvable row offers Improve, which asks for a proposal to apply.
|
|
8
|
+
// Inputs mirror the React props; callbacks become @Output EventEmitters. The
|
|
9
|
+
// gauge sweep, the count-up of the total, the hover highlight and the row fold
|
|
10
|
+
// are ported from the vanilla JS (score-breakdown.js).
|
|
11
|
+
//
|
|
12
|
+
// Icons: the React source uses a "wand" glyph on the Improve button, which is
|
|
13
|
+
// not in the Angular icon set, so it is substituted with the closest available
|
|
14
|
+
// glyph, "spark" (also used for the proposal marker, matching the source).
|
|
15
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
16
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "../core/reduced-motion.service";
|
|
19
|
+
// The chart palette (--vo-c1..c6), in order.
|
|
20
|
+
const PAL = ['var(--vo-c1)', 'var(--vo-c2)', 'var(--vo-c3)', 'var(--vo-c4)', 'var(--vo-c5)', 'var(--vo-c6)'];
|
|
21
|
+
const band = (s) => (s >= 90 ? 'Excellent' : s >= 75 ? 'Good' : s >= 60 ? 'Fair' : 'Needs work');
|
|
22
|
+
const CX = 100, CY = 100, RAD = 86, GAP = 0.04;
|
|
23
|
+
const at = (a) => [CX + Math.cos(a) * RAD, CY + Math.sin(a) * RAD];
|
|
24
|
+
const arc = (a0, a1) => {
|
|
25
|
+
const [x0, y0] = at(a0), [x1, y1] = at(a1);
|
|
26
|
+
return `M${x0.toFixed(2)} ${y0.toFixed(2)}A${RAD} ${RAD} 0 0 1 ${x1.toFixed(2)} ${y1.toFixed(2)}`;
|
|
27
|
+
};
|
|
28
|
+
export class ScoreBreakdownComponent {
|
|
29
|
+
/** The open rows, by key. Leave it out to let clicks open and close rows. */
|
|
30
|
+
set open(value) {
|
|
31
|
+
this.controlled = value !== undefined;
|
|
32
|
+
if (value !== undefined)
|
|
33
|
+
this.opened = [...value];
|
|
34
|
+
}
|
|
35
|
+
constructor(reduced, cdr) {
|
|
36
|
+
this.reduced = reduced;
|
|
37
|
+
this.cdr = cdr;
|
|
38
|
+
this.factors = [];
|
|
39
|
+
this.title = 'Quality score';
|
|
40
|
+
/** What the change is measured against ("since last week"). */
|
|
41
|
+
this.since = 'since last week';
|
|
42
|
+
this.defaultOpen = [];
|
|
43
|
+
/** What the row says while the agent works on a proposal. */
|
|
44
|
+
this.improvingLabel = 'Looking into it';
|
|
45
|
+
/** Emitted when a row opens or closes (when uncontrolled). */
|
|
46
|
+
this.openChange = new EventEmitter();
|
|
47
|
+
/** Called by Improve; return (or resolve) the agent's proposal. */
|
|
48
|
+
this.improveRequest = new EventEmitter();
|
|
49
|
+
/** Called by Apply on a proposal; update the factor's earned and note. */
|
|
50
|
+
this.applyProposal = new EventEmitter();
|
|
51
|
+
// exposed to the template
|
|
52
|
+
this.rows = [];
|
|
53
|
+
this.hot = -1;
|
|
54
|
+
this.weakest = 0;
|
|
55
|
+
this.total = 0;
|
|
56
|
+
this.drawn = false;
|
|
57
|
+
this.shownRounded = 0;
|
|
58
|
+
this.bandWord = '';
|
|
59
|
+
this.delta = null;
|
|
60
|
+
this.absDelta = 0;
|
|
61
|
+
this.opened = [];
|
|
62
|
+
this.controlled = false;
|
|
63
|
+
this.timers = [];
|
|
64
|
+
this.frames = [];
|
|
65
|
+
}
|
|
66
|
+
ngAfterViewInit() {
|
|
67
|
+
if (!this.controlled)
|
|
68
|
+
this.opened = [...this.defaultOpen];
|
|
69
|
+
this.total = this.factors.reduce((t, f) => t + f.earned, 0);
|
|
70
|
+
this.weakest = this.factors.reduce((m, f, i) => (f.earned / f.weight < this.factors[m].earned / this.factors[m].weight ? i : m), 0);
|
|
71
|
+
this.bandWord = band(this.total);
|
|
72
|
+
this.delta = this.previous === undefined ? null : this.total - this.previous;
|
|
73
|
+
this.absDelta = this.delta === null ? 0 : Math.abs(this.delta);
|
|
74
|
+
// lay out the gauge: a half circle split by weight with a small gap
|
|
75
|
+
let a = Math.PI;
|
|
76
|
+
this.rows = this.factors.map((factor, index) => {
|
|
77
|
+
const span = (factor.weight / 100) * Math.PI;
|
|
78
|
+
const seg = [a + GAP / 2, a + span - GAP / 2];
|
|
79
|
+
a += span;
|
|
80
|
+
return {
|
|
81
|
+
factor,
|
|
82
|
+
index,
|
|
83
|
+
color: PAL[index % PAL.length],
|
|
84
|
+
seg,
|
|
85
|
+
track: arc(seg[0], seg[1]),
|
|
86
|
+
fillPath: '',
|
|
87
|
+
barWidth: '0',
|
|
88
|
+
proposal: null,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
this.cdr.detectChanges();
|
|
92
|
+
if (this.reduced.reduce()) {
|
|
93
|
+
this.shownRounded = this.total;
|
|
94
|
+
this.drawn = true;
|
|
95
|
+
this.rows.forEach((r) => this.fillTo(r, r.factor.earned / r.factor.weight));
|
|
96
|
+
this.cdr.markForCheck();
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// a moment after the gauge appears, the segments sweep in and the total counts up
|
|
100
|
+
this.later(() => {
|
|
101
|
+
this.drawn = true;
|
|
102
|
+
this.count(this.total);
|
|
103
|
+
this.rows.forEach((r, i) => this.sweep(r, i * 120));
|
|
104
|
+
this.cdr.markForCheck();
|
|
105
|
+
}, 280);
|
|
106
|
+
}
|
|
107
|
+
// --- gauge drawing ---------------------------------------------------------
|
|
108
|
+
fillTo(r, p) {
|
|
109
|
+
const [a0, a1] = r.seg;
|
|
110
|
+
r.fillPath = p > 0 ? arc(a0, a0 + (a1 - a0) * Math.min(1, p)) : '';
|
|
111
|
+
r.barWidth = p * 100 + '%';
|
|
112
|
+
}
|
|
113
|
+
// eases one segment's fill up to its share over ~900ms, like the vanilla tween
|
|
114
|
+
sweep(r, delay) {
|
|
115
|
+
const target = r.factor.earned / r.factor.weight;
|
|
116
|
+
const dur = 900;
|
|
117
|
+
this.later(() => {
|
|
118
|
+
const t0 = performance.now();
|
|
119
|
+
const step = (t) => {
|
|
120
|
+
const p = Math.max(0, Math.min(1, (t - t0) / dur));
|
|
121
|
+
this.fillTo(r, target * (1 - Math.pow(1 - p, 3)));
|
|
122
|
+
this.cdr.markForCheck();
|
|
123
|
+
if (p < 1)
|
|
124
|
+
this.frames.push(requestAnimationFrame(step));
|
|
125
|
+
};
|
|
126
|
+
this.frames.push(requestAnimationFrame(step));
|
|
127
|
+
}, delay);
|
|
128
|
+
}
|
|
129
|
+
// eases the centre number up to the total over ~1000ms
|
|
130
|
+
count(target) {
|
|
131
|
+
const t0 = performance.now();
|
|
132
|
+
const dur = 1000;
|
|
133
|
+
const step = (t) => {
|
|
134
|
+
const p = Math.max(0, Math.min(1, (t - t0) / dur));
|
|
135
|
+
this.shownRounded = Math.round(target * (1 - Math.pow(1 - p, 3)));
|
|
136
|
+
this.cdr.markForCheck();
|
|
137
|
+
if (p < 1)
|
|
138
|
+
this.frames.push(requestAnimationFrame(step));
|
|
139
|
+
};
|
|
140
|
+
this.frames.push(requestAnimationFrame(step));
|
|
141
|
+
}
|
|
142
|
+
// --- template helpers ------------------------------------------------------
|
|
143
|
+
valueText() {
|
|
144
|
+
const base = `${this.total} of 100, ${band(this.total).toLowerCase()}`;
|
|
145
|
+
if (this.delta === null)
|
|
146
|
+
return base;
|
|
147
|
+
return `${base}, ${this.delta >= 0 ? 'up' : 'down'} ${Math.abs(this.delta)} ${this.since}`;
|
|
148
|
+
}
|
|
149
|
+
rowLabel(r) {
|
|
150
|
+
return `${r.factor.label}: ${r.factor.earned} of ${r.factor.weight} points${r.index === this.weakest ? ', weakest' : ''}. ${r.factor.note}`;
|
|
151
|
+
}
|
|
152
|
+
lostText(r) {
|
|
153
|
+
const lost = r.factor.weight - r.factor.earned;
|
|
154
|
+
const base = lost ? `Loses ${lost} of its ${r.factor.weight} points` : 'Full marks';
|
|
155
|
+
return base + (r.index === this.weakest && lost ? ', the most of any factor for its weight.' : '.');
|
|
156
|
+
}
|
|
157
|
+
isOpen(key) {
|
|
158
|
+
return this.opened.includes(key);
|
|
159
|
+
}
|
|
160
|
+
toggle(key) {
|
|
161
|
+
const next = this.opened.includes(key) ? this.opened.filter((k) => k !== key) : [...this.opened, key];
|
|
162
|
+
if (!this.controlled)
|
|
163
|
+
this.opened = next;
|
|
164
|
+
this.openChange.emit(next);
|
|
165
|
+
}
|
|
166
|
+
// --- hover highlight -------------------------------------------------------
|
|
167
|
+
setHot(index) {
|
|
168
|
+
this.hot = index;
|
|
169
|
+
this.cdr.markForCheck();
|
|
170
|
+
}
|
|
171
|
+
onPointGauge(e, index) {
|
|
172
|
+
if (e.pointerType !== 'touch')
|
|
173
|
+
this.setHot(index);
|
|
174
|
+
}
|
|
175
|
+
onPointRow(e, index) {
|
|
176
|
+
if (e.pointerType !== 'touch')
|
|
177
|
+
this.setHot(index);
|
|
178
|
+
}
|
|
179
|
+
onListLeave(e) {
|
|
180
|
+
const el = e.currentTarget;
|
|
181
|
+
if (!el.contains(document.activeElement))
|
|
182
|
+
this.setHot(-1);
|
|
183
|
+
}
|
|
184
|
+
onListFocusOut(e) {
|
|
185
|
+
const el = e.currentTarget;
|
|
186
|
+
if (!el.contains(e.relatedTarget))
|
|
187
|
+
this.setHot(-1);
|
|
188
|
+
}
|
|
189
|
+
// --- improve / apply -------------------------------------------------------
|
|
190
|
+
improve(r) {
|
|
191
|
+
r.proposal = 'busy';
|
|
192
|
+
this.cdr.markForCheck();
|
|
193
|
+
this.improveRequest.emit({
|
|
194
|
+
factor: r.factor,
|
|
195
|
+
resolve: (p) => {
|
|
196
|
+
r.proposal = p;
|
|
197
|
+
this.cdr.markForCheck();
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
apply(r) {
|
|
202
|
+
const p = r.proposal;
|
|
203
|
+
if (!p || p === 'busy')
|
|
204
|
+
return;
|
|
205
|
+
r.proposal = null;
|
|
206
|
+
this.applyProposal.emit({ factor: r.factor, proposal: p });
|
|
207
|
+
this.cdr.markForCheck();
|
|
208
|
+
}
|
|
209
|
+
drop(r) {
|
|
210
|
+
r.proposal = null;
|
|
211
|
+
this.cdr.markForCheck();
|
|
212
|
+
}
|
|
213
|
+
later(fn, ms) {
|
|
214
|
+
this.timers.push(setTimeout(fn, ms));
|
|
215
|
+
}
|
|
216
|
+
ngOnDestroy() {
|
|
217
|
+
this.timers.forEach(clearTimeout);
|
|
218
|
+
this.frames.forEach(cancelAnimationFrame);
|
|
219
|
+
this.timers = [];
|
|
220
|
+
this.frames = [];
|
|
221
|
+
}
|
|
222
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScoreBreakdownComponent, deps: [{ token: i1.ReducedMotionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
223
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScoreBreakdownComponent, isStandalone: true, selector: "vo-score-breakdown", inputs: { factors: "factors", title: "title", previous: "previous", since: "since", open: "open", defaultOpen: "defaultOpen", improvingLabel: "improvingLabel" }, outputs: { openChange: "openChange", improveRequest: "improveRequest", applyProposal: "applyProposal" }, ngImport: i0, template: `
|
|
224
|
+
<div data-vo="" class="vo-sbx vo-panel">
|
|
225
|
+
<div class="vo-sbx-top">
|
|
226
|
+
<div
|
|
227
|
+
class="vo-sbx-g"
|
|
228
|
+
[class.vo-hov]="hot >= 0"
|
|
229
|
+
role="meter"
|
|
230
|
+
[attr.aria-label]="title"
|
|
231
|
+
aria-valuemin="0"
|
|
232
|
+
aria-valuemax="100"
|
|
233
|
+
[attr.aria-valuenow]="total"
|
|
234
|
+
[attr.aria-valuetext]="valueText()"
|
|
235
|
+
>
|
|
236
|
+
<svg viewBox="0 0 200 108" aria-hidden="true">
|
|
237
|
+
@for (r of rows; track r.factor.key) {
|
|
238
|
+
<g
|
|
239
|
+
[class.vo-on]="hot === r.index"
|
|
240
|
+
(pointerenter)="onPointGauge($event, r.index)"
|
|
241
|
+
(pointerleave)="setHot(-1)"
|
|
242
|
+
>
|
|
243
|
+
<path class="vo-tr" [attr.d]="r.track"></path>
|
|
244
|
+
@if (r.fillPath) {
|
|
245
|
+
<path class="vo-fl" [style.stroke]="r.color" [attr.d]="r.fillPath"></path>
|
|
246
|
+
}
|
|
247
|
+
</g>
|
|
248
|
+
}
|
|
249
|
+
</svg>
|
|
250
|
+
<div class="vo-sbx-v"><b class="vo-num">{{ shownRounded }}</b><span class="vo-muted">of 100</span></div>
|
|
251
|
+
</div>
|
|
252
|
+
<div class="vo-sbx-s">
|
|
253
|
+
<b>{{ title }}</b>
|
|
254
|
+
<span class="vo-sbx-band">
|
|
255
|
+
<span class="vo-muted">{{ drawn ? bandWord : 'Scoring' }}</span>
|
|
256
|
+
@if (delta !== null && drawn) {
|
|
257
|
+
<span class="vo-tag vo-num" [class.vo-ok]="delta >= 0" [class.vo-bad]="delta < 0">
|
|
258
|
+
{{ delta >= 0 ? '+' : '−' }}{{ absDelta }} {{ since }}
|
|
259
|
+
</span>
|
|
260
|
+
}
|
|
261
|
+
</span>
|
|
262
|
+
</div>
|
|
263
|
+
</div>
|
|
264
|
+
<div
|
|
265
|
+
class="vo-sbx-list"
|
|
266
|
+
(pointerleave)="onListLeave($event)"
|
|
267
|
+
(focusout)="onListFocusOut($event)"
|
|
268
|
+
>
|
|
269
|
+
@for (r of rows; track r.factor.key) {
|
|
270
|
+
<div
|
|
271
|
+
class="vo-sbx-r"
|
|
272
|
+
[class.vo-on]="hot === r.index"
|
|
273
|
+
[class.vo-open]="isOpen(r.factor.key)"
|
|
274
|
+
(pointerenter)="onPointRow($event, r.index)"
|
|
275
|
+
(focusin)="setHot(r.index)"
|
|
276
|
+
>
|
|
277
|
+
<button
|
|
278
|
+
type="button"
|
|
279
|
+
class="vo-sbx-rh"
|
|
280
|
+
[attr.aria-expanded]="isOpen(r.factor.key)"
|
|
281
|
+
[attr.aria-label]="rowLabel(r)"
|
|
282
|
+
(click)="toggle(r.factor.key)"
|
|
283
|
+
>
|
|
284
|
+
<i [style.background]="r.color"></i>
|
|
285
|
+
<span class="vo-n">
|
|
286
|
+
<span>{{ r.factor.label }}</span>
|
|
287
|
+
@if (r.index === weakest) {
|
|
288
|
+
<span class="vo-tag vo-warn">Weakest</span>
|
|
289
|
+
}
|
|
290
|
+
</span>
|
|
291
|
+
<span class="vo-e vo-num">{{ r.factor.earned }}/{{ r.factor.weight }}</span>
|
|
292
|
+
<span class="vo-bar"><i [style.background]="r.color" [style.width]="r.barWidth"></i></span>
|
|
293
|
+
<vo-icon name="chev-r" size="xs"></vo-icon>
|
|
294
|
+
<span class="vo-sbx-nt">{{ r.factor.note }}</span>
|
|
295
|
+
</button>
|
|
296
|
+
<div class="vo-sbx-fold" [class.vo-shut]="!isOpen(r.factor.key)">
|
|
297
|
+
<div>
|
|
298
|
+
<div class="vo-sbx-d">
|
|
299
|
+
@if (r.proposal === 'busy') {
|
|
300
|
+
<div class="vo-sbx-pr vo-enter">
|
|
301
|
+
<span class="vo-k"><vo-icon name="spark" size="xs"></vo-icon><span class="vo-shim">{{ improvingLabel }}</span></span>
|
|
302
|
+
</div>
|
|
303
|
+
} @else if (r.proposal) {
|
|
304
|
+
<div class="vo-sbx-pr">
|
|
305
|
+
<span class="vo-k"><vo-icon name="spark" size="xs"></vo-icon>Proposal</span>
|
|
306
|
+
<span>{{ r.proposal.text }}</span>
|
|
307
|
+
<span class="vo-gain">{{ r.proposal.gain ? r.proposal.gain + ': ' : '' }}{{ r.factor.label }} <b class="vo-num">{{ r.factor.earned }} → {{ r.proposal.to }}</b></span>
|
|
308
|
+
<span class="vo-acts">
|
|
309
|
+
<button type="button" class="vo-pill vo-primary vo-sm" (click)="apply(r)">Apply</button>
|
|
310
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="drop(r)">Not now</button>
|
|
311
|
+
</span>
|
|
312
|
+
</div>
|
|
313
|
+
} @else {
|
|
314
|
+
<span>{{ r.factor.detail ? r.factor.detail + ' ' : '' }}{{ lostText(r) }}</span>
|
|
315
|
+
@if (r.factor.improvable) {
|
|
316
|
+
<span class="vo-acts">
|
|
317
|
+
<button type="button" class="vo-pill vo-soft vo-sm" (click)="improve(r)"><vo-icon name="spark" size="xs"></vo-icon>Improve</button>
|
|
318
|
+
</span>
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
</div>
|
|
325
|
+
}
|
|
326
|
+
</div>
|
|
327
|
+
</div>
|
|
328
|
+
`, isInline: true, styles: [".vo-sbx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-sbx-top{display:flex;align-items:center;gap:var(--vo-s-4)}.vo-sbx-g{position:relative;width:160px;height:88px;flex:none}.vo-sbx-g svg{width:100%;height:100%;overflow:visible}.vo-sbx-g path{fill:none;stroke-width:16;stroke-linecap:butt;transition:opacity .3s}.vo-sbx-g .vo-tr{stroke:var(--vo-chip)}.vo-sbx-g.vo-hov g:not(.vo-on) .vo-fl{opacity:.3}.vo-sbx-g g{cursor:default}.vo-sbx-v{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;align-items:center;line-height:1.25}.vo-sbx-v b{font-size:14px;font-weight:500}.vo-sbx-v .vo-muted{font-size:11px}.vo-sbx-s{display:flex;flex-direction:column;gap:2px;font-size:13.5px;min-width:0}.vo-sbx-s b{font-weight:500}.vo-sbx-band{display:flex;align-items:baseline;gap:var(--vo-s-2);flex-wrap:wrap;font-size:12.5px}.vo-sbx-band .vo-tag{display:inline-flex}.vo-sbx-list{display:flex;flex-direction:column;gap:2px;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-sbx-r{border-radius:calc(10px * var(--vo-rk));transition:background .2s}.vo-sbx-r.vo-on,.vo-sbx-r.vo-open{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-sbx-r:hover{background:var(--vo-row)}}.vo-sbx-rh{display:grid;grid-template-columns:8px minmax(0,1fr) auto 56px 12px;align-items:center;column-gap:10px;width:100%;padding:var(--vo-s-2);font-size:13px;text-align:left}.vo-sbx-rh>i{width:8px;height:8px;border-radius:calc(2px * var(--vo-rk))}.vo-sbx-rh .vo-n{display:flex;align-items:baseline;gap:6px;min-width:0}.vo-sbx-rh .vo-n>span:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-sbx-rh .vo-tag{display:inline-flex;align-items:center;height:18px;padding-block:0;font-size:11px;line-height:1;flex:none;align-self:center}.vo-sbx-rh:focus-visible{outline-offset:-2px;border-radius:inherit}.vo-sbx-rh .vo-e{font-size:12px;color:var(--vo-fg2)}.vo-sbx-rh .vo-bar{height:5px;border-radius:calc(3px * var(--vo-rk));background:var(--vo-line);overflow:hidden}.vo-sbx-rh .vo-bar i{display:block;height:100%;width:0;border-radius:inherit;transition:width .8s var(--vo-ease)}.vo-sbx-rh>svg{color:var(--vo-muted);transition:transform .35s var(--vo-ease)}.vo-sbx-r.vo-open .vo-sbx-rh>svg{transform:rotate(90deg)}.vo-sbx-nt{grid-column:2/-1;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (hover:hover) and (pointer:fine){.vo-sbx-r:is(:hover,.vo-on,.vo-open) .vo-sbx-nt{color:var(--vo-fg2)}}.vo-sbx-d{padding:0 var(--vo-s-2) 10px calc(var(--vo-s-2) + 18px);display:flex;flex-direction:column;gap:var(--vo-s-2);font-size:12.5px;color:var(--vo-fg2);line-height:1.5}.vo-sbx-d .vo-acts{display:flex;gap:6px;flex-wrap:wrap}.vo-sbx-pr{display:flex;flex-direction:column;gap:6px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-sbx-pr .vo-k{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted)}.vo-sbx-pr .vo-k .vo-i{color:var(--vo-accent-fg,var(--vo-accent))}.vo-sbx-pr .vo-gain{font-size:12px;color:var(--vo-fg2)}.vo-sbx-pr .vo-gain b{font-weight:500;color:var(--vo-ok)}.vo-sbx{container-type:inline-size}@container (max-width:340px){.vo-sbx-top{flex-direction:column;gap:var(--vo-s-2)}.vo-sbx-s{align-items:center;text-align:center}.vo-sbx-band{justify-content:center}.vo-sbx-rh{grid-template-columns:8px minmax(0,1fr) auto 12px}.vo-sbx-rh .vo-bar{display:none}}.vo-sbx-fold{display:grid;grid-template-rows:1fr;transition:grid-template-rows .3s var(--vo-ease)}.vo-sbx-fold.vo-shut{grid-template-rows:0fr}.vo-sbx-fold>div{overflow:hidden;min-height:0}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
329
|
+
}
|
|
330
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScoreBreakdownComponent, decorators: [{
|
|
331
|
+
type: Component,
|
|
332
|
+
args: [{ selector: 'vo-score-breakdown', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
333
|
+
<div data-vo="" class="vo-sbx vo-panel">
|
|
334
|
+
<div class="vo-sbx-top">
|
|
335
|
+
<div
|
|
336
|
+
class="vo-sbx-g"
|
|
337
|
+
[class.vo-hov]="hot >= 0"
|
|
338
|
+
role="meter"
|
|
339
|
+
[attr.aria-label]="title"
|
|
340
|
+
aria-valuemin="0"
|
|
341
|
+
aria-valuemax="100"
|
|
342
|
+
[attr.aria-valuenow]="total"
|
|
343
|
+
[attr.aria-valuetext]="valueText()"
|
|
344
|
+
>
|
|
345
|
+
<svg viewBox="0 0 200 108" aria-hidden="true">
|
|
346
|
+
@for (r of rows; track r.factor.key) {
|
|
347
|
+
<g
|
|
348
|
+
[class.vo-on]="hot === r.index"
|
|
349
|
+
(pointerenter)="onPointGauge($event, r.index)"
|
|
350
|
+
(pointerleave)="setHot(-1)"
|
|
351
|
+
>
|
|
352
|
+
<path class="vo-tr" [attr.d]="r.track"></path>
|
|
353
|
+
@if (r.fillPath) {
|
|
354
|
+
<path class="vo-fl" [style.stroke]="r.color" [attr.d]="r.fillPath"></path>
|
|
355
|
+
}
|
|
356
|
+
</g>
|
|
357
|
+
}
|
|
358
|
+
</svg>
|
|
359
|
+
<div class="vo-sbx-v"><b class="vo-num">{{ shownRounded }}</b><span class="vo-muted">of 100</span></div>
|
|
360
|
+
</div>
|
|
361
|
+
<div class="vo-sbx-s">
|
|
362
|
+
<b>{{ title }}</b>
|
|
363
|
+
<span class="vo-sbx-band">
|
|
364
|
+
<span class="vo-muted">{{ drawn ? bandWord : 'Scoring' }}</span>
|
|
365
|
+
@if (delta !== null && drawn) {
|
|
366
|
+
<span class="vo-tag vo-num" [class.vo-ok]="delta >= 0" [class.vo-bad]="delta < 0">
|
|
367
|
+
{{ delta >= 0 ? '+' : '−' }}{{ absDelta }} {{ since }}
|
|
368
|
+
</span>
|
|
369
|
+
}
|
|
370
|
+
</span>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
<div
|
|
374
|
+
class="vo-sbx-list"
|
|
375
|
+
(pointerleave)="onListLeave($event)"
|
|
376
|
+
(focusout)="onListFocusOut($event)"
|
|
377
|
+
>
|
|
378
|
+
@for (r of rows; track r.factor.key) {
|
|
379
|
+
<div
|
|
380
|
+
class="vo-sbx-r"
|
|
381
|
+
[class.vo-on]="hot === r.index"
|
|
382
|
+
[class.vo-open]="isOpen(r.factor.key)"
|
|
383
|
+
(pointerenter)="onPointRow($event, r.index)"
|
|
384
|
+
(focusin)="setHot(r.index)"
|
|
385
|
+
>
|
|
386
|
+
<button
|
|
387
|
+
type="button"
|
|
388
|
+
class="vo-sbx-rh"
|
|
389
|
+
[attr.aria-expanded]="isOpen(r.factor.key)"
|
|
390
|
+
[attr.aria-label]="rowLabel(r)"
|
|
391
|
+
(click)="toggle(r.factor.key)"
|
|
392
|
+
>
|
|
393
|
+
<i [style.background]="r.color"></i>
|
|
394
|
+
<span class="vo-n">
|
|
395
|
+
<span>{{ r.factor.label }}</span>
|
|
396
|
+
@if (r.index === weakest) {
|
|
397
|
+
<span class="vo-tag vo-warn">Weakest</span>
|
|
398
|
+
}
|
|
399
|
+
</span>
|
|
400
|
+
<span class="vo-e vo-num">{{ r.factor.earned }}/{{ r.factor.weight }}</span>
|
|
401
|
+
<span class="vo-bar"><i [style.background]="r.color" [style.width]="r.barWidth"></i></span>
|
|
402
|
+
<vo-icon name="chev-r" size="xs"></vo-icon>
|
|
403
|
+
<span class="vo-sbx-nt">{{ r.factor.note }}</span>
|
|
404
|
+
</button>
|
|
405
|
+
<div class="vo-sbx-fold" [class.vo-shut]="!isOpen(r.factor.key)">
|
|
406
|
+
<div>
|
|
407
|
+
<div class="vo-sbx-d">
|
|
408
|
+
@if (r.proposal === 'busy') {
|
|
409
|
+
<div class="vo-sbx-pr vo-enter">
|
|
410
|
+
<span class="vo-k"><vo-icon name="spark" size="xs"></vo-icon><span class="vo-shim">{{ improvingLabel }}</span></span>
|
|
411
|
+
</div>
|
|
412
|
+
} @else if (r.proposal) {
|
|
413
|
+
<div class="vo-sbx-pr">
|
|
414
|
+
<span class="vo-k"><vo-icon name="spark" size="xs"></vo-icon>Proposal</span>
|
|
415
|
+
<span>{{ r.proposal.text }}</span>
|
|
416
|
+
<span class="vo-gain">{{ r.proposal.gain ? r.proposal.gain + ': ' : '' }}{{ r.factor.label }} <b class="vo-num">{{ r.factor.earned }} → {{ r.proposal.to }}</b></span>
|
|
417
|
+
<span class="vo-acts">
|
|
418
|
+
<button type="button" class="vo-pill vo-primary vo-sm" (click)="apply(r)">Apply</button>
|
|
419
|
+
<button type="button" class="vo-pill vo-ghost vo-sm" (click)="drop(r)">Not now</button>
|
|
420
|
+
</span>
|
|
421
|
+
</div>
|
|
422
|
+
} @else {
|
|
423
|
+
<span>{{ r.factor.detail ? r.factor.detail + ' ' : '' }}{{ lostText(r) }}</span>
|
|
424
|
+
@if (r.factor.improvable) {
|
|
425
|
+
<span class="vo-acts">
|
|
426
|
+
<button type="button" class="vo-pill vo-soft vo-sm" (click)="improve(r)"><vo-icon name="spark" size="xs"></vo-icon>Improve</button>
|
|
427
|
+
</span>
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
</div>
|
|
431
|
+
</div>
|
|
432
|
+
</div>
|
|
433
|
+
</div>
|
|
434
|
+
}
|
|
435
|
+
</div>
|
|
436
|
+
</div>
|
|
437
|
+
`, styles: [".vo-sbx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-sbx-top{display:flex;align-items:center;gap:var(--vo-s-4)}.vo-sbx-g{position:relative;width:160px;height:88px;flex:none}.vo-sbx-g svg{width:100%;height:100%;overflow:visible}.vo-sbx-g path{fill:none;stroke-width:16;stroke-linecap:butt;transition:opacity .3s}.vo-sbx-g .vo-tr{stroke:var(--vo-chip)}.vo-sbx-g.vo-hov g:not(.vo-on) .vo-fl{opacity:.3}.vo-sbx-g g{cursor:default}.vo-sbx-v{position:absolute;left:0;right:0;bottom:0;display:flex;flex-direction:column;align-items:center;line-height:1.25}.vo-sbx-v b{font-size:14px;font-weight:500}.vo-sbx-v .vo-muted{font-size:11px}.vo-sbx-s{display:flex;flex-direction:column;gap:2px;font-size:13.5px;min-width:0}.vo-sbx-s b{font-weight:500}.vo-sbx-band{display:flex;align-items:baseline;gap:var(--vo-s-2);flex-wrap:wrap;font-size:12.5px}.vo-sbx-band .vo-tag{display:inline-flex}.vo-sbx-list{display:flex;flex-direction:column;gap:2px;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-sbx-r{border-radius:calc(10px * var(--vo-rk));transition:background .2s}.vo-sbx-r.vo-on,.vo-sbx-r.vo-open{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-sbx-r:hover{background:var(--vo-row)}}.vo-sbx-rh{display:grid;grid-template-columns:8px minmax(0,1fr) auto 56px 12px;align-items:center;column-gap:10px;width:100%;padding:var(--vo-s-2);font-size:13px;text-align:left}.vo-sbx-rh>i{width:8px;height:8px;border-radius:calc(2px * var(--vo-rk))}.vo-sbx-rh .vo-n{display:flex;align-items:baseline;gap:6px;min-width:0}.vo-sbx-rh .vo-n>span:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-sbx-rh .vo-tag{display:inline-flex;align-items:center;height:18px;padding-block:0;font-size:11px;line-height:1;flex:none;align-self:center}.vo-sbx-rh:focus-visible{outline-offset:-2px;border-radius:inherit}.vo-sbx-rh .vo-e{font-size:12px;color:var(--vo-fg2)}.vo-sbx-rh .vo-bar{height:5px;border-radius:calc(3px * var(--vo-rk));background:var(--vo-line);overflow:hidden}.vo-sbx-rh .vo-bar i{display:block;height:100%;width:0;border-radius:inherit;transition:width .8s var(--vo-ease)}.vo-sbx-rh>svg{color:var(--vo-muted);transition:transform .35s var(--vo-ease)}.vo-sbx-r.vo-open .vo-sbx-rh>svg{transform:rotate(90deg)}.vo-sbx-nt{grid-column:2/-1;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media (hover:hover) and (pointer:fine){.vo-sbx-r:is(:hover,.vo-on,.vo-open) .vo-sbx-nt{color:var(--vo-fg2)}}.vo-sbx-d{padding:0 var(--vo-s-2) 10px calc(var(--vo-s-2) + 18px);display:flex;flex-direction:column;gap:var(--vo-s-2);font-size:12.5px;color:var(--vo-fg2);line-height:1.5}.vo-sbx-d .vo-acts{display:flex;gap:6px;flex-wrap:wrap}.vo-sbx-pr{display:flex;flex-direction:column;gap:6px;padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-sbx-pr .vo-k{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted)}.vo-sbx-pr .vo-k .vo-i{color:var(--vo-accent-fg,var(--vo-accent))}.vo-sbx-pr .vo-gain{font-size:12px;color:var(--vo-fg2)}.vo-sbx-pr .vo-gain b{font-weight:500;color:var(--vo-ok)}.vo-sbx{container-type:inline-size}@container (max-width:340px){.vo-sbx-top{flex-direction:column;gap:var(--vo-s-2)}.vo-sbx-s{align-items:center;text-align:center}.vo-sbx-band{justify-content:center}.vo-sbx-rh{grid-template-columns:8px minmax(0,1fr) auto 12px}.vo-sbx-rh .vo-bar{display:none}}.vo-sbx-fold{display:grid;grid-template-rows:1fr;transition:grid-template-rows .3s var(--vo-ease)}.vo-sbx-fold.vo-shut{grid-template-rows:0fr}.vo-sbx-fold>div{overflow:hidden;min-height:0}\n"] }]
|
|
438
|
+
}], ctorParameters: () => [{ type: i1.ReducedMotionService }, { type: i0.ChangeDetectorRef }], propDecorators: { factors: [{
|
|
439
|
+
type: Input,
|
|
440
|
+
args: [{ required: true }]
|
|
441
|
+
}], title: [{
|
|
442
|
+
type: Input
|
|
443
|
+
}], previous: [{
|
|
444
|
+
type: Input
|
|
445
|
+
}], since: [{
|
|
446
|
+
type: Input
|
|
447
|
+
}], open: [{
|
|
448
|
+
type: Input
|
|
449
|
+
}], defaultOpen: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}], improvingLabel: [{
|
|
452
|
+
type: Input
|
|
453
|
+
}], openChange: [{
|
|
454
|
+
type: Output
|
|
455
|
+
}], improveRequest: [{
|
|
456
|
+
type: Output
|
|
457
|
+
}], applyProposal: [{
|
|
458
|
+
type: Output
|
|
459
|
+
}] } });
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcmUtYnJlYWtkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Njb3JlLWJyZWFrZG93bi9zY29yZS1icmVha2Rvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwyRUFBMkU7QUFFM0UsT0FBTyxFQUdMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUE4QnpELDZDQUE2QztBQUM3QyxNQUFNLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDN0csTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFTLEVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDakgsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQy9DLE1BQU0sRUFBRSxHQUFHLENBQUMs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VDt5SEFJMEIsT0FBTztzQkFBakMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFTyxJQUFJO3NCQUFoQixLQUFLO2dCQUlHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3Njb3JlLWJyZWFrZG93bi9zY29yZS1icmVha2Rvd24uY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3Qvc2NvcmUtYnJlYWtkb3duL1Njb3JlQnJlYWtkb3duLnRzeC5cbi8vIEEgc2NvcmUgb3V0IG9mIDEwMCB3aG9zZSBoYWxmLWNpcmNsZSBnYXVnZSBpcyBzcGxpdCBpbnRvIG9uZSBzZWdtZW50IHBlclxuLy8gZmFjdG9yLCBzaXplZCBieSBpdHMgd2VpZ2h0IGFuZCBmaWxsZWQgYnkgdGhlIHBvaW50cyBpdCBlYXJuZWQuIFRoZSByb3dzXG4vLyB1bmRlciBpdCBzYXkgd2hhdCBlYWNoIGVhcm5lZCBhbmQgd2h5LCB0aGUgd2Vha2VzdCBvbmUgaXMgZmxhZ2dlZCBpbiB3b3Jkcyxcbi8vIGFuZCBhbiBpbXByb3ZhYmxlIHJvdyBvZmZlcnMgSW1wcm92ZSwgd2hpY2ggYXNrcyBmb3IgYSBwcm9wb3NhbCB0byBhcHBseS5cbi8vIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyBjYWxsYmFja3MgYmVjb21lIEBPdXRwdXQgRXZlbnRFbWl0dGVycy4gVGhlXG4vLyBnYXVnZSBzd2VlcCwgdGhlIGNvdW50LXVwIG9mIHRoZSB0b3RhbCwgdGhlIGhvdmVyIGhpZ2hsaWdodCBhbmQgdGhlIHJvdyBmb2xkXG4vLyBhcmUgcG9ydGVkIGZyb20gdGhlIHZhbmlsbGEgSlMgKHNjb3JlLWJyZWFrZG93bi5qcykuXG4vL1xuLy8gSWNvbnM6IHRoZSBSZWFjdCBzb3VyY2UgdXNlcyBhIFwid2FuZFwiIGdseXBoIG9uIHRoZSBJbXByb3ZlIGJ1dHRvbiwgd2hpY2ggaXNcbi8vIG5vdCBpbiB0aGUgQW5ndWxhciBpY29uIHNldCwgc28gaXQgaXMgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgY2xvc2VzdCBhdmFpbGFibGVcbi8vIGdseXBoLCBcInNwYXJrXCIgKGFsc28gdXNlZCBmb3IgdGhlIHByb3Bvc2FsIG1hcmtlciwgbWF0Y2hpbmcgdGhlIHNvdXJjZSkuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIE9uZSBmYWN0b3IgdGhhdCBnb2VzIGludG8gdGhlIHNjb3JlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29yZUZhY3RvciB7XG4gIGtleTogc3RyaW5nO1xuICAvKiogTGlrZSBcIlNwZWVkXCIuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBUaGUgcG9pbnRzIGl0IGNhbiBlYXJuOyB0aGUgd2VpZ2h0cyBhZGQgdXAgdG8gMTAwLiAqL1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgLyoqIFRoZSBwb2ludHMgaXQgZWFybmVkLiAqL1xuICBlYXJuZWQ6IG51bWJlcjtcbiAgLyoqIFRoZSBhZ2VudCdzIG9uZS1saW5lIG5vdGUsIGxpa2UgXCJNZWRpYW4gcmVwbHkgNi40cywgdGFyZ2V0IHVuZGVyIDRzXCIuICovXG4gIG5vdGU6IHN0cmluZztcbiAgLyoqIEFkZHMgYW4gSW1wcm92ZSBidXR0b24gdG8gdGhlIG9wZW4gcm93LiAqL1xuICBpbXByb3ZhYmxlPzogYm9vbGVhbjtcbiAgLyoqIEEgbGluZSBzaG93biBmaXJzdCBpbiB0aGUgb3BlbiByb3csIGxpa2Ugd2hhdCB3YXMgY2hhbmdlZC4gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIGFnZW50J3MgcHJvcG9zYWwgZm9yIGFuIGltcHJvdmFibGUgZmFjdG9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY29yZVByb3Bvc2FsIHtcbiAgLyoqIFdoYXQgdGhlIGFnZW50IHdvdWxkIGNoYW5nZS4gKi9cbiAgdGV4dDogc3RyaW5nO1xuICAvKiogV2hhdCBpdCB3b3VsZCBnYWluLCBsaWtlIFwiQWJvdXQgMi4xcyBmYXN0ZXIgYSByZXBseVwiLiAqL1xuICBnYWluPzogc3RyaW5nO1xuICAvKiogVGhlIHBvaW50cyB0aGUgZmFjdG9yIHdvdWxkIGVhcm4gYWZ0ZXIgaXQuICovXG4gIHRvOiBudW1iZXI7XG59XG5cbi8vIFRoZSBjaGFydCBwYWxldHRlICgtLXZvLWMxLi5jNiksIGluIG9yZGVyLlxuY29uc3QgUEFMID0gWyd2YXIoLS12by1jMSknLCAndmFyKC0tdm8tYzIpJywgJ3ZhcigtLXZvLWMzKScsICd2YXIoLS12by1jNCknLCAndmFyKC0tdm8tYzUpJywgJ3ZhcigtLXZvLWM2KSddO1xuY29uc3QgYmFuZCA9IChzOiBudW1iZXIpOiBzdHJpbmcgPT4gKHMgPj0gOTAgPyAnRXhjZWxsZW50JyA6IHMgPj0gNzUgPyAnR29vZCcgOiBzID49IDYwID8gJ0ZhaXInIDogJ05lZWRzIHdvcmsnKTtcbmNvbnN0IENYID0gMTAwLCBDWSA9IDEwMCwgUkFEID0gODYsIEdBUCA9IDAuMDQ7XG5jb25zdCBhdCA9IChhOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdID0+IFtDWCArIE1hdGguY29zKGEpICogUkFELCBDWSArIE1hdGguc2luKGEpICogUkFEXTtcbmNvbnN0IGFyYyA9IChhMDogbnVtYmVyLCBhMTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgW3gwLCB5MF0gPSBhdChhMCksIFt4MSwgeTFdID0gYXQoYTEpO1xuICByZXR1cm4gYE0ke3gwLnRvRml4ZWQoMil9ICR7eTAudG9GaXhlZCgyKX1BJHtSQUR9ICR7UkFEfSAwIDAgMSAke3gxLnRvRml4ZWQoMil9ICR7eTEudG9GaXhlZCgyKX1gO1xufTtcblxuLyoqIFBlci1mYWN0b3IgcmVuZGVyIHN0YXRlIGhlbGQgYnkgdGhlIGNvbXBvbmVudC4gKi9cbmludGVyZmFjZSBSb3cge1xuICBmYWN0b3I6IFNjb3JlRmFjdG9yO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2xvcjogc3RyaW5nO1xuICAvKiogVGhlIHNwYW4gb2YgdGhpcyBmYWN0b3IncyBnYXVnZSBzZWdtZW50OiBbc3RhcnRBbmdsZSwgZW5kQW5nbGVdLiAqL1xuICBzZWc6IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBUaGUgdHJhY2sgYXJjIHBhdGggKHRoZSBmdWxsIHNlZ21lbnQpLiAqL1xuICB0cmFjazogc3RyaW5nO1xuICAvKiogVGhlIGZpbGxlZCBhcmMgcGF0aCwgZ3Jvd24gdG8gdGhlIHNoYXJlIGN1cnJlbnRseSBzaG93bi4gKi9cbiAgZmlsbFBhdGg6IHN0cmluZztcbiAgLyoqIFdpZHRoIG9mIHRoZSBzbWFsbCBpbmxpbmUgYmFyLCBhcyBhIENTUyBsZW5ndGguICovXG4gIGJhcldpZHRoOiBzdHJpbmc7XG4gIC8qKiBUaGUgcHJvcG9zYWwgZm9yIHRoaXMgcm93LCBcImJ1c3lcIiB3aGlsZSB0aGUgYWdlbnQgd29ya3MsIG9yIG51bGwuICovXG4gIHByb3Bvc2FsOiBTY29yZVByb3Bvc2FsIHwgJ2J1c3knIHwgbnVsbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tc2NvcmUtYnJlYWtkb3duJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBkYXRhLXZvPVwiXCIgY2xhc3M9XCJ2by1zYnggdm8tcGFuZWxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1zYngtdG9wXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInZvLXNieC1nXCJcbiAgICAgICAgICBbY2xhc3Mudm8taG92XT1cImhvdCA+PSAwXCJcbiAgICAgICAgICByb2xlPVwibWV0ZXJcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGl0bGVcIlxuICAgICAgICAgIGFyaWEtdmFsdWVtaW49XCIwXCJcbiAgICAgICAgICBhcmlhLXZhbHVlbWF4PVwiMTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cInRvdGFsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVldGV4dF09XCJ2YWx1ZVRleHQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjAwIDEwOFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgQGZvciAociBvZiByb3dzOyB0cmFjayByLmZhY3Rvci5rZXkpIHtcbiAgICAgICAgICAgICAgPGdcbiAgICAgICAgICAgICAgICBbY2xhc3Mudm8tb25dPVwiaG90ID09PSByLmluZGV4XCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmVudGVyKT1cIm9uUG9pbnRHYXVnZSgkZXZlbnQsIHIuaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cInNldEhvdCgtMSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJ2by10clwiIFthdHRyLmRdPVwici50cmFja1wiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICBAaWYgKHIuZmlsbFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwidm8tZmxcIiBbc3R5bGUuc3Ryb2tlXT1cInIuY29sb3JcIiBbYXR0ci5kXT1cInIuZmlsbFBhdGhcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXNieC12XCI+PGIgY2xhc3M9XCJ2by1udW1cIj57eyBzaG93blJvdW5kZWQgfX08L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZFwiPm9mIDEwMDwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zYngtc1wiPlxuICAgICAgICAgIDxiPnt7IHRpdGxlIH19PC9iPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc2J4LWJhbmRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyBkcmF3biA/IGJhbmRXb3JkIDogJ1Njb3JpbmcnIH19PC9zcGFuPlxuICAgICAgICAgICAgQGlmIChkZWx0YSAhPT0gbnVsbCAmJiBkcmF3bikge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZyB2by1udW1cIiBbY2xhc3Mudm8tb2tdPVwiZGVsdGEgPj0gMFwiIFtjbGFzcy52by1iYWRdPVwiZGVsdGEgPCAwXCI+XG4gICAgICAgICAgICAgICAge3sgZGVsdGEgPj0gMCA/ICcrJyA6ICfiiJInIH19e3sgYWJzRGVsdGEgfX0ge3sgc2luY2UgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJ2by1zYngtbGlzdFwiXG4gICAgICAgIChwb2ludGVybGVhdmUpPVwib25MaXN0TGVhdmUoJGV2ZW50KVwiXG4gICAgICAgIChmb2N1c291dCk9XCJvbkxpc3RGb2N1c091dCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAociBvZiByb3dzOyB0cmFjayByLmZhY3Rvci5rZXkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZvLXNieC1yXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJob3QgPT09IHIuaW5kZXhcIlxuICAgICAgICAgICAgW2NsYXNzLnZvLW9wZW5dPVwiaXNPcGVuKHIuZmFjdG9yLmtleSlcIlxuICAgICAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJvblBvaW50Um93KCRldmVudCwgci5pbmRleClcIlxuICAgICAgICAgICAgKGZvY3VzaW4pPVwic2V0SG90KHIuaW5kZXgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInZvLXNieC1yaFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuKHIuZmFjdG9yLmtleSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJvd0xhYmVsKHIpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShyLmZhY3Rvci5rZXkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgW3N0eWxlLmJhY2tncm91bmRdPVwici5jb2xvclwiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1uXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgci5mYWN0b3IubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChyLmluZGV4ID09PSB3ZWFrZXN0KSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRhZyB2by13YXJuXCI+V2Vha2VzdDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1lIHZvLW51bVwiPnt7IHIuZmFjdG9yLmVhcm5lZCB9fS97eyByLmZhY3Rvci53ZWlnaHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYmFyXCI+PGkgW3N0eWxlLmJhY2tncm91bmRdPVwici5jb2xvclwiIFtzdHlsZS53aWR0aF09XCJyLmJhcldpZHRoXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtclwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zYngtbnRcIj57eyByLmZhY3Rvci5ub3RlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tc2J4LWZvbGRcIiBbY2xhc3Mudm8tc2h1dF09XCIhaXNPcGVuKHIuZmFjdG9yLmtleSlcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tc2J4LWRcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoci5wcm9wb3NhbCA9PT0gJ2J1c3knKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zYngtcHIgdm8tZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWtcIj48dm8taWNvbiBuYW1lPVwic3BhcmtcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4gY2xhc3M9XCJ2by1zaGltXCI+e3sgaW1wcm92aW5nTGFiZWwgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKHIucHJvcG9zYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXNieC1wclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8ta1wiPjx2by1pY29uIG5hbWU9XCJzcGFya1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5Qcm9wb3NhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyByLnByb3Bvc2FsLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1nYWluXCI+e3sgci5wcm9wb3NhbC5nYWluID8gci5wcm9wb3NhbC5nYWluICsgJzogJyA6ICcnIH19e3sgci5mYWN0b3IubGFiZWwgfX0gPGIgY2xhc3M9XCJ2by1udW1cIj57eyByLmZhY3Rvci5lYXJuZWQgfX0g4oaSIHt7IHIucHJvcG9zYWwudG8gfX08L2I+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWN0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXByaW1hcnkgdm8tc21cIiAoY2xpY2spPVwiYXBwbHkocilcIj5BcHBseTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWdob3N0IHZvLXNtXCIgKGNsaWNrKT1cImRyb3AocilcIj5Ob3Qgbm93PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyByLmZhY3Rvci5kZXRhaWwgPyByLmZhY3Rvci5kZXRhaWwgKyAnICcgOiAnJyB9fXt7IGxvc3RUZXh0KHIpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHIuZmFjdG9yLmltcHJvdmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFjdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1zb2Z0IHZvLXNtXCIgKGNsaWNrKT1cImltcHJvdmUocilcIj48dm8taWNvbiBuYW1lPVwic3BhcmtcIiBzaXplPVwieHNcIj48L3ZvLWljb24+SW1wcm92ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3Njb3JlLWJyZWFrZG93bi5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTY29yZUJyZWFrZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGZhY3RvcnM6IFNjb3JlRmFjdG9yW10gPSBbXTtcbiAgQElucHV0KCkgdGl0bGUgPSAnUXVhbGl0eSBzY29yZSc7XG4gIC8qKiBMYXN0IHBlcmlvZCdzIHNjb3JlLCBmb3IgdGhlIGNoYW5nZSBiZXNpZGUgdGhlIGJhbmQgd29yZC4gKi9cbiAgQElucHV0KCkgcHJldmlvdXM/OiBudW1iZXI7XG4gIC8qKiBXaGF0IHRoZSBjaGFuZ2UgaXMgbWVhc3VyZWQgYWdhaW5zdCAoXCJzaW5jZSBsYXN0IHdlZWtcIikuICovXG4gIEBJbnB1dCgpIHNpbmNlID0gJ3NpbmNlIGxhc3Qgd2Vlayc7XG4gIC8qKiBUaGUgb3BlbiByb3dzLCBieSBrZXkuIExlYXZlIGl0IG91dCB0byBsZXQgY2xpY2tzIG9wZW4gYW5kIGNsb3NlIHJvd3MuICovXG4gIEBJbnB1dCgpIHNldCBvcGVuKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY29udHJvbGxlZCA9IHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRoaXMub3BlbmVkID0gWy4uLnZhbHVlXTtcbiAgfVxuICBASW5wdXQoKSBkZWZhdWx0T3Blbjogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFdoYXQgdGhlIHJvdyBzYXlzIHdoaWxlIHRoZSBhZ2VudCB3b3JrcyBvbiBhIHByb3Bvc2FsLiAqL1xuICBASW5wdXQoKSBpbXByb3ZpbmdMYWJlbCA9ICdMb29raW5nIGludG8gaXQnO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSByb3cgb3BlbnMgb3IgY2xvc2VzICh3aGVuIHVuY29udHJvbGxlZCkuICovXG4gIEBPdXRwdXQoKSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgLyoqIENhbGxlZCBieSBJbXByb3ZlOyByZXR1cm4gKG9yIHJlc29sdmUpIHRoZSBhZ2VudCdzIHByb3Bvc2FsLiAqL1xuICBAT3V0cHV0KCkgaW1wcm92ZVJlcXVlc3QgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmFjdG9yOiBTY29yZUZhY3RvcjsgcmVzb2x2ZTogKHA6IFNjb3JlUHJvcG9zYWwpID0+IHZvaWQgfT4oKTtcbiAgLyoqIENhbGxlZCBieSBBcHBseSBvbiBhIHByb3Bvc2FsOyB1cGRhdGUgdGhlIGZhY3RvcidzIGVhcm5lZCBhbmQgbm90ZS4gKi9cbiAgQE91dHB1dCgpIGFwcGx5UHJvcG9zYWwgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmFjdG9yOiBTY29yZUZhY3RvcjsgcHJvcG9zYWw6IFNjb3JlUHJvcG9zYWwgfT4oKTtcblxuICAvLyBleHBvc2VkIHRvIHRoZSB0ZW1wbGF0ZVxuICByb3dzOiBSb3dbXSA9IFtdO1xuICBob3QgPSAtMTtcbiAgd2Vha2VzdCA9IDA7XG4gIHRvdGFsID0gMDtcbiAgZHJhd24gPSBmYWxzZTtcbiAgc2hvd25Sb3VuZGVkID0gMDtcbiAgYmFuZFdvcmQgPSAnJztcbiAgZGVsdGE6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBhYnNEZWx0YSA9IDA7XG5cbiAgcHJpdmF0ZSBvcGVuZWQ6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY29udHJvbGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xuICBwcml2YXRlIGZyYW1lczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZHVjZWQ6IFJlZHVjZWRNb3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkgdGhpcy5vcGVuZWQgPSBbLi4udGhpcy5kZWZhdWx0T3Blbl07XG4gICAgdGhpcy50b3RhbCA9IHRoaXMuZmFjdG9ycy5yZWR1Y2UoKHQsIGYpID0+IHQgKyBmLmVhcm5lZCwgMCk7XG4gICAgdGhpcy53ZWFrZXN0ID0gdGhpcy5mYWN0b3JzLnJlZHVjZShcbiAgICAgIChtLCBmLCBpKSA9PiAoZi5lYXJuZWQgLyBmLndlaWdodCA8IHRoaXMuZmFjdG9yc1ttXS5lYXJuZWQgLyB0aGlzLmZhY3RvcnNbbV0ud2VpZ2h0ID8gaSA6IG0pLFxuICAgICAgMCxcbiAgICApO1xuICAgIHRoaXMuYmFuZFdvcmQgPSBiYW5kKHRoaXMudG90YWwpO1xuICAgIHRoaXMuZGVsdGEgPSB0aGlzLnByZXZpb3VzID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy50b3RhbCAtIHRoaXMucHJldmlvdXM7XG4gICAgdGhpcy5hYnNEZWx0YSA9IHRoaXMuZGVsdGEgPT09IG51bGwgPyAwIDogTWF0aC5hYnModGhpcy5kZWx0YSk7XG5cbiAgICAvLyBsYXkgb3V0IHRoZSBnYXVnZTogYSBoYWxmIGNpcmNsZSBzcGxpdCBieSB3ZWlnaHQgd2l0aCBhIHNtYWxsIGdhcFxuICAgIGxldCBhID0gTWF0aC5QSTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLmZhY3RvcnMubWFwKChmYWN0b3IsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzcGFuID0gKGZhY3Rvci53ZWlnaHQgLyAxMDApICogTWF0aC5QSTtcbiAgICAgIGNvbnN0IHNlZzogW251bWJlciwgbnVtYmVyXSA9IFthICsgR0FQIC8gMiwgYSArIHNwYW4gLSBHQVAgLyAyXTtcbiAgICAgIGEgKz0gc3BhbjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZhY3RvcixcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIGNvbG9yOiBQQUxbaW5kZXggJSBQQUwubGVuZ3RoXSxcbiAgICAgICAgc2VnLFxuICAgICAgICB0cmFjazogYXJjKHNlZ1swXSwgc2VnWzFdKSxcbiAgICAgICAgZmlsbFBhdGg6ICcnLFxuICAgICAgICBiYXJXaWR0aDogJzAnLFxuICAgICAgICBwcm9wb3NhbDogbnVsbCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgaWYgKHRoaXMucmVkdWNlZC5yZWR1Y2UoKSkge1xuICAgICAgdGhpcy5zaG93blJvdW5kZWQgPSB0aGlzLnRvdGFsO1xuICAgICAgdGhpcy5kcmF3biA9IHRydWU7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgocikgPT4gdGhpcy5maWxsVG8ociwgci5mYWN0b3IuZWFybmVkIC8gci5mYWN0b3Iud2VpZ2h0KSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhIG1vbWVudCBhZnRlciB0aGUgZ2F1Z2UgYXBwZWFycywgdGhlIHNlZ21lbnRzIHN3ZWVwIGluIGFuZCB0aGUgdG90YWwgY291bnRzIHVwXG4gICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICB0aGlzLmRyYXduID0gdHJ1ZTtcbiAgICAgIHRoaXMuY291bnQodGhpcy50b3RhbCk7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgociwgaSkgPT4gdGhpcy5zd2VlcChyLCBpICogMTIwKSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9LCAyODApO1xuICB9XG5cbiAgLy8gLS0tIGdhdWdlIGRyYXdpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBmaWxsVG8ocjogUm93LCBwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBbYTAsIGExXSA9IHIuc2VnO1xuICAgIHIuZmlsbFBhdGggPSBwID4gMCA/IGFyYyhhMCwgYTAgKyAoYTEgLSBhMCkgKiBNYXRoLm1pbigxLCBwKSkgOiAnJztcbiAgICByLmJhcldpZHRoID0gcCAqIDEwMCArICclJztcbiAgfVxuXG4gIC8vIGVhc2VzIG9uZSBzZWdtZW50J3MgZmlsbCB1cCB0byBpdHMgc2hhcmUgb3ZlciB+OTAwbXMsIGxpa2UgdGhlIHZhbmlsbGEgdHdlZW5cbiAgcHJpdmF0ZSBzd2VlcChyOiBSb3csIGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSByLmZhY3Rvci5lYXJuZWQgLyByLmZhY3Rvci53ZWlnaHQ7XG4gICAgY29uc3QgZHVyID0gOTAwO1xuICAgIHRoaXMubGF0ZXIoKCkgPT4ge1xuICAgICAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIGNvbnN0IHN0ZXAgPSAodDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAodCAtIHQwKSAvIGR1cikpO1xuICAgICAgICB0aGlzLmZpbGxUbyhyLCB0YXJnZXQgKiAoMSAtIE1hdGgucG93KDEgLSBwLCAzKSkpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgaWYgKHAgPCAxKSB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5mcmFtZXMucHVzaChyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCkpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIC8vIGVhc2VzIHRoZSBjZW50cmUgbnVtYmVyIHVwIHRvIHRoZSB0b3RhbCBvdmVyIH4xMDAwbXNcbiAgcHJpdmF0ZSBjb3VudCh0YXJnZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHQwID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZHVyID0gMTAwMDtcbiAgICBjb25zdCBzdGVwID0gKHQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsICh0IC0gdDApIC8gZHVyKSk7XG4gICAgICB0aGlzLnNob3duUm91bmRlZCA9IE1hdGgucm91bmQodGFyZ2V0ICogKDEgLSBNYXRoLnBvdygxIC0gcCwgMykpKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgaWYgKHAgPCAxKSB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSk7XG4gICAgfTtcbiAgICB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSk7XG4gIH1cblxuICAvLyAtLS0gdGVtcGxhdGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICB2YWx1ZVRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gYCR7dGhpcy50b3RhbH0gb2YgMTAwLCAke2JhbmQodGhpcy50b3RhbCkudG9Mb3dlckNhc2UoKX1gO1xuICAgIGlmICh0aGlzLmRlbHRhID09PSBudWxsKSByZXR1cm4gYmFzZTtcbiAgICByZXR1cm4gYCR7YmFzZX0sICR7dGhpcy5kZWx0YSA+PSAwID8gJ3VwJyA6ICdkb3duJ30gJHtNYXRoLmFicyh0aGlzLmRlbHRhKX0gJHt0aGlzLnNpbmNlfWA7XG4gIH1cblxuICByb3dMYWJlbChyOiBSb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtyLmZhY3Rvci5sYWJlbH06ICR7ci5mYWN0b3IuZWFybmVkfSBvZiAke3IuZmFjdG9yLndlaWdodH0gcG9pbnRzJHtyLmluZGV4ID09PSB0aGlzLndlYWtlc3QgPyAnLCB3ZWFrZXN0JyA6ICcnfS4gJHtyLmZhY3Rvci5ub3RlfWA7XG4gIH1cblxuICBsb3N0VGV4dChyOiBSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvc3QgPSByLmZhY3Rvci53ZWlnaHQgLSByLmZhY3Rvci5lYXJuZWQ7XG4gICAgY29uc3QgYmFzZSA9IGxvc3QgPyBgTG9zZXMgJHtsb3N0fSBvZiBpdHMgJHtyLmZhY3Rvci53ZWlnaHR9IHBvaW50c2AgOiAnRnVsbCBtYXJrcyc7XG4gICAgcmV0dXJuIGJhc2UgKyAoci5pbmRleCA9PT0gdGhpcy53ZWFrZXN0ICYmIGxvc3QgPyAnLCB0aGUgbW9zdCBvZiBhbnkgZmFjdG9yIGZvciBpdHMgd2VpZ2h0LicgOiAnLicpO1xuICB9XG5cbiAgaXNPcGVuKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbmVkLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICB0b2dnbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vcGVuZWQuaW5jbHVkZXMoa2V5KSA/IHRoaXMub3BlbmVkLmZpbHRlcigoaykgPT4gayAhPT0ga2V5KSA6IFsuLi50aGlzLm9wZW5lZCwga2V5XTtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkgdGhpcy5vcGVuZWQgPSBuZXh0O1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KG5leHQpO1xuICB9XG5cbiAgLy8gLS0tIGhvdmVyIGhpZ2hsaWdodCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgc2V0SG90KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhvdCA9IGluZGV4O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25Qb2ludEdhdWdlKGU6IFBvaW50ZXJFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnKSB0aGlzLnNldEhvdChpbmRleCk7XG4gIH1cblxuICBvblBvaW50Um93KGU6IFBvaW50ZXJFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSAndG91Y2gnKSB0aGlzLnNldEhvdChpbmRleCk7XG4gIH1cblxuICBvbkxpc3RMZWF2ZShlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghZWwuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHRoaXMuc2V0SG90KC0xKTtcbiAgfVxuXG4gIG9uTGlzdEZvY3VzT3V0KGU6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWVsLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgdGhpcy5zZXRIb3QoLTEpO1xuICB9XG5cbiAgLy8gLS0tIGltcHJvdmUgLyBhcHBseSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaW1wcm92ZShyOiBSb3cpOiB2b2lkIHtcbiAgICByLnByb3Bvc2FsID0gJ2J1c3knO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuaW1wcm92ZVJlcXVlc3QuZW1pdCh7XG4gICAgICBmYWN0b3I6IHIuZmFjdG9yLFxuICAgICAgcmVzb2x2ZTogKHA6IFNjb3JlUHJvcG9zYWwpID0+IHtcbiAgICAgICAgci5wcm9wb3NhbCA9IHA7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGx5KHI6IFJvdyk6IHZvaWQge1xuICAgIGNvbnN0IHAgPSByLnByb3Bvc2FsO1xuICAgIGlmICghcCB8fCBwID09PSAnYnVzeScpIHJldHVybjtcbiAgICByLnByb3Bvc2FsID0gbnVsbDtcbiAgICB0aGlzLmFwcGx5UHJvcG9zYWwuZW1pdCh7IGZhY3Rvcjogci5mYWN0b3IsIHByb3Bvc2FsOiBwIH0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZHJvcChyOiBSb3cpOiB2b2lkIHtcbiAgICByLnByb3Bvc2FsID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbGF0ZXIoZm46ICgpID0+IHZvaWQsIG1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVycy5wdXNoKHNldFRpbWVvdXQoZm4sIG1zKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVycy5mb3JFYWNoKGNsZWFyVGltZW91dCk7XG4gICAgdGhpcy5mcmFtZXMuZm9yRWFjaChjYW5jZWxBbmltYXRpb25GcmFtZSk7XG4gICAgdGhpcy50aW1lcnMgPSBbXTtcbiAgICB0aGlzLmZyYW1lcyA9IFtdO1xuICB9XG59XG4iXX0=
|