@ngstato/angular 0.4.0 → 0.4.2
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/dist/README.md +161 -394
- package/dist/devtools.component.d.ts +15 -1
- package/dist/esm2022/create-angular-store.mjs +45 -9
- package/dist/esm2022/devtools.component.mjs +255 -45
- package/dist/fesm2022/ngstato-angular.mjs +297 -51
- package/dist/fesm2022/ngstato-angular.mjs.map +1 -1
- package/package.json +62 -63
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Component, signal } from '@angular/core';
|
|
1
|
+
import { Component, signal, computed } from '@angular/core';
|
|
2
2
|
import { devTools } from '@ngstato/core';
|
|
3
|
-
import { JsonPipe } from '@angular/common';
|
|
3
|
+
import { JsonPipe, KeyValuePipe } from '@angular/common';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export class StatoDevToolsComponent {
|
|
6
6
|
unsub;
|
|
@@ -10,11 +10,36 @@ export class StatoDevToolsComponent {
|
|
|
10
10
|
activeTab = signal('actions');
|
|
11
11
|
logs = signal([]);
|
|
12
12
|
selectedLog = signal(null);
|
|
13
|
-
|
|
13
|
+
activeLogId = signal(null);
|
|
14
|
+
isTimeTraveling = signal(false);
|
|
15
|
+
// Snapshot global — latest known state per store
|
|
16
|
+
globalState = computed(() => {
|
|
17
|
+
const seen = new Map();
|
|
18
|
+
for (const log of this.logs()) {
|
|
19
|
+
if (!seen.has(log.storeName)) {
|
|
20
|
+
seen.set(log.storeName, log.nextState);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return seen;
|
|
24
|
+
});
|
|
25
|
+
// Time-travel computed
|
|
26
|
+
canUndo = computed(() => this.logs().length > 0);
|
|
27
|
+
canRedo = computed(() => {
|
|
28
|
+
if (!this.isTimeTraveling())
|
|
29
|
+
return false;
|
|
30
|
+
const id = this.activeLogId();
|
|
31
|
+
if (id === null)
|
|
32
|
+
return false;
|
|
33
|
+
if (id === -1)
|
|
34
|
+
return this.logs().length > 0;
|
|
35
|
+
const idx = this.logs().findIndex(l => l.id === id);
|
|
36
|
+
return idx > 0; // can go forward (lower index = newer)
|
|
37
|
+
});
|
|
38
|
+
// Position & size
|
|
14
39
|
posX = signal(24);
|
|
15
|
-
posY = signal(window.innerHeight -
|
|
16
|
-
panelWidth = signal(
|
|
17
|
-
panelHeight = signal(
|
|
40
|
+
posY = signal(window.innerHeight - 520);
|
|
41
|
+
panelWidth = signal(440);
|
|
42
|
+
panelHeight = signal(480);
|
|
18
43
|
// Drag state
|
|
19
44
|
isDragging = false;
|
|
20
45
|
isResizing = false;
|
|
@@ -31,6 +56,8 @@ export class StatoDevToolsComponent {
|
|
|
31
56
|
this.unsub = devTools.subscribe((state) => {
|
|
32
57
|
this.logs.set(state.logs);
|
|
33
58
|
this.isOpen.set(state.isOpen);
|
|
59
|
+
this.activeLogId.set(state.activeLogId);
|
|
60
|
+
this.isTimeTraveling.set(state.isTimeTraveling);
|
|
34
61
|
});
|
|
35
62
|
document.addEventListener('mousemove', this.boundMouseMove);
|
|
36
63
|
document.addEventListener('mouseup', this.boundMouseUp);
|
|
@@ -50,6 +77,65 @@ export class StatoDevToolsComponent {
|
|
|
50
77
|
formatTime(iso) {
|
|
51
78
|
return new Date(iso).toTimeString().slice(0, 8);
|
|
52
79
|
}
|
|
80
|
+
// ── Time-travel actions ────────────────────────────
|
|
81
|
+
onTravelTo(log) {
|
|
82
|
+
// Toggle detail view
|
|
83
|
+
this.selectLog(log);
|
|
84
|
+
// Jump to this action's state
|
|
85
|
+
devTools.travelTo(log.id);
|
|
86
|
+
}
|
|
87
|
+
onUndo() { devTools.undo(); }
|
|
88
|
+
onRedo() { devTools.redo(); }
|
|
89
|
+
onResume() { devTools.resume(); }
|
|
90
|
+
onReplay(log, event) {
|
|
91
|
+
event.stopPropagation();
|
|
92
|
+
devTools.replay(log.id);
|
|
93
|
+
}
|
|
94
|
+
isFutureLog(log) {
|
|
95
|
+
if (!this.isTimeTraveling())
|
|
96
|
+
return false;
|
|
97
|
+
const activeId = this.activeLogId();
|
|
98
|
+
if (activeId === null)
|
|
99
|
+
return false;
|
|
100
|
+
if (activeId === -1)
|
|
101
|
+
return true; // all logs are "future"
|
|
102
|
+
const activeIdx = this.logs().findIndex(l => l.id === activeId);
|
|
103
|
+
const logIdx = this.logs().findIndex(l => l.id === log.id);
|
|
104
|
+
return logIdx < activeIdx; // newer logs (lower index) are "future"
|
|
105
|
+
}
|
|
106
|
+
// ── Export/Import ──────────────────────────────────
|
|
107
|
+
onExport() {
|
|
108
|
+
const snapshot = devTools.exportSnapshot();
|
|
109
|
+
const json = JSON.stringify(snapshot, null, 2);
|
|
110
|
+
const blob = new Blob([json], { type: 'application/json' });
|
|
111
|
+
const url = URL.createObjectURL(blob);
|
|
112
|
+
const a = document.createElement('a');
|
|
113
|
+
a.href = url;
|
|
114
|
+
a.download = `ngstato-snapshot-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.json`;
|
|
115
|
+
a.click();
|
|
116
|
+
URL.revokeObjectURL(url);
|
|
117
|
+
}
|
|
118
|
+
onImport() {
|
|
119
|
+
const input = document.querySelector('input[type="file"]');
|
|
120
|
+
input?.click();
|
|
121
|
+
}
|
|
122
|
+
onFileSelected(event) {
|
|
123
|
+
const file = event.target.files?.[0];
|
|
124
|
+
if (!file)
|
|
125
|
+
return;
|
|
126
|
+
const reader = new FileReader();
|
|
127
|
+
reader.onload = () => {
|
|
128
|
+
try {
|
|
129
|
+
const snapshot = JSON.parse(reader.result);
|
|
130
|
+
devTools.importSnapshot(snapshot);
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
console.error('[ngStato DevTools] Invalid snapshot file:', e);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
reader.readAsText(file);
|
|
137
|
+
event.target.value = '';
|
|
138
|
+
}
|
|
53
139
|
// ── Drag ───────────────────────────────────────────
|
|
54
140
|
onDragStart(e) {
|
|
55
141
|
if (e.target.classList.contains('btn-icon'))
|
|
@@ -88,8 +174,8 @@ export class StatoDevToolsComponent {
|
|
|
88
174
|
this.isResizing = false;
|
|
89
175
|
}
|
|
90
176
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StatoDevToolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
91
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StatoDevToolsComponent, isStandalone: true, selector: "ngstato-devtools", ngImport: i0, template: `
|
|
92
|
-
<!--
|
|
177
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StatoDevToolsComponent, isStandalone: true, selector: "ngstato-devtools, stato-devtools", ngImport: i0, template: `
|
|
178
|
+
<!-- Floating button -->
|
|
93
179
|
@if (!isOpen()) {
|
|
94
180
|
<button class="devtools-fab" (click)="toggle()">
|
|
95
181
|
🛠 Stato
|
|
@@ -103,7 +189,7 @@ export class StatoDevToolsComponent {
|
|
|
103
189
|
[class.devtools-panel--minimized]="isMinimized()"
|
|
104
190
|
[style.left.px]="posX()"
|
|
105
191
|
[style.top.px]="posY()"
|
|
106
|
-
[style.width.px]="isMinimized() ?
|
|
192
|
+
[style.width.px]="isMinimized() ? 220 : panelWidth()"
|
|
107
193
|
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
108
194
|
>
|
|
109
195
|
|
|
@@ -112,19 +198,24 @@ export class StatoDevToolsComponent {
|
|
|
112
198
|
class="devtools-header"
|
|
113
199
|
(mousedown)="onDragStart($event)"
|
|
114
200
|
>
|
|
115
|
-
<span class="devtools-title"
|
|
201
|
+
<span class="devtools-title">
|
|
202
|
+
🛠 Stato
|
|
203
|
+
@if (isTimeTraveling()) {
|
|
204
|
+
<span class="tt-badge">TIME-TRAVEL</span>
|
|
205
|
+
}
|
|
206
|
+
</span>
|
|
116
207
|
<div class="devtools-header-actions">
|
|
117
208
|
@if (!isMinimized()) {
|
|
118
|
-
<button class="btn-icon" (click)="clear()" title="
|
|
209
|
+
<button class="btn-icon" (click)="clear()" title="Clear">🗑</button>
|
|
119
210
|
}
|
|
120
|
-
<button class="btn-icon" (click)="toggleMinimize()" title="
|
|
211
|
+
<button class="btn-icon" (click)="toggleMinimize()" title="Minimize">
|
|
121
212
|
{{ isMinimized() ? '▲' : '▼' }}
|
|
122
213
|
</button>
|
|
123
|
-
<button class="btn-icon" (click)="toggle()" title="
|
|
214
|
+
<button class="btn-icon" (click)="toggle()" title="Close">✕</button>
|
|
124
215
|
</div>
|
|
125
216
|
</div>
|
|
126
217
|
|
|
127
|
-
<!-- Resize handle
|
|
218
|
+
<!-- Resize handle -->
|
|
128
219
|
@if (!isMinimized()) {
|
|
129
220
|
<div
|
|
130
221
|
class="devtools-resize"
|
|
@@ -152,17 +243,55 @@ export class StatoDevToolsComponent {
|
|
|
152
243
|
</button>
|
|
153
244
|
</div>
|
|
154
245
|
|
|
155
|
-
<!--
|
|
246
|
+
<!-- Time-travel toolbar -->
|
|
247
|
+
@if (activeTab() === 'actions' && logs().length) {
|
|
248
|
+
<div class="tt-toolbar">
|
|
249
|
+
<button
|
|
250
|
+
class="tt-btn"
|
|
251
|
+
(click)="onUndo()"
|
|
252
|
+
[disabled]="!canUndo()"
|
|
253
|
+
title="Undo (step back)"
|
|
254
|
+
>⏪</button>
|
|
255
|
+
<button
|
|
256
|
+
class="tt-btn"
|
|
257
|
+
(click)="onRedo()"
|
|
258
|
+
[disabled]="!canRedo()"
|
|
259
|
+
title="Redo (step forward)"
|
|
260
|
+
>⏩</button>
|
|
261
|
+
@if (isTimeTraveling()) {
|
|
262
|
+
<button
|
|
263
|
+
class="tt-btn tt-btn--resume"
|
|
264
|
+
(click)="onResume()"
|
|
265
|
+
title="Resume live state"
|
|
266
|
+
>▶ Live</button>
|
|
267
|
+
}
|
|
268
|
+
<div class="tt-spacer"></div>
|
|
269
|
+
<button
|
|
270
|
+
class="tt-btn tt-btn--export"
|
|
271
|
+
(click)="onExport()"
|
|
272
|
+
title="Export state snapshot (JSON)"
|
|
273
|
+
>📤</button>
|
|
274
|
+
<button
|
|
275
|
+
class="tt-btn tt-btn--import"
|
|
276
|
+
(click)="onImport()"
|
|
277
|
+
title="Import state snapshot"
|
|
278
|
+
>📥</button>
|
|
279
|
+
</div>
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
<!-- Tab: Actions -->
|
|
156
283
|
@if (activeTab() === 'actions') {
|
|
157
284
|
<div class="devtools-content">
|
|
158
285
|
@if (!logs().length) {
|
|
159
|
-
<div class="devtools-empty">
|
|
286
|
+
<div class="devtools-empty">No actions yet</div>
|
|
160
287
|
}
|
|
161
288
|
@for (log of logs(); track log.id) {
|
|
162
289
|
<div
|
|
163
290
|
class="log-item"
|
|
164
291
|
[class.log-item--error]="log.status === 'error'"
|
|
165
|
-
|
|
292
|
+
[class.log-item--active]="activeLogId() === log.id"
|
|
293
|
+
[class.log-item--future]="isFutureLog(log)"
|
|
294
|
+
(click)="onTravelTo(log)"
|
|
166
295
|
>
|
|
167
296
|
<div class="log-item__left">
|
|
168
297
|
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
@@ -170,11 +299,16 @@ export class StatoDevToolsComponent {
|
|
|
170
299
|
</div>
|
|
171
300
|
<div class="log-item__right">
|
|
172
301
|
@if (log.status === 'error') {
|
|
173
|
-
<span class="log-error-badge">
|
|
302
|
+
<span class="log-error-badge">error</span>
|
|
174
303
|
} @else {
|
|
175
304
|
<span class="log-duration">{{ log.duration }}ms</span>
|
|
176
305
|
}
|
|
177
306
|
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
307
|
+
<button
|
|
308
|
+
class="btn-icon btn-replay"
|
|
309
|
+
(click)="onReplay(log, $event)"
|
|
310
|
+
title="Replay this action"
|
|
311
|
+
>🔄</button>
|
|
178
312
|
</div>
|
|
179
313
|
</div>
|
|
180
314
|
|
|
@@ -184,11 +318,11 @@ export class StatoDevToolsComponent {
|
|
|
184
318
|
<div class="log-detail__error">{{ log.error }}</div>
|
|
185
319
|
}
|
|
186
320
|
<div class="log-detail__section">
|
|
187
|
-
<span class="log-detail__label">
|
|
321
|
+
<span class="log-detail__label">Before</span>
|
|
188
322
|
<pre>{{ log.prevState | json }}</pre>
|
|
189
323
|
</div>
|
|
190
324
|
<div class="log-detail__section">
|
|
191
|
-
<span class="log-detail__label">
|
|
325
|
+
<span class="log-detail__label">After</span>
|
|
192
326
|
<pre>{{ log.nextState | json }}</pre>
|
|
193
327
|
</div>
|
|
194
328
|
</div>
|
|
@@ -197,13 +331,18 @@ export class StatoDevToolsComponent {
|
|
|
197
331
|
</div>
|
|
198
332
|
}
|
|
199
333
|
|
|
200
|
-
<!-- Tab State -->
|
|
334
|
+
<!-- Tab: State -->
|
|
201
335
|
@if (activeTab() === 'state') {
|
|
202
336
|
<div class="devtools-content">
|
|
203
|
-
@if (
|
|
204
|
-
|
|
337
|
+
@if (globalState().size) {
|
|
338
|
+
@for (entry of globalState() | keyvalue; track entry.key) {
|
|
339
|
+
<div class="state-store-block">
|
|
340
|
+
<div class="state-store-name">{{ entry.key }}</div>
|
|
341
|
+
<pre class="state-view">{{ entry.value | json }}</pre>
|
|
342
|
+
</div>
|
|
343
|
+
}
|
|
205
344
|
} @else {
|
|
206
|
-
<div class="devtools-empty">
|
|
345
|
+
<div class="devtools-empty">No state available</div>
|
|
207
346
|
}
|
|
208
347
|
</div>
|
|
209
348
|
}
|
|
@@ -211,12 +350,21 @@ export class StatoDevToolsComponent {
|
|
|
211
350
|
|
|
212
351
|
</div>
|
|
213
352
|
}
|
|
214
|
-
|
|
353
|
+
|
|
354
|
+
<!-- Hidden file input for import -->
|
|
355
|
+
<input
|
|
356
|
+
#fileInput
|
|
357
|
+
type="file"
|
|
358
|
+
accept=".json"
|
|
359
|
+
style="display: none"
|
|
360
|
+
(change)="onFileSelected($event)"
|
|
361
|
+
/>
|
|
362
|
+
`, isInline: true, styles: [":host{font-family:system-ui,-apple-system,sans-serif}.devtools-fab{position:fixed;bottom:1.5rem;left:1.5rem;background:#1e293b;color:#fff;border:none;border-radius:999px;padding:.5rem 1rem;font-size:.85rem;font-weight:600;cursor:pointer;z-index:9999;box-shadow:0 4px 12px #0000004d;transition:background .15s}.devtools-fab:hover{background:#334155}.devtools-panel{position:fixed;background:#0f172a;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;display:flex;flex-direction:column;overflow:hidden;font-family:Courier New,monospace;min-width:200px;min-height:40px;border:1px solid #1e293b}.devtools-panel--minimized{border-radius:8px}.devtools-header{display:flex;justify-content:space-between;align-items:center;padding:.6rem .75rem;background:#1e293b;border-bottom:1px solid #334155;cursor:grab;-webkit-user-select:none;user-select:none}.devtools-header:active{cursor:grabbing}.devtools-title{color:#e2e8f0;font-size:.82rem;font-weight:600;font-family:system-ui;display:flex;align-items:center;gap:.4rem}.tt-badge{background:#7c3aed;color:#fff;font-size:.6rem;padding:.12rem .4rem;border-radius:4px;font-weight:700;letter-spacing:.05em;animation:tt-pulse 1.5s ease-in-out infinite}@keyframes tt-pulse{0%,to{opacity:1}50%{opacity:.6}}.devtools-header-actions{display:flex;gap:.25rem}.btn-icon{background:transparent;color:#64748b;border:none;cursor:pointer;font-size:.8rem;padding:.15rem .35rem;border-radius:4px;line-height:1}.btn-icon:hover{background:#334155;color:#fff}.devtools-resize{position:absolute;bottom:2px;right:4px;color:#334155;font-size:.9rem;cursor:nwse-resize;-webkit-user-select:none;user-select:none;line-height:1}.devtools-resize:hover{color:#64748b}.devtools-tabs{display:flex;background:#1e293b;border-bottom:1px solid #334155}.tab{padding:.4rem .75rem;background:transparent;color:#64748b;border:none;cursor:pointer;font-size:.78rem;font-family:system-ui;transition:color .15s}.tab:hover{color:#e2e8f0}.tab--active{color:#3b82f6;border-bottom:2px solid #3b82f6}.tt-toolbar{display:flex;align-items:center;gap:.2rem;padding:.3rem .5rem;background:#0f172a;border-bottom:1px solid #1e293b}.tt-btn{background:#1e293b;border:1px solid #334155;color:#94a3b8;padding:.2rem .5rem;border-radius:4px;font-size:.72rem;cursor:pointer;transition:all .15s;font-family:system-ui}.tt-btn:hover:not(:disabled){background:#334155;color:#e2e8f0;border-color:#475569}.tt-btn:disabled{opacity:.3;cursor:not-allowed}.tt-btn--resume{background:#7c3aed;border-color:#7c3aed;color:#fff;font-weight:600}.tt-btn--resume:hover:not(:disabled){background:#6d28d9}.tt-btn--export,.tt-btn--import{font-size:.68rem}.tt-spacer{flex:1}.devtools-content{overflow-y:auto;flex:1;padding:.25rem 0}.devtools-empty{padding:2rem;text-align:center;color:#475569;font-size:.78rem;font-family:system-ui}.log-item{display:flex;justify-content:space-between;align-items:center;padding:.35rem .75rem;cursor:pointer;border-bottom:1px solid #1e293b;transition:background .1s}.log-item:hover{background:#1e293b}.log-item--error{background:#1a0a0a}.log-item--active{background:#1e1b4b!important;border-left:3px solid #7c3aed}.log-item--future{opacity:.35}.log-item__left{display:flex;align-items:center;gap:.4rem;overflow:hidden;flex:1}.log-item__right{display:flex;align-items:center;gap:.35rem;flex-shrink:0}.log-status{font-size:.72rem;color:#22c55e;flex-shrink:0}.log-item--error .log-status{color:#ef4444}.log-name{color:#e2e8f0;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.log-duration{color:#64748b;font-size:.7rem}.log-time{color:#475569;font-size:.68rem}.log-error-badge{background:#7f1d1d;color:#fca5a5;font-size:.68rem;padding:.1rem .35rem;border-radius:4px}.btn-replay{font-size:.65rem;opacity:.5}.btn-replay:hover{opacity:1}.log-detail{background:#0a0f1a;padding:.6rem .75rem;border-left:3px solid #3b82f6;margin:0 .4rem .4rem;border-radius:0 4px 4px 0}.log-detail__error{color:#fca5a5;font-size:.72rem;margin-bottom:.4rem}.log-detail__section{margin-bottom:.4rem}.log-detail__label{color:#64748b;font-size:.68rem;display:block;margin-bottom:.2rem;font-family:system-ui}pre{color:#86efac;font-size:.7rem;margin:0;white-space:pre-wrap;word-break:break-all;max-height:140px;overflow-y:auto}.state-store-block{border-bottom:1px solid #1e293b}.state-store-block:last-child{border-bottom:none}.state-store-name{padding:.4rem .75rem .2rem;color:#3b82f6;font-size:.72rem;font-family:system-ui;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.state-view{color:#86efac;font-size:.7rem;padding:.25rem .75rem .75rem;margin:0;white-space:pre-wrap;word-break:break-all}\n"], dependencies: [{ kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] });
|
|
215
363
|
}
|
|
216
364
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StatoDevToolsComponent, decorators: [{
|
|
217
365
|
type: Component,
|
|
218
|
-
args: [{ selector: 'ngstato-devtools', standalone: true, imports: [JsonPipe], template: `
|
|
219
|
-
<!--
|
|
366
|
+
args: [{ selector: 'ngstato-devtools, stato-devtools', standalone: true, imports: [JsonPipe, KeyValuePipe], template: `
|
|
367
|
+
<!-- Floating button -->
|
|
220
368
|
@if (!isOpen()) {
|
|
221
369
|
<button class="devtools-fab" (click)="toggle()">
|
|
222
370
|
🛠 Stato
|
|
@@ -230,7 +378,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
230
378
|
[class.devtools-panel--minimized]="isMinimized()"
|
|
231
379
|
[style.left.px]="posX()"
|
|
232
380
|
[style.top.px]="posY()"
|
|
233
|
-
[style.width.px]="isMinimized() ?
|
|
381
|
+
[style.width.px]="isMinimized() ? 220 : panelWidth()"
|
|
234
382
|
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
235
383
|
>
|
|
236
384
|
|
|
@@ -239,19 +387,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
239
387
|
class="devtools-header"
|
|
240
388
|
(mousedown)="onDragStart($event)"
|
|
241
389
|
>
|
|
242
|
-
<span class="devtools-title"
|
|
390
|
+
<span class="devtools-title">
|
|
391
|
+
🛠 Stato
|
|
392
|
+
@if (isTimeTraveling()) {
|
|
393
|
+
<span class="tt-badge">TIME-TRAVEL</span>
|
|
394
|
+
}
|
|
395
|
+
</span>
|
|
243
396
|
<div class="devtools-header-actions">
|
|
244
397
|
@if (!isMinimized()) {
|
|
245
|
-
<button class="btn-icon" (click)="clear()" title="
|
|
398
|
+
<button class="btn-icon" (click)="clear()" title="Clear">🗑</button>
|
|
246
399
|
}
|
|
247
|
-
<button class="btn-icon" (click)="toggleMinimize()" title="
|
|
400
|
+
<button class="btn-icon" (click)="toggleMinimize()" title="Minimize">
|
|
248
401
|
{{ isMinimized() ? '▲' : '▼' }}
|
|
249
402
|
</button>
|
|
250
|
-
<button class="btn-icon" (click)="toggle()" title="
|
|
403
|
+
<button class="btn-icon" (click)="toggle()" title="Close">✕</button>
|
|
251
404
|
</div>
|
|
252
405
|
</div>
|
|
253
406
|
|
|
254
|
-
<!-- Resize handle
|
|
407
|
+
<!-- Resize handle -->
|
|
255
408
|
@if (!isMinimized()) {
|
|
256
409
|
<div
|
|
257
410
|
class="devtools-resize"
|
|
@@ -279,17 +432,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
279
432
|
</button>
|
|
280
433
|
</div>
|
|
281
434
|
|
|
282
|
-
<!--
|
|
435
|
+
<!-- Time-travel toolbar -->
|
|
436
|
+
@if (activeTab() === 'actions' && logs().length) {
|
|
437
|
+
<div class="tt-toolbar">
|
|
438
|
+
<button
|
|
439
|
+
class="tt-btn"
|
|
440
|
+
(click)="onUndo()"
|
|
441
|
+
[disabled]="!canUndo()"
|
|
442
|
+
title="Undo (step back)"
|
|
443
|
+
>⏪</button>
|
|
444
|
+
<button
|
|
445
|
+
class="tt-btn"
|
|
446
|
+
(click)="onRedo()"
|
|
447
|
+
[disabled]="!canRedo()"
|
|
448
|
+
title="Redo (step forward)"
|
|
449
|
+
>⏩</button>
|
|
450
|
+
@if (isTimeTraveling()) {
|
|
451
|
+
<button
|
|
452
|
+
class="tt-btn tt-btn--resume"
|
|
453
|
+
(click)="onResume()"
|
|
454
|
+
title="Resume live state"
|
|
455
|
+
>▶ Live</button>
|
|
456
|
+
}
|
|
457
|
+
<div class="tt-spacer"></div>
|
|
458
|
+
<button
|
|
459
|
+
class="tt-btn tt-btn--export"
|
|
460
|
+
(click)="onExport()"
|
|
461
|
+
title="Export state snapshot (JSON)"
|
|
462
|
+
>📤</button>
|
|
463
|
+
<button
|
|
464
|
+
class="tt-btn tt-btn--import"
|
|
465
|
+
(click)="onImport()"
|
|
466
|
+
title="Import state snapshot"
|
|
467
|
+
>📥</button>
|
|
468
|
+
</div>
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
<!-- Tab: Actions -->
|
|
283
472
|
@if (activeTab() === 'actions') {
|
|
284
473
|
<div class="devtools-content">
|
|
285
474
|
@if (!logs().length) {
|
|
286
|
-
<div class="devtools-empty">
|
|
475
|
+
<div class="devtools-empty">No actions yet</div>
|
|
287
476
|
}
|
|
288
477
|
@for (log of logs(); track log.id) {
|
|
289
478
|
<div
|
|
290
479
|
class="log-item"
|
|
291
480
|
[class.log-item--error]="log.status === 'error'"
|
|
292
|
-
|
|
481
|
+
[class.log-item--active]="activeLogId() === log.id"
|
|
482
|
+
[class.log-item--future]="isFutureLog(log)"
|
|
483
|
+
(click)="onTravelTo(log)"
|
|
293
484
|
>
|
|
294
485
|
<div class="log-item__left">
|
|
295
486
|
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
@@ -297,11 +488,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
297
488
|
</div>
|
|
298
489
|
<div class="log-item__right">
|
|
299
490
|
@if (log.status === 'error') {
|
|
300
|
-
<span class="log-error-badge">
|
|
491
|
+
<span class="log-error-badge">error</span>
|
|
301
492
|
} @else {
|
|
302
493
|
<span class="log-duration">{{ log.duration }}ms</span>
|
|
303
494
|
}
|
|
304
495
|
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
496
|
+
<button
|
|
497
|
+
class="btn-icon btn-replay"
|
|
498
|
+
(click)="onReplay(log, $event)"
|
|
499
|
+
title="Replay this action"
|
|
500
|
+
>🔄</button>
|
|
305
501
|
</div>
|
|
306
502
|
</div>
|
|
307
503
|
|
|
@@ -311,11 +507,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
311
507
|
<div class="log-detail__error">{{ log.error }}</div>
|
|
312
508
|
}
|
|
313
509
|
<div class="log-detail__section">
|
|
314
|
-
<span class="log-detail__label">
|
|
510
|
+
<span class="log-detail__label">Before</span>
|
|
315
511
|
<pre>{{ log.prevState | json }}</pre>
|
|
316
512
|
</div>
|
|
317
513
|
<div class="log-detail__section">
|
|
318
|
-
<span class="log-detail__label">
|
|
514
|
+
<span class="log-detail__label">After</span>
|
|
319
515
|
<pre>{{ log.nextState | json }}</pre>
|
|
320
516
|
</div>
|
|
321
517
|
</div>
|
|
@@ -324,13 +520,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
324
520
|
</div>
|
|
325
521
|
}
|
|
326
522
|
|
|
327
|
-
<!-- Tab State -->
|
|
523
|
+
<!-- Tab: State -->
|
|
328
524
|
@if (activeTab() === 'state') {
|
|
329
525
|
<div class="devtools-content">
|
|
330
|
-
@if (
|
|
331
|
-
|
|
526
|
+
@if (globalState().size) {
|
|
527
|
+
@for (entry of globalState() | keyvalue; track entry.key) {
|
|
528
|
+
<div class="state-store-block">
|
|
529
|
+
<div class="state-store-name">{{ entry.key }}</div>
|
|
530
|
+
<pre class="state-view">{{ entry.value | json }}</pre>
|
|
531
|
+
</div>
|
|
532
|
+
}
|
|
332
533
|
} @else {
|
|
333
|
-
<div class="devtools-empty">
|
|
534
|
+
<div class="devtools-empty">No state available</div>
|
|
334
535
|
}
|
|
335
536
|
</div>
|
|
336
537
|
}
|
|
@@ -338,6 +539,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
338
539
|
|
|
339
540
|
</div>
|
|
340
541
|
}
|
|
341
|
-
|
|
542
|
+
|
|
543
|
+
<!-- Hidden file input for import -->
|
|
544
|
+
<input
|
|
545
|
+
#fileInput
|
|
546
|
+
type="file"
|
|
547
|
+
accept=".json"
|
|
548
|
+
style="display: none"
|
|
549
|
+
(change)="onFileSelected($event)"
|
|
550
|
+
/>
|
|
551
|
+
`, styles: [":host{font-family:system-ui,-apple-system,sans-serif}.devtools-fab{position:fixed;bottom:1.5rem;left:1.5rem;background:#1e293b;color:#fff;border:none;border-radius:999px;padding:.5rem 1rem;font-size:.85rem;font-weight:600;cursor:pointer;z-index:9999;box-shadow:0 4px 12px #0000004d;transition:background .15s}.devtools-fab:hover{background:#334155}.devtools-panel{position:fixed;background:#0f172a;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;display:flex;flex-direction:column;overflow:hidden;font-family:Courier New,monospace;min-width:200px;min-height:40px;border:1px solid #1e293b}.devtools-panel--minimized{border-radius:8px}.devtools-header{display:flex;justify-content:space-between;align-items:center;padding:.6rem .75rem;background:#1e293b;border-bottom:1px solid #334155;cursor:grab;-webkit-user-select:none;user-select:none}.devtools-header:active{cursor:grabbing}.devtools-title{color:#e2e8f0;font-size:.82rem;font-weight:600;font-family:system-ui;display:flex;align-items:center;gap:.4rem}.tt-badge{background:#7c3aed;color:#fff;font-size:.6rem;padding:.12rem .4rem;border-radius:4px;font-weight:700;letter-spacing:.05em;animation:tt-pulse 1.5s ease-in-out infinite}@keyframes tt-pulse{0%,to{opacity:1}50%{opacity:.6}}.devtools-header-actions{display:flex;gap:.25rem}.btn-icon{background:transparent;color:#64748b;border:none;cursor:pointer;font-size:.8rem;padding:.15rem .35rem;border-radius:4px;line-height:1}.btn-icon:hover{background:#334155;color:#fff}.devtools-resize{position:absolute;bottom:2px;right:4px;color:#334155;font-size:.9rem;cursor:nwse-resize;-webkit-user-select:none;user-select:none;line-height:1}.devtools-resize:hover{color:#64748b}.devtools-tabs{display:flex;background:#1e293b;border-bottom:1px solid #334155}.tab{padding:.4rem .75rem;background:transparent;color:#64748b;border:none;cursor:pointer;font-size:.78rem;font-family:system-ui;transition:color .15s}.tab:hover{color:#e2e8f0}.tab--active{color:#3b82f6;border-bottom:2px solid #3b82f6}.tt-toolbar{display:flex;align-items:center;gap:.2rem;padding:.3rem .5rem;background:#0f172a;border-bottom:1px solid #1e293b}.tt-btn{background:#1e293b;border:1px solid #334155;color:#94a3b8;padding:.2rem .5rem;border-radius:4px;font-size:.72rem;cursor:pointer;transition:all .15s;font-family:system-ui}.tt-btn:hover:not(:disabled){background:#334155;color:#e2e8f0;border-color:#475569}.tt-btn:disabled{opacity:.3;cursor:not-allowed}.tt-btn--resume{background:#7c3aed;border-color:#7c3aed;color:#fff;font-weight:600}.tt-btn--resume:hover:not(:disabled){background:#6d28d9}.tt-btn--export,.tt-btn--import{font-size:.68rem}.tt-spacer{flex:1}.devtools-content{overflow-y:auto;flex:1;padding:.25rem 0}.devtools-empty{padding:2rem;text-align:center;color:#475569;font-size:.78rem;font-family:system-ui}.log-item{display:flex;justify-content:space-between;align-items:center;padding:.35rem .75rem;cursor:pointer;border-bottom:1px solid #1e293b;transition:background .1s}.log-item:hover{background:#1e293b}.log-item--error{background:#1a0a0a}.log-item--active{background:#1e1b4b!important;border-left:3px solid #7c3aed}.log-item--future{opacity:.35}.log-item__left{display:flex;align-items:center;gap:.4rem;overflow:hidden;flex:1}.log-item__right{display:flex;align-items:center;gap:.35rem;flex-shrink:0}.log-status{font-size:.72rem;color:#22c55e;flex-shrink:0}.log-item--error .log-status{color:#ef4444}.log-name{color:#e2e8f0;font-size:.75rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.log-duration{color:#64748b;font-size:.7rem}.log-time{color:#475569;font-size:.68rem}.log-error-badge{background:#7f1d1d;color:#fca5a5;font-size:.68rem;padding:.1rem .35rem;border-radius:4px}.btn-replay{font-size:.65rem;opacity:.5}.btn-replay:hover{opacity:1}.log-detail{background:#0a0f1a;padding:.6rem .75rem;border-left:3px solid #3b82f6;margin:0 .4rem .4rem;border-radius:0 4px 4px 0}.log-detail__error{color:#fca5a5;font-size:.72rem;margin-bottom:.4rem}.log-detail__section{margin-bottom:.4rem}.log-detail__label{color:#64748b;font-size:.68rem;display:block;margin-bottom:.2rem;font-family:system-ui}pre{color:#86efac;font-size:.7rem;margin:0;white-space:pre-wrap;word-break:break-all;max-height:140px;overflow-y:auto}.state-store-block{border-bottom:1px solid #1e293b}.state-store-block:last-child{border-bottom:none}.state-store-name{padding:.4rem .75rem .2rem;color:#3b82f6;font-size:.72rem;font-family:system-ui;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.state-view{color:#86efac;font-size:.7rem;padding:.25rem .75rem .75rem;margin:0;white-space:pre-wrap;word-break:break-all}\n"] }]
|
|
342
552
|
}] });
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2dG9vbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RldnRvb2xzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFDUCxNQUE2QixlQUFlLENBQUE7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFXLGVBQWUsQ0FBQTtBQUU3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7O0FBa1QxQyxNQUFNLE9BQU8sc0JBQXNCO0lBRXpCLEtBQUssQ0FBYTtJQUUxQixXQUFXO0lBQ1gsTUFBTSxHQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzQixXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLFNBQVMsR0FBSyxNQUFNLENBQXNCLFNBQVMsQ0FBQyxDQUFBO0lBQ3BELElBQUksR0FBVSxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUE7SUFDckMsV0FBVyxHQUFHLE1BQU0sQ0FBbUIsSUFBSSxDQUFDLENBQUE7SUFFNUMscUJBQXFCO0lBQ3JCLElBQUksR0FBVSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDeEIsSUFBSSxHQUFVLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0lBQzlDLFVBQVUsR0FBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDekIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixhQUFhO0lBQ0wsVUFBVSxHQUFJLEtBQUssQ0FBQTtJQUNuQixVQUFVLEdBQUksS0FBSyxDQUFBO0lBQ25CLFdBQVcsR0FBRyxDQUFDLENBQUE7SUFDZixXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ2YsTUFBTSxHQUFRLENBQUMsQ0FBQTtJQUNmLE1BQU0sR0FBUSxDQUFDLENBQUE7SUFDZixNQUFNLEdBQVEsQ0FB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QUFLLENBQUE7SUFDekIsQ0FBQzt3R0FoR1Usc0JBQXNCOzRGQUF0QixzQkFBc0IsNEVBNVN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkhULHdtR0E1SFksUUFBUTs7NEZBNlNWLHNCQUFzQjtrQkFoVGxDLFNBQVM7K0JBQ0ksa0JBQWtCLGNBQ2xCLElBQUksV0FDSixDQUFDLFFBQVEsQ0FBQyxZQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EySFQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBzaWduYWxcbn0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgZGV2VG9vbHMgfSAgICAgIGZyb20gJ0BuZ3N0YXRvL2NvcmUnXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxvZyB9IGZyb20gJ0BuZ3N0YXRvL2NvcmUnXG5pbXBvcnQgeyBKc29uUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICduZ3N0YXRvLWRldnRvb2xzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogICAgW0pzb25QaXBlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIEJvdXRvbiBmbG90dGFudCAtLT5cbiAgICBAaWYgKCFpc09wZW4oKSkge1xuICAgICAgPGJ1dHRvbiBjbGFzcz1cImRldnRvb2xzLWZhYlwiIChjbGljayk9XCJ0b2dnbGUoKVwiPlxuICAgICAgICDwn5ugIFN0YXRvXG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8IS0tIFBhbmVsIC0tPlxuICAgIEBpZiAoaXNPcGVuKCkpIHtcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkZXZ0b29scy1wYW5lbFwiXG4gICAgICAgIFtjbGFzcy5kZXZ0b29scy1wYW5lbC0tbWluaW1pemVkXT1cImlzTWluaW1pemVkKClcIlxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJwb3NYKClcIlxuICAgICAgICBbc3R5bGUudG9wLnB4XT1cInBvc1koKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJpc01pbmltaXplZCgpID8gMjAwIDogcGFuZWxXaWR0aCgpXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJpc01pbmltaXplZCgpID8gJ2F1dG8nIDogcGFuZWxIZWlnaHQoKSArICdweCdcIlxuICAgICAgPlxuXG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBkcmFnZ2FibGUgLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRldnRvb2xzLWhlYWRlclwiXG4gICAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2dG9vbHMtdGl0bGVcIj7wn5ugIFN0YXRvPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgQGlmICghaXNNaW5pbWl6ZWQoKSkge1xuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWljb25cIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiVmlkZXJcIj7wn5eRPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWljb25cIiAoY2xpY2spPVwidG9nZ2xlTWluaW1pemUoKVwiIHRpdGxlPVwiTWluaW1pc2VyL0FncmFuZGlyXCI+XG4gICAgICAgICAgICAgIHt7IGlzTWluaW1pemVkKCkgPyAn4payJyA6ICfilrwnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4taWNvblwiIChjbGljayk9XCJ0b2dnbGUoKVwiIHRpdGxlPVwiRmVybWVyXCI+4pyVPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmVzaXplIGhhbmRsZSDigJQgY29pbiBiYXMgZHJvaXRlIC0tPlxuICAgICAgICBAaWYgKCFpc01pbmltaXplZCgpKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkZXZ0b29scy1yZXNpemVcIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIlxuICAgICAgICAgID7iir88L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoIWlzTWluaW1pemVkKCkpIHtcblxuICAgICAgICAgIDwhLS0gVGFicyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2dG9vbHMtdGFic1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInRhYlwiXG4gICAgICAgICAgICAgIFtjbGFzcy50YWItLWFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ2FjdGlvbnMnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2ZVRhYi5zZXQoJ2FjdGlvbnMnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEFjdGlvbnMgKHt7IGxvZ3MoKS5sZW5ndGggfX0pXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJcIlxuICAgICAgICAgICAgICBbY2xhc3MudGFiLS1hY3RpdmVdPVwiYWN0aXZlVGFiKCkgPT09ICdzdGF0ZSdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc3RhdGUnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFN0YXRlXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFiIEFjdGlvbnMgLS0+XG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ2FjdGlvbnMnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2dG9vbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICBAaWYgKCFsb2dzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWVtcHR5XCI+QXVjdW5lIGFjdGlvbiBwb3VyIGwnaW5zdGFudDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBmb3IgKGxvZyBvZiBsb2dzKCk7IHRyYWNrIGxvZy5pZCkge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9nLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxvZy1pdGVtLS1lcnJvcl09XCJsb2cuc3RhdHVzID09PSAnZXJyb3InXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb2cobG9nKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1pdGVtX19sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0YXR1c1wiPnt7IGxvZy5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICfinJMnIDogJ+KclycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLW5hbWVcIj57eyBsb2cubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1pdGVtX19yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvZy5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1lcnJvci1iYWRnZVwiPmVycmV1cjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctZHVyYXRpb25cIj57eyBsb2cuZHVyYXRpb24gfX1tczwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy10aW1lXCI+e3sgZm9ybWF0VGltZShsb2cuYXQpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkTG9nKCk/LmlkID09PSBsb2cuaWQpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobG9nLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1kZXRhaWxfX2Vycm9yXCI+e3sgbG9nLmVycm9yIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1kZXRhaWxfX3NlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1kZXRhaWxfX2xhYmVsXCI+QXZhbnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHByZT57eyBsb2cucHJldlN0YXRlIHwganNvbiB9fTwvcHJlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1kZXRhaWxfX3NlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1kZXRhaWxfX2xhYmVsXCI+QXByw6hzPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgbG9nLm5leHRTdGF0ZSB8IGpzb24gfX08L3ByZT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gVGFiIFN0YXRlIC0tPlxuICAgICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1jb250ZW50XCI+XG4gICAgICAgICAgICAgIEBpZiAobG9ncygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJzdGF0ZS12aWV3XCI+e3sgbG9ncygpWzBdLm5leHRTdGF0ZSB8IGpzb24gfX08L3ByZT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWVtcHR5XCI+QXVjdW4gc3RhdGUgZGlzcG9uaWJsZTwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmRldnRvb2xzLWZhYiB7XG4gICAgICBwb3NpdGlvbjogICAgICBmaXhlZDtcbiAgICAgIGJvdHRvbTogICAgICAgIDEuNXJlbTtcbiAgICAgIGxlZnQ6ICAgICAgICAgIDEuNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6ICAgICMxZTI5M2I7XG4gICAgICBjb2xvcjogICAgICAgICB3aGl0ZTtcbiAgICAgIGJvcmRlcjogICAgICAgIG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuNXJlbSAxcmVtO1xuICAgICAgZm9udC1zaXplOiAgICAgMC44NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiAgIDYwMDtcbiAgICAgIGN1cnNvcjogICAgICAgIHBvaW50ZXI7XG4gICAgICB6LWluZGV4OiAgICAgICA5OTk5O1xuICAgICAgYm94LXNoYWRvdzogICAgMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICB0cmFuc2l0aW9uOiAgICBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgIH1cbiAgICAuZGV2dG9vbHMtZmFiOmhvdmVyIHsgYmFja2dyb3VuZDogIzMzNDE1NTsgfVxuXG4gICAgLmRldnRvb2xzLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiAgICAgICBmaXhlZDtcbiAgICAgIGJhY2tncm91bmQ6ICAgICAjMGYxNzJhO1xuICAgICAgYm9yZGVyLXJhZGl1czogIDEycHg7XG4gICAgICBib3gtc2hhZG93OiAgICAgMCA4cHggMzJweCByZ2JhKDAsMCwwLDAuNCk7XG4gICAgICB6LWluZGV4OiAgICAgICAgOTk5OTtcbiAgICAgIGRpc3BsYXk6ICAgICAgICBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93OiAgICAgICBoaWRkZW47XG4gICAgICBmb250LWZhbWlseTogICAgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xuICAgICAgbWluLXdpZHRoOiAgICAgIDIwMHB4O1xuICAgICAgbWluLWhlaWdodDogICAgIDQwcHg7XG4gICAgfVxuXG4gICAgLmRldnRvb2xzLXBhbmVsLS1taW5pbWl6ZWQge1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIH1cblxuICAgIC5kZXZ0b29scy1oZWFkZXIge1xuICAgICAgZGlzcGxheTogICAgICAgICBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgYWxpZ24taXRlbXM6ICAgICBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAgICAgICAgIDAuNnJlbSAwLjc1cmVtO1xuICAgICAgYmFja2dyb3VuZDogICAgICAjMWUyOTNiO1xuICAgICAgYm9yZGVyLWJvdHRvbTogICAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGN1cnNvcjogICAgICAgICAgZ3JhYjtcbiAgICAgIHVzZXItc2VsZWN0OiAgICAgbm9uZTtcbiAgICB9XG4gICAgLmRldnRvb2xzLWhlYWRlcjphY3RpdmUgeyBjdXJzb3I6IGdyYWJiaW5nOyB9XG5cbiAgICAuZGV2dG9vbHMtdGl0bGUge1xuICAgICAgY29sb3I6ICAgICAgICNlMmU4ZjA7XG4gICAgICBmb250LXNpemU6ICAgMC44MnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpO1xuICAgIH1cblxuICAgIC5kZXZ0b29scy1oZWFkZXItYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogMC4yNXJlbTsgfVxuXG4gICAgLmJ0bi1pY29uIHtcbiAgICAgIGJhY2tncm91bmQ6ICAgIHRyYW5zcGFyZW50O1xuICAgICAgY29sb3I6ICAgICAgICAgIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogICAgICAgIG5vbmU7XG4gICAgICBjdXJzb3I6ICAgICAgICBwb2ludGVyO1xuICAgICAgZm9udC1zaXplOiAgICAgMC44cmVtO1xuICAgICAgcGFkZGluZzogICAgICAgMC4xNXJlbSAwLjM1cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgbGluZS1oZWlnaHQ6ICAgMTtcbiAgICB9XG4gICAgLmJ0bi1pY29uOmhvdmVyIHsgYmFja2dyb3VuZDogIzMzNDE1NTsgY29sb3I6IHdoaXRlOyB9XG5cbiAgICAuZGV2dG9vbHMtcmVzaXplIHtcbiAgICAgIHBvc2l0aW9uOiAgYWJzb2x1dGU7XG4gICAgICBib3R0b206ICAgIDJweDtcbiAgICAgIHJpZ2h0OiAgICAgNHB4O1xuICAgICAgY29sb3I6ICAgICAjMzM0MTU1O1xuICAgICAgZm9udC1zaXplOiAwLjlyZW07XG4gICAgICBjdXJzb3I6ICAgIG53c2UtcmVzaXplO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICB9XG4gICAgLmRldnRvb2xzLXJlc2l6ZTpob3ZlciB7IGNvbG9yOiAjNjQ3NDhiOyB9XG5cbiAgICAuZGV2dG9vbHMtdGFicyB7XG4gICAgICBkaXNwbGF5OiAgICAgICBmbGV4O1xuICAgICAgYmFja2dyb3VuZDogICAgIzFlMjkzYjtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzM0MTU1O1xuICAgIH1cbiAgICAudGFiIHtcbiAgICAgIHBhZGRpbmc6ICAgICAwLjRyZW0gMC43NXJlbTtcbiAgICAgIGJhY2tncm91bmQ6ICB0cmFuc3BhcmVudDtcbiAgICAgIGNvbG9yOiAgICAgICAjNjQ3NDhiO1xuICAgICAgYm9yZGVyOiAgICAgIG5vbmU7XG4gICAgICBjdXJzb3I6ICAgICAgcG9pbnRlcjtcbiAgICAgIGZvbnQtc2l6ZTogICAwLjc4cmVtO1xuICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTtcbiAgICB9XG4gICAgLnRhYjpob3ZlciAgICB7IGNvbG9yOiAjZTJlOGYwOyB9XG4gICAgLnRhYi0tYWN0aXZlICB7IGNvbG9yOiAjM2I4MmY2OyBib3JkZXItYm90dG9tOiAycHggc29saWQgIzNiODJmNjsgfVxuXG4gICAgLmRldnRvb2xzLWNvbnRlbnQge1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGZsZXg6ICAgICAgIDE7XG4gICAgICBwYWRkaW5nOiAgICAwLjI1cmVtIDA7XG4gICAgfVxuXG4gICAgLmRldnRvb2xzLWVtcHR5IHtcbiAgICAgIHBhZGRpbmc6ICAgICAycmVtO1xuICAgICAgdGV4dC1hbGlnbjogIGNlbnRlcjtcbiAgICAgIGNvbG9yOiAgICAgICAjNDc1NTY5O1xuICAgICAgZm9udC1zaXplOiAgIDAuNzhyZW07XG4gICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpO1xuICAgIH1cblxuICAgIC5sb2ctaXRlbSB7XG4gICAgICBkaXNwbGF5OiAgICAgICAgIGZsZXg7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICBhbGlnbi1pdGVtczogICAgIGNlbnRlcjtcbiAgICAgIHBhZGRpbmc6ICAgICAgICAgMC4zNXJlbSAwLjc1cmVtO1xuICAgICAgY3Vyc29yOiAgICAgICAgICBwb2ludGVyO1xuICAgICAgYm9yZGVyLWJvdHRvbTogICAxcHggc29saWQgIzFlMjkzYjtcbiAgICB9XG4gICAgLmxvZy1pdGVtOmhvdmVyICAgICAgICB7IGJhY2tncm91bmQ6ICMxZTI5M2I7IH1cbiAgICAubG9nLWl0ZW0tLWVycm9yICAgICAgIHsgYmFja2dyb3VuZDogIzFhMGEwYTsgfVxuXG4gICAgLmxvZy1pdGVtX19sZWZ0ICB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMC40cmVtOyBvdmVyZmxvdzogaGlkZGVuOyB9XG4gICAgLmxvZy1pdGVtX19yaWdodCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMC40cmVtOyBmbGV4LXNocmluazogMDsgfVxuXG4gICAgLmxvZy1zdGF0dXMgIHsgZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogIzIyYzU1ZTsgZmxleC1zaHJpbms6IDA7IH1cbiAgICAubG9nLWl0ZW0tLWVycm9yIC5sb2ctc3RhdHVzIHsgY29sb3I6ICNlZjQ0NDQ7IH1cbiAgICAubG9nLW5hbWUgICAgeyBjb2xvcjogI2UyZThmMDsgZm9udC1zaXplOiAwLjc1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgfVxuICAgIC5sb2ctZHVyYXRpb24geyBjb2xvcjogIzY0NzQ4YjsgZm9udC1zaXplOiAwLjdyZW07IH1cbiAgICAubG9nLXRpbWUgICAgeyBjb2xvcjogIzQ3NTU2OTsgZm9udC1zaXplOiAwLjY4cmVtOyB9XG5cbiAgICAubG9nLWVycm9yLWJhZGdlIHtcbiAgICAgIGJhY2tncm91bmQ6ICAgICM3ZjFkMWQ7XG4gICAgICBjb2xvcjogICAgICAgICAjZmNhNWE1O1xuICAgICAgZm9udC1zaXplOiAgICAgMC42OHJlbTtcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuMXJlbSAwLjM1cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIH1cblxuICAgIC5sb2ctZGV0YWlsIHtcbiAgICAgIGJhY2tncm91bmQ6ICAgICMwYTBmMWE7XG4gICAgICBwYWRkaW5nOiAgICAgICAwLjZyZW0gMC43NXJlbTtcbiAgICAgIGJvcmRlci1sZWZ0OiAgIDNweCBzb2xpZCAjM2I4MmY2O1xuICAgICAgbWFyZ2luOiAgICAgICAgMCAwLjRyZW0gMC40cmVtO1xuICAgICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7XG4gICAgfVxuICAgIC5sb2ctZGV0YWlsX19lcnJvciAgIHsgY29sb3I6ICNmY2E1YTU7IGZvbnQtc2l6ZTogMC43MnJlbTsgbWFyZ2luLWJvdHRvbTogMC40cmVtOyB9XG4gICAgLmxvZy1kZXRhaWxfX3NlY3Rpb24geyBtYXJnaW4tYm90dG9tOiAwLjRyZW07IH1cbiAgICAubG9nLWRldGFpbF9fbGFiZWwgICB7XG4gICAgICBjb2xvcjogICAgICAgICAjNjQ3NDhiO1xuICAgICAgZm9udC1zaXplOiAgICAgMC42OHJlbTtcbiAgICAgIGRpc3BsYXk6ICAgICAgIGJsb2NrO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMC4ycmVtO1xuICAgICAgZm9udC1mYW1pbHk6ICAgc3lzdGVtLXVpO1xuICAgIH1cbiAgICBwcmUge1xuICAgICAgY29sb3I6ICAgICAgICM4NmVmYWM7XG4gICAgICBmb250LXNpemU6ICAgMC43cmVtO1xuICAgICAgbWFyZ2luOiAgICAgIDA7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgICB3b3JkLWJyZWFrOiAgYnJlYWstYWxsO1xuICAgICAgbWF4LWhlaWdodDogIDE0MHB4O1xuICAgICAgb3ZlcmZsb3cteTogIGF1dG87XG4gICAgfVxuICAgIC5zdGF0ZS12aWV3IHtcbiAgICAgIGNvbG9yOiAgICAgICAjODZlZmFjO1xuICAgICAgZm9udC1zaXplOiAgIDAuN3JlbTtcbiAgICAgIHBhZGRpbmc6ICAgICAwLjc1cmVtO1xuICAgICAgbWFyZ2luOiAgICAgIDA7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgICB3b3JkLWJyZWFrOiAgYnJlYWstYWxsO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgU3RhdG9EZXZUb29sc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHVuc3ViPzogKCkgPT4gdm9pZFxuXG4gIC8vIFN0YXRlIFVJXG4gIGlzT3BlbiAgICAgID0gc2lnbmFsKGZhbHNlKVxuICBpc01pbmltaXplZCA9IHNpZ25hbChmYWxzZSlcbiAgYWN0aXZlVGFiICAgPSBzaWduYWw8J2FjdGlvbnMnIHwgJ3N0YXRlJz4oJ2FjdGlvbnMnKVxuICBsb2dzICAgICAgICA9IHNpZ25hbDxBY3Rpb25Mb2dbXT4oW10pXG4gIHNlbGVjdGVkTG9nID0gc2lnbmFsPEFjdGlvbkxvZyB8IG51bGw+KG51bGwpXG5cbiAgLy8gUG9zaXRpb24gZXQgdGFpbGxlXG4gIHBvc1ggICAgICAgID0gc2lnbmFsKDI0KVxuICBwb3NZICAgICAgICA9IHNpZ25hbCh3aW5kb3cuaW5uZXJIZWlnaHQgLSA1MDApXG4gIHBhbmVsV2lkdGggID0gc2lnbmFsKDQyMClcbiAgcGFuZWxIZWlnaHQgPSBzaWduYWwoNDYwKVxuXG4gIC8vIERyYWcgc3RhdGVcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nICA9IGZhbHNlXG4gIHByaXZhdGUgaXNSZXNpemluZyAgPSBmYWxzZVxuICBwcml2YXRlIGRyYWdPZmZzZXRYID0gMFxuICBwcml2YXRlIGRyYWdPZmZzZXRZID0gMFxuICBwcml2YXRlIHN0YXJ0VyAgICAgID0gMFxuICBwcml2YXRlIHN0YXJ0SCAgICAgID0gMFxuICBwcml2YXRlIHN0YXJ0WCAgICAgID0gMFxuICBwcml2YXRlIHN0YXJ0WSAgICAgID0gMFxuXG4gIC8vIEJvdW5kIGxpc3RlbmVyc1xuICBwcml2YXRlIGJvdW5kTW91c2VNb3ZlID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpXG4gIHByaXZhdGUgYm91bmRNb3VzZVVwICAgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpXG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51bnN1YiA9IGRldlRvb2xzLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgIHRoaXMubG9ncy5zZXQoc3RhdGUubG9ncylcbiAgICAgIHRoaXMuaXNPcGVuLnNldChzdGF0ZS5pc09wZW4pXG4gICAgfSlcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICAgdGhpcy5ib3VuZE1vdXNlVXApXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3ViPy4oKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRNb3VzZU1vdmUpXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICAgdGhpcy5ib3VuZE1vdXNlVXApXG4gIH1cblxuICAvLyDilIDilIAgVG9nZ2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB0b2dnbGUoKSAgICAgICAgIHsgZGV2VG9vbHMudG9nZ2xlKCkgfVxuICB0b2dnbGVNaW5pbWl6ZSgpIHsgdGhpcy5pc01pbmltaXplZC51cGRhdGUodiA9PiAhdikgfVxuICBjbGVhcigpICAgICAgICAgIHsgZGV2VG9vbHMuY2xlYXIoKTsgdGhpcy5zZWxlY3RlZExvZy5zZXQobnVsbCkgfVxuICBzZWxlY3RMb2cobG9nOiBBY3Rpb25Mb2cpIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9nLnNldCh0aGlzLnNlbGVjdGVkTG9nKCk/LmlkID09PSBsb2cuaWQgPyBudWxsIDogbG9nKVxuICB9XG4gIGZvcm1hdFRpbWUoaXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZShpc28pLnRvVGltZVN0cmluZygpLnNsaWNlKDAsIDgpXG4gIH1cblxuICAvLyDilIDilIAgRHJhZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgb25EcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIGlmICgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnYnRuLWljb24nKSkgcmV0dXJuXG4gICAgdGhpcy5pc0RyYWdnaW5nICA9IHRydWVcbiAgICB0aGlzLmRyYWdPZmZzZXRYID0gZS5jbGllbnRYIC0gdGhpcy5wb3NYKClcbiAgICB0aGlzLmRyYWdPZmZzZXRZID0gZS5jbGllbnRZIC0gdGhpcy5wb3NZKClcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXNpemUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIG9uUmVzaXplU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIHRoaXMuaXNSZXNpemluZyA9IHRydWVcbiAgICB0aGlzLnN0YXJ0VyAgICAgPSB0aGlzLnBhbmVsV2lkdGgoKVxuICAgIHRoaXMuc3RhcnRIICAgICA9IHRoaXMucGFuZWxIZWlnaHQoKVxuICAgIHRoaXMuc3RhcnRYICAgICA9IGUuY2xpZW50WFxuICAgIHRoaXMuc3RhcnRZICAgICA9IGUuY2xpZW50WVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIC8vIOKUgOKUgCBNb3VzZSBNb3ZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBvbk1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgdGhpcy5wb3NYLnNldChNYXRoLm1heCgwLCBlLmNsaWVudFggLSB0aGlzLmRyYWdPZmZzZXRYKSlcbiAgICAgIHRoaXMucG9zWS5zZXQoTWF0aC5tYXgoMCwgZS5jbGllbnRZIC0gdGhpcy5kcmFnT2Zmc2V0WSkpXG4gICAgfVxuICAgIGlmICh0aGlzLmlzUmVzaXppbmcpIHtcbiAgICAgIGNvbnN0IG5ld1cgPSBNYXRoLm1heCgzMDAsIHRoaXMuc3RhcnRXICsgZS5jbGllbnRYIC0gdGhpcy5zdGFydFgpXG4gICAgICBjb25zdCBuZXdIID0gTWF0aC5tYXgoMjAwLCB0aGlzLnN0YXJ0SCArIGUuY2xpZW50WSAtIHRoaXMuc3RhcnRZKVxuICAgICAgdGhpcy5wYW5lbFdpZHRoLnNldChuZXdXKVxuICAgICAgdGhpcy5wYW5lbEhlaWdodC5zZXQobmV3SClcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgTW91c2UgVXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIG9uTW91c2VVcCgpIHtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZVxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlXG4gIH1cbn0iXX0=
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2dG9vbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RldnRvb2xzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFDTixRQUFRLEVBQ1QsTUFBNkIsZUFBZSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBZ0MsZUFBZSxDQUFBO0FBRWxFLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUE7O0FBbWR4RCxNQUFNLE9BQU8sc0JBQXNCO0lBRXpCLEtBQUssQ0FBYTtJQUUxQixXQUFXO0lBQ1gsTUFBTSxHQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMvQixXQUFXLEdBQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQy9CLFNBQVMsR0FBUyxNQUFNLENBQXNCLFNBQVMsQ0FBQyxDQUFBO0lBQ3hELElBQUksR0FBYyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUE7SUFDekMsV0FBVyxHQUFPLE1BQU0sQ0FBbUIsSUFBSSxDQUFDLENBQUE7SUFDaEQsV0FBVyxHQUFPLE1BQU0sQ0FBZ0IsSUFBSSxDQUFDLENBQUE7SUFDN0MsZUFBZSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUvQixpREFBaUQ7SUFDakQsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUE7UUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFT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WTs7NEZBOGN4QixzQkFBc0I7a0JBamRsQyxTQUFTOytCQUNJLGtDQUFrQyxjQUNsQyxJQUFJLFdBQ0osQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLFlBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlMVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWRcbn0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgZGV2VG9vbHMgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0BuZ3N0YXRvL2NvcmUnXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxvZywgRGV2VG9vbHNTdGF0ZSB9ICAgICAgIGZyb20gJ0BuZ3N0YXRvL2NvcmUnXG5pbXBvcnQgeyBKc29uUGlwZSwgS2V5VmFsdWVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICAgJ25nc3RhdG8tZGV2dG9vbHMsIHN0YXRvLWRldnRvb2xzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogICAgW0pzb25QaXBlLCBLZXlWYWx1ZVBpcGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gRmxvYXRpbmcgYnV0dG9uIC0tPlxuICAgIEBpZiAoIWlzT3BlbigpKSB7XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGV2dG9vbHMtZmFiXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgICAgIPCfm6AgU3RhdG9cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDwhLS0gUGFuZWwgLS0+XG4gICAgQGlmIChpc09wZW4oKSkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRldnRvb2xzLXBhbmVsXCJcbiAgICAgICAgW2NsYXNzLmRldnRvb2xzLXBhbmVsLS1taW5pbWl6ZWRdPVwiaXNNaW5pbWl6ZWQoKVwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cInBvc1goKVwiXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwicG9zWSgpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImlzTWluaW1pemVkKCkgPyAyMjAgOiBwYW5lbFdpZHRoKClcIlxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzTWluaW1pemVkKCkgPyAnYXV0bycgOiBwYW5lbEhlaWdodCgpICsgJ3B4J1wiXG4gICAgICA+XG5cbiAgICAgICAgPCEtLSBIZWFkZXIg4oCUIGRyYWdnYWJsZSAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZGV2dG9vbHMtaGVhZGVyXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZ0b29scy10aXRsZVwiPlxuICAgICAgICAgICAg8J+boCBTdGF0b1xuICAgICAgICAgICAgQGlmIChpc1RpbWVUcmF2ZWxpbmcoKSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR0LWJhZGdlXCI+VElNRS1UUkFWRUw8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgQGlmICghaXNNaW5pbWl6ZWQoKSkge1xuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWljb25cIiAoY2xpY2spPVwiY2xlYXIoKVwiIHRpdGxlPVwiQ2xlYXJcIj7wn5eRPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWljb25cIiAoY2xpY2spPVwidG9nZ2xlTWluaW1pemUoKVwiIHRpdGxlPVwiTWluaW1pemVcIj5cbiAgICAgICAgICAgICAge3sgaXNNaW5pbWl6ZWQoKSA/ICfilrInIDogJ+KWvCcgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCIgdGl0bGU9XCJDbG9zZVwiPuKclTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc2l6ZSBoYW5kbGUgLS0+XG4gICAgICAgIEBpZiAoIWlzTWluaW1pemVkKCkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRldnRvb2xzLXJlc2l6ZVwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgPuKKvzwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmICghaXNNaW5pbWl6ZWQoKSkge1xuXG4gICAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy10YWJzXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwidGFiXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRhYi0tYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnYWN0aW9ucydcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnYWN0aW9ucycpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQWN0aW9ucyAoe3sgbG9ncygpLmxlbmd0aCB9fSlcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cInRhYlwiXG4gICAgICAgICAgICAgIFtjbGFzcy50YWItLWFjdGl2ZV09XCJhY3RpdmVUYWIoKSA9PT0gJ3N0YXRlJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCdzdGF0ZScpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU3RhdGVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lLXRyYXZlbCB0b29sYmFyIC0tPlxuICAgICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdhY3Rpb25zJyAmJiBsb2dzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHQtdG9vbGJhclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dC1idG5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblVuZG8oKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5VbmRvKClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVW5kbyAoc3RlcCBiYWNrKVwiXG4gICAgICAgICAgICAgID7ij6o8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHQtYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25SZWRvKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVkbygpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlJlZG8gKHN0ZXAgZm9yd2FyZClcIlxuICAgICAgICAgICAgICA+4o+pPC9idXR0b24+XG4gICAgICAgICAgICAgIEBpZiAoaXNUaW1lVHJhdmVsaW5nKCkpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInR0LWJ0biB0dC1idG4tLXJlc3VtZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25SZXN1bWUoKVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIlJlc3VtZSBsaXZlIHN0YXRlXCJcbiAgICAgICAgICAgICAgICA+4pa2IExpdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHQtc3BhY2VyXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInR0LWJ0biB0dC1idG4tLWV4cG9ydFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwb3J0KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHN0YXRlIHNuYXBzaG90IChKU09OKVwiXG4gICAgICAgICAgICAgID7wn5OkPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInR0LWJ0biB0dC1idG4tLWltcG9ydFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSW1wb3J0KClcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiSW1wb3J0IHN0YXRlIHNuYXBzaG90XCJcbiAgICAgICAgICAgICAgPvCfk6U8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDwhLS0gVGFiOiBBY3Rpb25zIC0tPlxuICAgICAgICAgIEBpZiAoYWN0aXZlVGFiKCkgPT09ICdhY3Rpb25zJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgQGlmICghbG9ncygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1lbXB0eVwiPk5vIGFjdGlvbnMgeWV0PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGZvciAobG9nIG9mIGxvZ3MoKTsgdHJhY2sgbG9nLmlkKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsb2ctaXRlbVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubG9nLWl0ZW0tLWVycm9yXT1cImxvZy5zdGF0dXMgPT09ICdlcnJvcidcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxvZy1pdGVtLS1hY3RpdmVdPVwiYWN0aXZlTG9nSWQoKSA9PT0gbG9nLmlkXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5sb2ctaXRlbS0tZnV0dXJlXT1cImlzRnV0dXJlTG9nKGxvZylcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVHJhdmVsVG8obG9nKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1pdGVtX19sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0YXR1c1wiPnt7IGxvZy5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICfinJMnIDogJ+KclycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLW5hbWVcIj57eyBsb2cubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1pdGVtX19yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvZy5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1lcnJvci1iYWRnZVwiPmVycm9yPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1kdXJhdGlvblwiPnt7IGxvZy5kdXJhdGlvbiB9fW1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXRpbWVcIj57eyBmb3JtYXRUaW1lKGxvZy5hdCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1pY29uIGJ0bi1yZXBsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJlcGxheShsb2csICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVwbGF5IHRoaXMgYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPvCflIQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZExvZygpPy5pZCA9PT0gbG9nLmlkKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWRldGFpbFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsX19lcnJvclwiPnt7IGxvZy5lcnJvciB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsX19zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctZGV0YWlsX19sYWJlbFwiPkJlZm9yZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IGxvZy5wcmV2U3RhdGUgfCBqc29uIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWRldGFpbF9fc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLWRldGFpbF9fbGFiZWxcIj5BZnRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8cHJlPnt7IGxvZy5uZXh0U3RhdGUgfCBqc29uIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8IS0tIFRhYjogU3RhdGUgLS0+XG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgQGlmIChnbG9iYWxTdGF0ZSgpLnNpemUpIHtcbiAgICAgICAgICAgICAgICBAZm9yIChlbnRyeSBvZiBnbG9iYWxTdGF0ZSgpIHwga2V5dmFsdWU7IHRyYWNrIGVudHJ5LmtleSkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRlLXN0b3JlLWJsb2NrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZS1zdG9yZS1uYW1lXCI+e3sgZW50cnkua2V5IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9XCJzdGF0ZS12aWV3XCI+e3sgZW50cnkudmFsdWUgfCBqc29uIH19PC9wcmU+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1lbXB0eVwiPk5vIHN0YXRlIGF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSBIaWRkZW4gZmlsZSBpbnB1dCBmb3IgaW1wb3J0IC0tPlxuICAgIDxpbnB1dFxuICAgICAgI2ZpbGVJbnB1dFxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgYWNjZXB0PVwiLmpzb25cIlxuICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcbiAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgLz5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZjsgfVxuXG4gICAgLmRldnRvb2xzLWZhYiB7XG4gICAgICBwb3NpdGlvbjogICAgICBmaXhlZDtcbiAgICAgIGJvdHRvbTogICAgICAgIDEuNXJlbTtcbiAgICAgIGxlZnQ6ICAgICAgICAgIDEuNXJlbTtcbiAgICAgIGJhY2tncm91bmQ6ICAgICMxZTI5M2I7XG4gICAgICBjb2xvcjogICAgICAgICB3aGl0ZTtcbiAgICAgIGJvcmRlcjogICAgICAgIG5vbmU7XG4gICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuNXJlbSAxcmVtO1xuICAgICAgZm9udC1zaXplOiAgICAgMC44NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiAgIDYwMDtcbiAgICAgIGN1cnNvcjogICAgICAgIHBvaW50ZXI7XG4gICAgICB6LWluZGV4OiAgICAgICA5OTk5O1xuICAgICAgYm94LXNoYWRvdzogICAgMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMyk7XG4gICAgICB0cmFuc2l0aW9uOiAgICBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgIH1cbiAgICAuZGV2dG9vbHMtZmFiOmhvdmVyIHsgYmFja2dyb3VuZDogIzMzNDE1NTsgfVxuXG4gICAgLmRldnRvb2xzLXBhbmVsIHtcbiAgICAgIHBvc2l0aW9uOiAgICAgICBmaXhlZDtcbiAgICAgIGJhY2tncm91bmQ6ICAgICAjMGYxNzJhO1xuICAgICAgYm9yZGVyLXJhZGl1czogIDEycHg7XG4gICAgICBib3gtc2hhZG93OiAgICAgMCA4cHggMzJweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgICB6LWluZGV4OiAgICAgICAgOTk5OTtcbiAgICAgIGRpc3BsYXk6ICAgICAgICBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIG92ZXJmbG93OiAgICAgICBoaWRkZW47XG4gICAgICBmb250LWZhbWlseTogICAgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xuICAgICAgbWluLXdpZHRoOiAgICAgIDIwMHB4O1xuICAgICAgbWluLWhlaWdodDogICAgIDQwcHg7XG4gICAgICBib3JkZXI6ICAgICAgICAgMXB4IHNvbGlkICMxZTI5M2I7XG4gICAgfVxuXG4gICAgLmRldnRvb2xzLXBhbmVsLS1taW5pbWl6ZWQge1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIH1cblxuICAgIC5kZXZ0b29scy1oZWFkZXIge1xuICAgICAgZGlzcGxheTogICAgICAgICBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgYWxpZ24taXRlbXM6ICAgICBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAgICAgICAgIDAuNnJlbSAwLjc1cmVtO1xuICAgICAgYmFja2dyb3VuZDogICAgICAjMWUyOTNiO1xuICAgICAgYm9yZGVyLWJvdHRvbTogICAxcHggc29saWQgIzMzNDE1NTtcbiAgICAgIGN1cnNvcjogICAgICAgICAgZ3JhYjtcbiAgICAgIHVzZXItc2VsZWN0OiAgICAgbm9uZTtcbiAgICB9XG4gICAgLmRldnRvb2xzLWhlYWRlcjphY3RpdmUgeyBjdXJzb3I6IGdyYWJiaW5nOyB9XG5cbiAgICAuZGV2dG9vbHMtdGl0bGUge1xuICAgICAgY29sb3I6ICAgICAgICNlMmU4ZjA7XG4gICAgICBmb250LXNpemU6ICAgMC44MnJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpO1xuICAgICAgZGlzcGxheTogICAgIGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiAgICAgICAgIDAuNHJlbTtcbiAgICB9XG5cbiAgICAudHQtYmFkZ2Uge1xuICAgICAgYmFja2dyb3VuZDogICAgIzdjM2FlZDtcbiAgICAgIGNvbG9yOiAgICAgICAgICNmZmY7XG4gICAgICBmb250LXNpemU6ICAgICAwLjZyZW07XG4gICAgICBwYWRkaW5nOiAgICAgICAwLjEycmVtIDAuNHJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiAgIDcwMDtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XG4gICAgICBhbmltYXRpb246ICAgICB0dC1wdWxzZSAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHR0LXB1bHNlIHtcbiAgICAgIDAlLCAxMDAlIHsgb3BhY2l0eTogMTsgfVxuICAgICAgNTAlICAgICAgeyBvcGFjaXR5OiAwLjY7IH1cbiAgICB9XG5cbiAgICAuZGV2dG9vbHMtaGVhZGVyLWFjdGlvbnMgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDAuMjVyZW07IH1cblxuICAgIC5idG4taWNvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiAgICB0cmFuc3BhcmVudDtcbiAgICAgIGNvbG9yOiAgICAgICAgICM2NDc0OGI7XG4gICAgICBib3JkZXI6ICAgICAgICBub25lO1xuICAgICAgY3Vyc29yOiAgICAgICAgcG9pbnRlcjtcbiAgICAgIGZvbnQtc2l6ZTogICAgIDAuOHJlbTtcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuMTVyZW0gMC4zNXJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAgIDE7XG4gICAgfVxuICAgIC5idG4taWNvbjpob3ZlciB7IGJhY2tncm91bmQ6ICMzMzQxNTU7IGNvbG9yOiB3aGl0ZTsgfVxuXG4gICAgLmRldnRvb2xzLXJlc2l6ZSB7XG4gICAgICBwb3NpdGlvbjogIGFic29sdXRlO1xuICAgICAgYm90dG9tOiAgICAycHg7XG4gICAgICByaWdodDogICAgIDRweDtcbiAgICAgIGNvbG9yOiAgICAgIzMzNDE1NTtcbiAgICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuICAgICAgY3Vyc29yOiAgICBud3NlLXJlc2l6ZTtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgfVxuICAgIC5kZXZ0b29scy1yZXNpemU6aG92ZXIgeyBjb2xvcjogIzY0NzQ4YjsgfVxuXG4gICAgLyog4pSA4pSAIFRhYnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG4gICAgLmRldnRvb2xzLXRhYnMge1xuICAgICAgZGlzcGxheTogICAgICAgZmxleDtcbiAgICAgIGJhY2tncm91bmQ6ICAgICMxZTI5M2I7XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzNDE1NTtcbiAgICB9XG4gICAgLnRhYiB7XG4gICAgICBwYWRkaW5nOiAgICAgMC40cmVtIDAuNzVyZW07XG4gICAgICBiYWNrZ3JvdW5kOiAgdHJhbnNwYXJlbnQ7XG4gICAgICBjb2xvcjogICAgICAgIzY0NzQ4YjtcbiAgICAgIGJvcmRlcjogICAgICBub25lO1xuICAgICAgY3Vyc29yOiAgICAgIHBvaW50ZXI7XG4gICAgICBmb250LXNpemU6ICAgMC43OHJlbTtcbiAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7XG4gICAgICB0cmFuc2l0aW9uOiAgY29sb3IgMC4xNXM7XG4gICAgfVxuICAgIC50YWI6aG92ZXIgICAgeyBjb2xvcjogI2UyZThmMDsgfVxuICAgIC50YWItLWFjdGl2ZSAgeyBjb2xvcjogIzNiODJmNjsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzYjgyZjY7IH1cblxuICAgIC8qIOKUgOKUgCBUaW1lLXRyYXZlbCB0b29sYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xuICAgIC50dC10b29sYmFyIHtcbiAgICAgIGRpc3BsYXk6ICAgICAgIGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogICBjZW50ZXI7XG4gICAgICBnYXA6ICAgICAgICAgICAwLjJyZW07XG4gICAgICBwYWRkaW5nOiAgICAgICAwLjNyZW0gMC41cmVtO1xuICAgICAgYmFja2dyb3VuZDogICAgIzBmMTcyYTtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgIH1cblxuICAgIC50dC1idG4ge1xuICAgICAgYmFja2dyb3VuZDogICAgIzFlMjkzYjtcbiAgICAgIGJvcmRlcjogICAgICAgIDFweCBzb2xpZCAjMzM0MTU1O1xuICAgICAgY29sb3I6ICAgICAgICAgIzk0YTNiODtcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuMnJlbSAwLjVyZW07XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBmb250LXNpemU6ICAgICAwLjcycmVtO1xuICAgICAgY3Vyc29yOiAgICAgICAgcG9pbnRlcjtcbiAgICAgIHRyYW5zaXRpb246ICAgIGFsbCAwLjE1cztcbiAgICAgIGZvbnQtZmFtaWx5OiAgIHN5c3RlbS11aTtcbiAgICB9XG4gICAgLnR0LWJ0bjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBiYWNrZ3JvdW5kOiAjMzM0MTU1O1xuICAgICAgY29sb3I6ICAgICAgI2UyZThmMDtcbiAgICAgIGJvcmRlci1jb2xvcjogIzQ3NTU2OTtcbiAgICB9XG4gICAgLnR0LWJ0bjpkaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICBjdXJzb3I6ICBub3QtYWxsb3dlZDtcbiAgICB9XG4gICAgLnR0LWJ0bi0tcmVzdW1lIHtcbiAgICAgIGJhY2tncm91bmQ6ICM3YzNhZWQ7XG4gICAgICBib3JkZXItY29sb3I6ICM3YzNhZWQ7XG4gICAgICBjb2xvcjogd2hpdGU7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgIH1cbiAgICAudHQtYnRuLS1yZXN1bWU6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICAgICAgYmFja2dyb3VuZDogIzZkMjhkOTtcbiAgICB9XG4gICAgLnR0LWJ0bi0tZXhwb3J0LCAudHQtYnRuLS1pbXBvcnQge1xuICAgICAgZm9udC1zaXplOiAwLjY4cmVtO1xuICAgIH1cbiAgICAudHQtc3BhY2VyIHsgZmxleDogMTsgfVxuXG4gICAgLyog4pSA4pSAIENvbnRlbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG4gICAgLmRldnRvb2xzLWNvbnRlbnQge1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIGZsZXg6ICAgICAgIDE7XG4gICAgICBwYWRkaW5nOiAgICAwLjI1cmVtIDA7XG4gICAgfVxuXG4gICAgLmRldnRvb2xzLWVtcHR5IHtcbiAgICAgIHBhZGRpbmc6ICAgICAycmVtO1xuICAgICAgdGV4dC1hbGlnbjogIGNlbnRlcjtcbiAgICAgIGNvbG9yOiAgICAgICAjNDc1NTY5O1xuICAgICAgZm9udC1zaXplOiAgIDAuNzhyZW07XG4gICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpO1xuICAgIH1cblxuICAgIC8qIOKUgOKUgCBMb2cgaXRlbXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG4gICAgLmxvZy1pdGVtIHtcbiAgICAgIGRpc3BsYXk6ICAgICAgICAgZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGFsaWduLWl0ZW1zOiAgICAgY2VudGVyO1xuICAgICAgcGFkZGluZzogICAgICAgICAwLjM1cmVtIDAuNzVyZW07XG4gICAgICBjdXJzb3I6ICAgICAgICAgIHBvaW50ZXI7XG4gICAgICBib3JkZXItYm90dG9tOiAgIDFweCBzb2xpZCAjMWUyOTNiO1xuICAgICAgdHJhbnNpdGlvbjogICAgICBiYWNrZ3JvdW5kIDAuMXM7XG4gICAgfVxuICAgIC5sb2ctaXRlbTpob3ZlciAgICAgeyBiYWNrZ3JvdW5kOiAjMWUyOTNiOyB9XG4gICAgLmxvZy1pdGVtLS1lcnJvciAgICB7IGJhY2tncm91bmQ6ICMxYTBhMGE7IH1cbiAgICAubG9nLWl0ZW0tLWFjdGl2ZSAgIHtcbiAgICAgIGJhY2tncm91bmQ6ICAjMWUxYjRiICFpbXBvcnRhbnQ7XG4gICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICM3YzNhZWQ7XG4gICAgfVxuICAgIC5sb2ctaXRlbS0tZnV0dXJlIHtcbiAgICAgIG9wYWNpdHk6IDAuMzU7XG4gICAgfVxuXG4gICAgLmxvZy1pdGVtX19sZWZ0ICB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMC40cmVtOyBvdmVyZmxvdzogaGlkZGVuOyBmbGV4OiAxOyB9XG4gICAgLmxvZy1pdGVtX19yaWdodCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMC4zNXJlbTsgZmxleC1zaHJpbms6IDA7IH1cblxuICAgIC5sb2ctc3RhdHVzICB7IGZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6ICMyMmM1NWU7IGZsZXgtc2hyaW5rOiAwOyB9XG4gICAgLmxvZy1pdGVtLS1lcnJvciAubG9nLXN0YXR1cyB7IGNvbG9yOiAjZWY0NDQ0OyB9XG4gICAgLmxvZy1uYW1lICAgIHsgY29sb3I6ICNlMmU4ZjA7IGZvbnQtc2l6ZTogMC43NXJlbTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IH1cbiAgICAubG9nLWR1cmF0aW9uIHsgY29sb3I6ICM2NDc0OGI7IGZvbnQtc2l6ZTogMC43cmVtOyB9XG4gICAgLmxvZy10aW1lICAgIHsgY29sb3I6ICM0NzU1Njk7IGZvbnQtc2l6ZTogMC42OHJlbTsgfVxuXG4gICAgLmxvZy1lcnJvci1iYWRnZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAgICAjN2YxZDFkO1xuICAgICAgY29sb3I6ICAgICAgICAgI2ZjYTVhNTtcbiAgICAgIGZvbnQtc2l6ZTogICAgIDAuNjhyZW07XG4gICAgICBwYWRkaW5nOiAgICAgICAwLjFyZW0gMC4zNXJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICB9XG5cbiAgICAuYnRuLXJlcGxheSB7XG4gICAgICBmb250LXNpemU6IDAuNjVyZW07XG4gICAgICBvcGFjaXR5OiAgIDAuNTtcbiAgICB9XG4gICAgLmJ0bi1yZXBsYXk6aG92ZXIgeyBvcGFjaXR5OiAxOyB9XG5cbiAgICAvKiDilIDilIAgTG9nIGRldGFpbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cbiAgICAubG9nLWRldGFpbCB7XG4gICAgICBiYWNrZ3JvdW5kOiAgICAjMGEwZjFhO1xuICAgICAgcGFkZGluZzogICAgICAgMC42cmVtIDAuNzVyZW07XG4gICAgICBib3JkZXItbGVmdDogICAzcHggc29saWQgIzNiODJmNjtcbiAgICAgIG1hcmdpbjogICAgICAgIDAgMC40cmVtIDAuNHJlbTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwO1xuICAgIH1cbiAgICAubG9nLWRldGFpbF9fZXJyb3IgICB7IGNvbG9yOiAjZmNhNWE1OyBmb250LXNpemU6IDAuNzJyZW07IG1hcmdpbi1ib3R0b206IDAuNHJlbTsgfVxuICAgIC5sb2ctZGV0YWlsX19zZWN0aW9uIHsgbWFyZ2luLWJvdHRvbTogMC40cmVtOyB9XG4gICAgLmxvZy1kZXRhaWxfX2xhYmVsICAge1xuICAgICAgY29sb3I6ICAgICAgICAgIzY0NzQ4YjtcbiAgICAgIGZvbnQtc2l6ZTogICAgIDAuNjhyZW07XG4gICAgICBkaXNwbGF5OiAgICAgICBibG9jaztcbiAgICAgIG1hcmdpbi1ib3R0b206IDAuMnJlbTtcbiAgICAgIGZvbnQtZmFtaWx5OiAgIHN5c3RlbS11aTtcbiAgICB9XG4gICAgcHJlIHtcbiAgICAgIGNvbG9yOiAgICAgICAjODZlZmFjO1xuICAgICAgZm9udC1zaXplOiAgIDAuN3JlbTtcbiAgICAgIG1hcmdpbjogICAgICAwO1xuICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgICAgd29yZC1icmVhazogIGJyZWFrLWFsbDtcbiAgICAgIG1heC1oZWlnaHQ6ICAxNDBweDtcbiAgICAgIG92ZXJmbG93LXk6ICBhdXRvO1xuICAgIH1cblxuICAgIC8qIOKUgOKUgCBTdGF0ZSB0YWIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXG4gICAgLnN0YXRlLXN0b3JlLWJsb2NrIHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMWUyOTNiO1xuICAgIH1cbiAgICAuc3RhdGUtc3RvcmUtYmxvY2s6bGFzdC1jaGlsZCB7IGJvcmRlci1ib3R0b206IG5vbmU7IH1cbiAgICAuc3RhdGUtc3RvcmUtbmFtZSB7XG4gICAgICBwYWRkaW5nOiAgICAgICAwLjRyZW0gMC43NXJlbSAwLjJyZW07XG4gICAgICBjb2xvcjogICAgICAgICAjM2I4MmY2O1xuICAgICAgZm9udC1zaXplOiAgICAgMC43MnJlbTtcbiAgICAgIGZvbnQtZmFtaWx5OiAgIHN5c3RlbS11aTtcbiAgICAgIGZvbnQtd2VpZ2h0OiAgIDYwMDtcbiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIH1cbiAgICAuc3RhdGUtdmlldyB7XG4gICAgICBjb2xvcjogICAgICAgIzg2ZWZhYztcbiAgICAgIGZvbnQtc2l6ZTogICAwLjdyZW07XG4gICAgICBwYWRkaW5nOiAgICAgMC4yNXJlbSAwLjc1cmVtIDAuNzVyZW07XG4gICAgICBtYXJnaW46ICAgICAgMDtcbiAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICAgIHdvcmQtYnJlYWs6ICBicmVhay1hbGw7XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBTdGF0b0RldlRvb2xzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgdW5zdWI/OiAoKSA9PiB2b2lkXG5cbiAgLy8gU3RhdGUgVUlcbiAgaXNPcGVuICAgICAgICAgID0gc2lnbmFsKGZhbHNlKVxuICBpc01pbmltaXplZCAgICAgPSBzaWduYWwoZmFsc2UpXG4gIGFjdGl2ZVRhYiAgICAgICA9IHNpZ25hbDwnYWN0aW9ucycgfCAnc3RhdGUnPignYWN0aW9ucycpXG4gIGxvZ3MgICAgICAgICAgICA9IHNpZ25hbDxBY3Rpb25Mb2dbXT4oW10pXG4gIHNlbGVjdGVkTG9nICAgICA9IHNpZ25hbDxBY3Rpb25Mb2cgfCBudWxsPihudWxsKVxuICBhY3RpdmVMb2dJZCAgICAgPSBzaWduYWw8bnVtYmVyIHwgbnVsbD4obnVsbClcbiAgaXNUaW1lVHJhdmVsaW5nID0gc2lnbmFsKGZhbHNlKVxuXG4gIC8vIFNuYXBzaG90IGdsb2JhbCDigJQgbGF0ZXN0IGtub3duIHN0YXRlIHBlciBzdG9yZVxuICBnbG9iYWxTdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KClcbiAgICBmb3IgKGNvbnN0IGxvZyBvZiB0aGlzLmxvZ3MoKSkge1xuICAgICAgaWYgKCFzZWVuLmhhcyhsb2cuc3RvcmVOYW1lKSkge1xuICAgICAgICBzZWVuLnNldChsb2cuc3RvcmVOYW1lLCBsb2cubmV4dFN0YXRlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VlblxuICB9KVxuXG4gIC8vIFRpbWUtdHJhdmVsIGNvbXB1dGVkXG4gIGNhblVuZG8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmxvZ3MoKS5sZW5ndGggPiAwKVxuICBjYW5SZWRvID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1RpbWVUcmF2ZWxpbmcoKSkgcmV0dXJuIGZhbHNlXG4gICAgY29uc3QgaWQgPSB0aGlzLmFjdGl2ZUxvZ0lkKClcbiAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybiBmYWxzZVxuICAgIGlmIChpZCA9PT0gLTEpIHJldHVybiB0aGlzLmxvZ3MoKS5sZW5ndGggPiAwXG4gICAgY29uc3QgaWR4ID0gdGhpcy5sb2dzKCkuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpXG4gICAgcmV0dXJuIGlkeCA+IDAgIC8vIGNhbiBnbyBmb3J3YXJkIChsb3dlciBpbmRleCA9IG5ld2VyKVxuICB9KVxuXG4gIC8vIFBvc2l0aW9uICYgc2l6ZVxuICBwb3NYICAgICAgICA9IHNpZ25hbCgyNClcbiAgcG9zWSAgICAgICAgPSBzaWduYWwod2luZG93LmlubmVySGVpZ2h0IC0gNTIwKVxuICBwYW5lbFdpZHRoICA9IHNpZ25hbCg0NDApXG4gIHBhbmVsSGVpZ2h0ID0gc2lnbmFsKDQ4MClcblxuICAvLyBEcmFnIHN0YXRlXG4gIHByaXZhdGUgaXNEcmFnZ2luZyAgPSBmYWxzZVxuICBwcml2YXRlIGlzUmVzaXppbmcgID0gZmFsc2VcbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0WCA9IDBcbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0WSA9IDBcbiAgcHJpdmF0ZSBzdGFydFcgICAgICA9IDBcbiAgcHJpdmF0ZSBzdGFydEggICAgICA9IDBcbiAgcHJpdmF0ZSBzdGFydFggICAgICA9IDBcbiAgcHJpdmF0ZSBzdGFydFkgICAgICA9IDBcblxuICAvLyBCb3VuZCBsaXN0ZW5lcnNcbiAgcHJpdmF0ZSBib3VuZE1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKVxuICBwcml2YXRlIGJvdW5kTW91c2VVcCAgID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudW5zdWIgPSBkZXZUb29scy5zdWJzY3JpYmUoKHN0YXRlOiBEZXZUb29sc1N0YXRlKSA9PiB7XG4gICAgICB0aGlzLmxvZ3Muc2V0KHN0YXRlLmxvZ3MpXG4gICAgICB0aGlzLmlzT3Blbi5zZXQoc3RhdGUuaXNPcGVuKVxuICAgICAgdGhpcy5hY3RpdmVMb2dJZC5zZXQoc3RhdGUuYWN0aXZlTG9nSWQpXG4gICAgICB0aGlzLmlzVGltZVRyYXZlbGluZy5zZXQoc3RhdGUuaXNUaW1lVHJhdmVsaW5nKVxuICAgIH0pXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAgIHRoaXMuYm91bmRNb3VzZVVwKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnN1Yj8uKClcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAgIHRoaXMuYm91bmRNb3VzZVVwKVxuICB9XG5cbiAgLy8g4pSA4pSAIFRvZ2dsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgdG9nZ2xlKCkgICAgICAgICB7IGRldlRvb2xzLnRvZ2dsZSgpIH1cbiAgdG9nZ2xlTWluaW1pemUoKSB7IHRoaXMuaXNNaW5pbWl6ZWQudXBkYXRlKHYgPT4gIXYpIH1cbiAgY2xlYXIoKSAgICAgICAgICB7IGRldlRvb2xzLmNsZWFyKCk7IHRoaXMuc2VsZWN0ZWRMb2cuc2V0KG51bGwpIH1cblxuICBzZWxlY3RMb2cobG9nOiBBY3Rpb25Mb2cpIHtcbiAgICB0aGlzLnNlbGVjdGVkTG9nLnNldCh0aGlzLnNlbGVjdGVkTG9nKCk/LmlkID09PSBsb2cuaWQgPyBudWxsIDogbG9nKVxuICB9XG5cbiAgZm9ybWF0VGltZShpc286IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGlzbykudG9UaW1lU3RyaW5nKCkuc2xpY2UoMCwgOClcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaW1lLXRyYXZlbCBhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBvblRyYXZlbFRvKGxvZzogQWN0aW9uTG9nKSB7XG4gICAgLy8gVG9nZ2xlIGRldGFpbCB2aWV3XG4gICAgdGhpcy5zZWxlY3RMb2cobG9nKVxuICAgIC8vIEp1bXAgdG8gdGhpcyBhY3Rpb24ncyBzdGF0ZVxuICAgIGRldlRvb2xzLnRyYXZlbFRvKGxvZy5pZClcbiAgfVxuXG4gIG9uVW5kbygpICAgeyBkZXZUb29scy51bmRvKCkgfVxuICBvblJlZG8oKSAgIHsgZGV2VG9vbHMucmVkbygpIH1cbiAgb25SZXN1bWUoKSB7IGRldlRvb2xzLnJlc3VtZSgpIH1cblxuICBvblJlcGxheShsb2c6IEFjdGlvbkxvZywgZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBkZXZUb29scy5yZXBsYXkobG9nLmlkKVxuICB9XG5cbiAgaXNGdXR1cmVMb2cobG9nOiBBY3Rpb25Mb2cpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNUaW1lVHJhdmVsaW5nKCkpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5hY3RpdmVMb2dJZCgpXG4gICAgaWYgKGFjdGl2ZUlkID09PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYWN0aXZlSWQgPT09IC0xKSByZXR1cm4gdHJ1ZSAgLy8gYWxsIGxvZ3MgYXJlIFwiZnV0dXJlXCJcbiAgICBjb25zdCBhY3RpdmVJZHggPSB0aGlzLmxvZ3MoKS5maW5kSW5kZXgobCA9PiBsLmlkID09PSBhY3RpdmVJZClcbiAgICBjb25zdCBsb2dJZHggPSB0aGlzLmxvZ3MoKS5maW5kSW5kZXgobCA9PiBsLmlkID09PSBsb2cuaWQpXG4gICAgcmV0dXJuIGxvZ0lkeCA8IGFjdGl2ZUlkeCAgLy8gbmV3ZXIgbG9ncyAobG93ZXIgaW5kZXgpIGFyZSBcImZ1dHVyZVwiXG4gIH1cblxuICAvLyDilIDilIAgRXhwb3J0L0ltcG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgb25FeHBvcnQoKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBkZXZUb29scy5leHBvcnRTbmFwc2hvdCgpXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHNuYXBzaG90LCBudWxsLCAyKVxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbanNvbl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICBhLmhyZWYgPSB1cmxcbiAgICBhLmRvd25sb2FkID0gYG5nc3RhdG8tc25hcHNob3QtJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTkpLnJlcGxhY2UoLzovZywgJy0nKX0uanNvbmBcbiAgICBhLmNsaWNrKClcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybClcbiAgfVxuXG4gIG9uSW1wb3J0KCkge1xuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbdHlwZT1cImZpbGVcIl0nKSBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgaW5wdXQ/LmNsaWNrKClcbiAgfVxuXG4gIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGZpbGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzPy5bMF1cbiAgICBpZiAoIWZpbGUpIHJldHVyblxuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IEpTT04ucGFyc2UocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpXG4gICAgICAgIGRldlRvb2xzLmltcG9ydFNuYXBzaG90KHNuYXBzaG90KVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbbmdTdGF0byBEZXZUb29sc10gSW52YWxpZCBzbmFwc2hvdCBmaWxlOicsIGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpXG4gICAgLy8gUmVzZXQgaW5wdXRcbiAgICA7KGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9ICcnXG4gIH1cblxuICAvLyDilIDilIAgRHJhZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgb25EcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIGlmICgoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsYXNzTGlzdC5jb250YWlucygnYnRuLWljb24nKSkgcmV0dXJuXG4gICAgdGhpcy5pc0RyYWdnaW5nICA9IHRydWVcbiAgICB0aGlzLmRyYWdPZmZzZXRYID0gZS5jbGllbnRYIC0gdGhpcy5wb3NYKClcbiAgICB0aGlzLmRyYWdPZmZzZXRZID0gZS5jbGllbnRZIC0gdGhpcy5wb3NZKClcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXNpemUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIG9uUmVzaXplU3RhcnQoZTogTW91c2VFdmVudCkge1xuICAgIHRoaXMuaXNSZXNpemluZyA9IHRydWVcbiAgICB0aGlzLnN0YXJ0VyAgICAgPSB0aGlzLnBhbmVsV2lkdGgoKVxuICAgIHRoaXMuc3RhcnRIICAgICA9IHRoaXMucGFuZWxIZWlnaHQoKVxuICAgIHRoaXMuc3RhcnRYICAgICA9IGUuY2xpZW50WFxuICAgIHRoaXMuc3RhcnRZICAgICA9IGUuY2xpZW50WVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgfVxuXG4gIC8vIOKUgOKUgCBNb3VzZSBNb3ZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBvbk1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgdGhpcy5wb3NYLnNldChNYXRoLm1heCgwLCBlLmNsaWVudFggLSB0aGlzLmRyYWdPZmZzZXRYKSlcbiAgICAgIHRoaXMucG9zWS5zZXQoTWF0aC5tYXgoMCwgZS5jbGllbnRZIC0gdGhpcy5kcmFnT2Zmc2V0WSkpXG4gICAgfVxuICAgIGlmICh0aGlzLmlzUmVzaXppbmcpIHtcbiAgICAgIGNvbnN0IG5ld1cgPSBNYXRoLm1heCgzMDAsIHRoaXMuc3RhcnRXICsgZS5jbGllbnRYIC0gdGhpcy5zdGFydFgpXG4gICAgICBjb25zdCBuZXdIID0gTWF0aC5tYXgoMjAwLCB0aGlzLnN0YXJ0SCArIGUuY2xpZW50WSAtIHRoaXMuc3RhcnRZKVxuICAgICAgdGhpcy5wYW5lbFdpZHRoLnNldChuZXdXKVxuICAgICAgdGhpcy5wYW5lbEhlaWdodC5zZXQobmV3SClcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgTW91c2UgVXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIG9uTW91c2VVcCgpIHtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZVxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlXG4gIH1cbn0iXX0=
|