@ngstato/angular 0.1.3 → 0.1.4
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/README.md +6 -0
- package/dist/README.md +6 -0
- package/dist/devtools.component.d.ts +0 -1
- package/dist/esm2022/devtools.component.mjs +248 -250
- package/dist/fesm2022/ngstato-angular.mjs +246 -247
- package/dist/fesm2022/ngstato-angular.mjs.map +1 -1
- package/ng-package.json +2 -1
- package/package.json +14 -1
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { Component, signal
|
|
1
|
+
import { Component, signal } from '@angular/core';
|
|
2
2
|
import { devTools } from '@ngstato/core';
|
|
3
|
-
import { STATO_CONFIG } from './provide-ngstato';
|
|
4
3
|
import { JsonPipe } from '@angular/common';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
5
|
export class StatoDevToolsComponent {
|
|
7
|
-
config = inject(STATO_CONFIG, { optional: true });
|
|
8
6
|
unsub;
|
|
9
7
|
// State UI
|
|
10
8
|
isOpen = signal(false);
|
|
@@ -90,256 +88,256 @@ export class StatoDevToolsComponent {
|
|
|
90
88
|
this.isResizing = false;
|
|
91
89
|
}
|
|
92
90
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StatoDevToolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
93
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StatoDevToolsComponent, isStandalone: true, selector: "ngstato-devtools", ngImport: i0, template: `
|
|
94
|
-
<!-- Bouton flottant -->
|
|
95
|
-
@if (!isOpen()) {
|
|
96
|
-
<button class="devtools-fab" (click)="toggle()">
|
|
97
|
-
🛠 Stato
|
|
98
|
-
</button>
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
<!-- Panel -->
|
|
102
|
-
@if (isOpen()) {
|
|
103
|
-
<div
|
|
104
|
-
class="devtools-panel"
|
|
105
|
-
[class.devtools-panel--minimized]="isMinimized()"
|
|
106
|
-
[style.left.px]="posX()"
|
|
107
|
-
[style.top.px]="posY()"
|
|
108
|
-
[style.width.px]="isMinimized() ? 200 : panelWidth()"
|
|
109
|
-
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
110
|
-
>
|
|
111
|
-
|
|
112
|
-
<!-- Header — draggable -->
|
|
113
|
-
<div
|
|
114
|
-
class="devtools-header"
|
|
115
|
-
(mousedown)="onDragStart($event)"
|
|
116
|
-
>
|
|
117
|
-
<span class="devtools-title">🛠 Stato</span>
|
|
118
|
-
<div class="devtools-header-actions">
|
|
119
|
-
@if (!isMinimized()) {
|
|
120
|
-
<button class="btn-icon" (click)="clear()" title="Vider">🗑</button>
|
|
121
|
-
}
|
|
122
|
-
<button class="btn-icon" (click)="toggleMinimize()" title="Minimiser/Agrandir">
|
|
123
|
-
{{ isMinimized() ? '▲' : '▼' }}
|
|
124
|
-
</button>
|
|
125
|
-
<button class="btn-icon" (click)="toggle()" title="Fermer">✕</button>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
|
|
129
|
-
<!-- Resize handle — coin bas droite -->
|
|
130
|
-
@if (!isMinimized()) {
|
|
131
|
-
<div
|
|
132
|
-
class="devtools-resize"
|
|
133
|
-
(mousedown)="onResizeStart($event)"
|
|
134
|
-
>⊿</div>
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
@if (!isMinimized()) {
|
|
138
|
-
|
|
139
|
-
<!-- Tabs -->
|
|
140
|
-
<div class="devtools-tabs">
|
|
141
|
-
<button
|
|
142
|
-
class="tab"
|
|
143
|
-
[class.tab--active]="activeTab() === 'actions'"
|
|
144
|
-
(click)="activeTab.set('actions')"
|
|
145
|
-
>
|
|
146
|
-
Actions ({{ logs().length }})
|
|
147
|
-
</button>
|
|
148
|
-
<button
|
|
149
|
-
class="tab"
|
|
150
|
-
[class.tab--active]="activeTab() === 'state'"
|
|
151
|
-
(click)="activeTab.set('state')"
|
|
152
|
-
>
|
|
153
|
-
State
|
|
154
|
-
</button>
|
|
155
|
-
</div>
|
|
156
|
-
|
|
157
|
-
<!-- Tab Actions -->
|
|
158
|
-
@if (activeTab() === 'actions') {
|
|
159
|
-
<div class="devtools-content">
|
|
160
|
-
@if (!logs().length) {
|
|
161
|
-
<div class="devtools-empty">Aucune action pour l'instant</div>
|
|
162
|
-
}
|
|
163
|
-
@for (log of logs(); track log.id) {
|
|
164
|
-
<div
|
|
165
|
-
class="log-item"
|
|
166
|
-
[class.log-item--error]="log.status === 'error'"
|
|
167
|
-
(click)="selectLog(log)"
|
|
168
|
-
>
|
|
169
|
-
<div class="log-item__left">
|
|
170
|
-
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
171
|
-
<span class="log-name">{{ log.name }}</span>
|
|
172
|
-
</div>
|
|
173
|
-
<div class="log-item__right">
|
|
174
|
-
@if (log.status === 'error') {
|
|
175
|
-
<span class="log-error-badge">erreur</span>
|
|
176
|
-
} @else {
|
|
177
|
-
<span class="log-duration">{{ log.duration }}ms</span>
|
|
178
|
-
}
|
|
179
|
-
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
180
|
-
</div>
|
|
181
|
-
</div>
|
|
182
|
-
|
|
183
|
-
@if (selectedLog()?.id === log.id) {
|
|
184
|
-
<div class="log-detail">
|
|
185
|
-
@if (log.error) {
|
|
186
|
-
<div class="log-detail__error">{{ log.error }}</div>
|
|
187
|
-
}
|
|
188
|
-
<div class="log-detail__section">
|
|
189
|
-
<span class="log-detail__label">Avant</span>
|
|
190
|
-
<pre>{{ log.prevState | json }}</pre>
|
|
191
|
-
</div>
|
|
192
|
-
<div class="log-detail__section">
|
|
193
|
-
<span class="log-detail__label">Après</span>
|
|
194
|
-
<pre>{{ log.nextState | json }}</pre>
|
|
195
|
-
</div>
|
|
196
|
-
</div>
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
</div>
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
<!-- Tab State -->
|
|
203
|
-
@if (activeTab() === 'state') {
|
|
204
|
-
<div class="devtools-content">
|
|
205
|
-
@if (logs().length) {
|
|
206
|
-
<pre class="state-view">{{ logs()[0].nextState | json }}</pre>
|
|
207
|
-
} @else {
|
|
208
|
-
<div class="devtools-empty">Aucun state disponible</div>
|
|
209
|
-
}
|
|
210
|
-
</div>
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
</div>
|
|
215
|
-
}
|
|
91
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: StatoDevToolsComponent, isStandalone: true, selector: "ngstato-devtools", ngImport: i0, template: `
|
|
92
|
+
<!-- Bouton flottant -->
|
|
93
|
+
@if (!isOpen()) {
|
|
94
|
+
<button class="devtools-fab" (click)="toggle()">
|
|
95
|
+
🛠 Stato
|
|
96
|
+
</button>
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
<!-- Panel -->
|
|
100
|
+
@if (isOpen()) {
|
|
101
|
+
<div
|
|
102
|
+
class="devtools-panel"
|
|
103
|
+
[class.devtools-panel--minimized]="isMinimized()"
|
|
104
|
+
[style.left.px]="posX()"
|
|
105
|
+
[style.top.px]="posY()"
|
|
106
|
+
[style.width.px]="isMinimized() ? 200 : panelWidth()"
|
|
107
|
+
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
108
|
+
>
|
|
109
|
+
|
|
110
|
+
<!-- Header — draggable -->
|
|
111
|
+
<div
|
|
112
|
+
class="devtools-header"
|
|
113
|
+
(mousedown)="onDragStart($event)"
|
|
114
|
+
>
|
|
115
|
+
<span class="devtools-title">🛠 Stato</span>
|
|
116
|
+
<div class="devtools-header-actions">
|
|
117
|
+
@if (!isMinimized()) {
|
|
118
|
+
<button class="btn-icon" (click)="clear()" title="Vider">🗑</button>
|
|
119
|
+
}
|
|
120
|
+
<button class="btn-icon" (click)="toggleMinimize()" title="Minimiser/Agrandir">
|
|
121
|
+
{{ isMinimized() ? '▲' : '▼' }}
|
|
122
|
+
</button>
|
|
123
|
+
<button class="btn-icon" (click)="toggle()" title="Fermer">✕</button>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<!-- Resize handle — coin bas droite -->
|
|
128
|
+
@if (!isMinimized()) {
|
|
129
|
+
<div
|
|
130
|
+
class="devtools-resize"
|
|
131
|
+
(mousedown)="onResizeStart($event)"
|
|
132
|
+
>⊿</div>
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@if (!isMinimized()) {
|
|
136
|
+
|
|
137
|
+
<!-- Tabs -->
|
|
138
|
+
<div class="devtools-tabs">
|
|
139
|
+
<button
|
|
140
|
+
class="tab"
|
|
141
|
+
[class.tab--active]="activeTab() === 'actions'"
|
|
142
|
+
(click)="activeTab.set('actions')"
|
|
143
|
+
>
|
|
144
|
+
Actions ({{ logs().length }})
|
|
145
|
+
</button>
|
|
146
|
+
<button
|
|
147
|
+
class="tab"
|
|
148
|
+
[class.tab--active]="activeTab() === 'state'"
|
|
149
|
+
(click)="activeTab.set('state')"
|
|
150
|
+
>
|
|
151
|
+
State
|
|
152
|
+
</button>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<!-- Tab Actions -->
|
|
156
|
+
@if (activeTab() === 'actions') {
|
|
157
|
+
<div class="devtools-content">
|
|
158
|
+
@if (!logs().length) {
|
|
159
|
+
<div class="devtools-empty">Aucune action pour l'instant</div>
|
|
160
|
+
}
|
|
161
|
+
@for (log of logs(); track log.id) {
|
|
162
|
+
<div
|
|
163
|
+
class="log-item"
|
|
164
|
+
[class.log-item--error]="log.status === 'error'"
|
|
165
|
+
(click)="selectLog(log)"
|
|
166
|
+
>
|
|
167
|
+
<div class="log-item__left">
|
|
168
|
+
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
169
|
+
<span class="log-name">{{ log.name }}</span>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="log-item__right">
|
|
172
|
+
@if (log.status === 'error') {
|
|
173
|
+
<span class="log-error-badge">erreur</span>
|
|
174
|
+
} @else {
|
|
175
|
+
<span class="log-duration">{{ log.duration }}ms</span>
|
|
176
|
+
}
|
|
177
|
+
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
@if (selectedLog()?.id === log.id) {
|
|
182
|
+
<div class="log-detail">
|
|
183
|
+
@if (log.error) {
|
|
184
|
+
<div class="log-detail__error">{{ log.error }}</div>
|
|
185
|
+
}
|
|
186
|
+
<div class="log-detail__section">
|
|
187
|
+
<span class="log-detail__label">Avant</span>
|
|
188
|
+
<pre>{{ log.prevState | json }}</pre>
|
|
189
|
+
</div>
|
|
190
|
+
<div class="log-detail__section">
|
|
191
|
+
<span class="log-detail__label">Après</span>
|
|
192
|
+
<pre>{{ log.nextState | json }}</pre>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
</div>
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
<!-- Tab State -->
|
|
201
|
+
@if (activeTab() === 'state') {
|
|
202
|
+
<div class="devtools-content">
|
|
203
|
+
@if (logs().length) {
|
|
204
|
+
<pre class="state-view">{{ logs()[0].nextState | json }}</pre>
|
|
205
|
+
} @else {
|
|
206
|
+
<div class="devtools-empty">Aucun state disponible</div>
|
|
207
|
+
}
|
|
208
|
+
</div>
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
</div>
|
|
213
|
+
}
|
|
216
214
|
`, isInline: true, styles: [".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 #0006;z-index:9999;display:flex;flex-direction:column;overflow:hidden;font-family:Courier New,monospace;min-width:200px;min-height:40px}.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}.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}.tab:hover{color:#e2e8f0}.tab--active{color:#3b82f6;border-bottom:2px solid #3b82f6}.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}.log-item:hover{background:#1e293b}.log-item--error{background:#1a0a0a}.log-item__left{display:flex;align-items:center;gap:.4rem;overflow:hidden}.log-item__right{display:flex;align-items:center;gap:.4rem;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}.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-view{color:#86efac;font-size:.7rem;padding:.75rem;margin:0;white-space:pre-wrap;word-break:break-all}\n"], dependencies: [{ kind: "pipe", type: JsonPipe, name: "json" }] });
|
|
217
215
|
}
|
|
218
216
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StatoDevToolsComponent, decorators: [{
|
|
219
217
|
type: Component,
|
|
220
|
-
args: [{ selector: 'ngstato-devtools', standalone: true, imports: [JsonPipe], template: `
|
|
221
|
-
<!-- Bouton flottant -->
|
|
222
|
-
@if (!isOpen()) {
|
|
223
|
-
<button class="devtools-fab" (click)="toggle()">
|
|
224
|
-
🛠 Stato
|
|
225
|
-
</button>
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
<!-- Panel -->
|
|
229
|
-
@if (isOpen()) {
|
|
230
|
-
<div
|
|
231
|
-
class="devtools-panel"
|
|
232
|
-
[class.devtools-panel--minimized]="isMinimized()"
|
|
233
|
-
[style.left.px]="posX()"
|
|
234
|
-
[style.top.px]="posY()"
|
|
235
|
-
[style.width.px]="isMinimized() ? 200 : panelWidth()"
|
|
236
|
-
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
237
|
-
>
|
|
238
|
-
|
|
239
|
-
<!-- Header — draggable -->
|
|
240
|
-
<div
|
|
241
|
-
class="devtools-header"
|
|
242
|
-
(mousedown)="onDragStart($event)"
|
|
243
|
-
>
|
|
244
|
-
<span class="devtools-title">🛠 Stato</span>
|
|
245
|
-
<div class="devtools-header-actions">
|
|
246
|
-
@if (!isMinimized()) {
|
|
247
|
-
<button class="btn-icon" (click)="clear()" title="Vider">🗑</button>
|
|
248
|
-
}
|
|
249
|
-
<button class="btn-icon" (click)="toggleMinimize()" title="Minimiser/Agrandir">
|
|
250
|
-
{{ isMinimized() ? '▲' : '▼' }}
|
|
251
|
-
</button>
|
|
252
|
-
<button class="btn-icon" (click)="toggle()" title="Fermer">✕</button>
|
|
253
|
-
</div>
|
|
254
|
-
</div>
|
|
255
|
-
|
|
256
|
-
<!-- Resize handle — coin bas droite -->
|
|
257
|
-
@if (!isMinimized()) {
|
|
258
|
-
<div
|
|
259
|
-
class="devtools-resize"
|
|
260
|
-
(mousedown)="onResizeStart($event)"
|
|
261
|
-
>⊿</div>
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
@if (!isMinimized()) {
|
|
265
|
-
|
|
266
|
-
<!-- Tabs -->
|
|
267
|
-
<div class="devtools-tabs">
|
|
268
|
-
<button
|
|
269
|
-
class="tab"
|
|
270
|
-
[class.tab--active]="activeTab() === 'actions'"
|
|
271
|
-
(click)="activeTab.set('actions')"
|
|
272
|
-
>
|
|
273
|
-
Actions ({{ logs().length }})
|
|
274
|
-
</button>
|
|
275
|
-
<button
|
|
276
|
-
class="tab"
|
|
277
|
-
[class.tab--active]="activeTab() === 'state'"
|
|
278
|
-
(click)="activeTab.set('state')"
|
|
279
|
-
>
|
|
280
|
-
State
|
|
281
|
-
</button>
|
|
282
|
-
</div>
|
|
283
|
-
|
|
284
|
-
<!-- Tab Actions -->
|
|
285
|
-
@if (activeTab() === 'actions') {
|
|
286
|
-
<div class="devtools-content">
|
|
287
|
-
@if (!logs().length) {
|
|
288
|
-
<div class="devtools-empty">Aucune action pour l'instant</div>
|
|
289
|
-
}
|
|
290
|
-
@for (log of logs(); track log.id) {
|
|
291
|
-
<div
|
|
292
|
-
class="log-item"
|
|
293
|
-
[class.log-item--error]="log.status === 'error'"
|
|
294
|
-
(click)="selectLog(log)"
|
|
295
|
-
>
|
|
296
|
-
<div class="log-item__left">
|
|
297
|
-
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
298
|
-
<span class="log-name">{{ log.name }}</span>
|
|
299
|
-
</div>
|
|
300
|
-
<div class="log-item__right">
|
|
301
|
-
@if (log.status === 'error') {
|
|
302
|
-
<span class="log-error-badge">erreur</span>
|
|
303
|
-
} @else {
|
|
304
|
-
<span class="log-duration">{{ log.duration }}ms</span>
|
|
305
|
-
}
|
|
306
|
-
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
307
|
-
</div>
|
|
308
|
-
</div>
|
|
309
|
-
|
|
310
|
-
@if (selectedLog()?.id === log.id) {
|
|
311
|
-
<div class="log-detail">
|
|
312
|
-
@if (log.error) {
|
|
313
|
-
<div class="log-detail__error">{{ log.error }}</div>
|
|
314
|
-
}
|
|
315
|
-
<div class="log-detail__section">
|
|
316
|
-
<span class="log-detail__label">Avant</span>
|
|
317
|
-
<pre>{{ log.prevState | json }}</pre>
|
|
318
|
-
</div>
|
|
319
|
-
<div class="log-detail__section">
|
|
320
|
-
<span class="log-detail__label">Après</span>
|
|
321
|
-
<pre>{{ log.nextState | json }}</pre>
|
|
322
|
-
</div>
|
|
323
|
-
</div>
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
</div>
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
<!-- Tab State -->
|
|
330
|
-
@if (activeTab() === 'state') {
|
|
331
|
-
<div class="devtools-content">
|
|
332
|
-
@if (logs().length) {
|
|
333
|
-
<pre class="state-view">{{ logs()[0].nextState | json }}</pre>
|
|
334
|
-
} @else {
|
|
335
|
-
<div class="devtools-empty">Aucun state disponible</div>
|
|
336
|
-
}
|
|
337
|
-
</div>
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
</div>
|
|
342
|
-
}
|
|
218
|
+
args: [{ selector: 'ngstato-devtools', standalone: true, imports: [JsonPipe], template: `
|
|
219
|
+
<!-- Bouton flottant -->
|
|
220
|
+
@if (!isOpen()) {
|
|
221
|
+
<button class="devtools-fab" (click)="toggle()">
|
|
222
|
+
🛠 Stato
|
|
223
|
+
</button>
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
<!-- Panel -->
|
|
227
|
+
@if (isOpen()) {
|
|
228
|
+
<div
|
|
229
|
+
class="devtools-panel"
|
|
230
|
+
[class.devtools-panel--minimized]="isMinimized()"
|
|
231
|
+
[style.left.px]="posX()"
|
|
232
|
+
[style.top.px]="posY()"
|
|
233
|
+
[style.width.px]="isMinimized() ? 200 : panelWidth()"
|
|
234
|
+
[style.height]="isMinimized() ? 'auto' : panelHeight() + 'px'"
|
|
235
|
+
>
|
|
236
|
+
|
|
237
|
+
<!-- Header — draggable -->
|
|
238
|
+
<div
|
|
239
|
+
class="devtools-header"
|
|
240
|
+
(mousedown)="onDragStart($event)"
|
|
241
|
+
>
|
|
242
|
+
<span class="devtools-title">🛠 Stato</span>
|
|
243
|
+
<div class="devtools-header-actions">
|
|
244
|
+
@if (!isMinimized()) {
|
|
245
|
+
<button class="btn-icon" (click)="clear()" title="Vider">🗑</button>
|
|
246
|
+
}
|
|
247
|
+
<button class="btn-icon" (click)="toggleMinimize()" title="Minimiser/Agrandir">
|
|
248
|
+
{{ isMinimized() ? '▲' : '▼' }}
|
|
249
|
+
</button>
|
|
250
|
+
<button class="btn-icon" (click)="toggle()" title="Fermer">✕</button>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<!-- Resize handle — coin bas droite -->
|
|
255
|
+
@if (!isMinimized()) {
|
|
256
|
+
<div
|
|
257
|
+
class="devtools-resize"
|
|
258
|
+
(mousedown)="onResizeStart($event)"
|
|
259
|
+
>⊿</div>
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
@if (!isMinimized()) {
|
|
263
|
+
|
|
264
|
+
<!-- Tabs -->
|
|
265
|
+
<div class="devtools-tabs">
|
|
266
|
+
<button
|
|
267
|
+
class="tab"
|
|
268
|
+
[class.tab--active]="activeTab() === 'actions'"
|
|
269
|
+
(click)="activeTab.set('actions')"
|
|
270
|
+
>
|
|
271
|
+
Actions ({{ logs().length }})
|
|
272
|
+
</button>
|
|
273
|
+
<button
|
|
274
|
+
class="tab"
|
|
275
|
+
[class.tab--active]="activeTab() === 'state'"
|
|
276
|
+
(click)="activeTab.set('state')"
|
|
277
|
+
>
|
|
278
|
+
State
|
|
279
|
+
</button>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
<!-- Tab Actions -->
|
|
283
|
+
@if (activeTab() === 'actions') {
|
|
284
|
+
<div class="devtools-content">
|
|
285
|
+
@if (!logs().length) {
|
|
286
|
+
<div class="devtools-empty">Aucune action pour l'instant</div>
|
|
287
|
+
}
|
|
288
|
+
@for (log of logs(); track log.id) {
|
|
289
|
+
<div
|
|
290
|
+
class="log-item"
|
|
291
|
+
[class.log-item--error]="log.status === 'error'"
|
|
292
|
+
(click)="selectLog(log)"
|
|
293
|
+
>
|
|
294
|
+
<div class="log-item__left">
|
|
295
|
+
<span class="log-status">{{ log.status === 'success' ? '✓' : '✗' }}</span>
|
|
296
|
+
<span class="log-name">{{ log.name }}</span>
|
|
297
|
+
</div>
|
|
298
|
+
<div class="log-item__right">
|
|
299
|
+
@if (log.status === 'error') {
|
|
300
|
+
<span class="log-error-badge">erreur</span>
|
|
301
|
+
} @else {
|
|
302
|
+
<span class="log-duration">{{ log.duration }}ms</span>
|
|
303
|
+
}
|
|
304
|
+
<span class="log-time">{{ formatTime(log.at) }}</span>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
|
|
308
|
+
@if (selectedLog()?.id === log.id) {
|
|
309
|
+
<div class="log-detail">
|
|
310
|
+
@if (log.error) {
|
|
311
|
+
<div class="log-detail__error">{{ log.error }}</div>
|
|
312
|
+
}
|
|
313
|
+
<div class="log-detail__section">
|
|
314
|
+
<span class="log-detail__label">Avant</span>
|
|
315
|
+
<pre>{{ log.prevState | json }}</pre>
|
|
316
|
+
</div>
|
|
317
|
+
<div class="log-detail__section">
|
|
318
|
+
<span class="log-detail__label">Après</span>
|
|
319
|
+
<pre>{{ log.nextState | json }}</pre>
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
</div>
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
<!-- Tab State -->
|
|
328
|
+
@if (activeTab() === 'state') {
|
|
329
|
+
<div class="devtools-content">
|
|
330
|
+
@if (logs().length) {
|
|
331
|
+
<pre class="state-view">{{ logs()[0].nextState | json }}</pre>
|
|
332
|
+
} @else {
|
|
333
|
+
<div class="devtools-empty">Aucun state disponible</div>
|
|
334
|
+
}
|
|
335
|
+
</div>
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
</div>
|
|
340
|
+
}
|
|
343
341
|
`, styles: [".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 #0006;z-index:9999;display:flex;flex-direction:column;overflow:hidden;font-family:Courier New,monospace;min-width:200px;min-height:40px}.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}.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}.tab:hover{color:#e2e8f0}.tab--active{color:#3b82f6;border-bottom:2px solid #3b82f6}.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}.log-item:hover{background:#1e293b}.log-item--error{background:#1a0a0a}.log-item__left{display:flex;align-items:center;gap:.4rem;overflow:hidden}.log-item__right{display:flex;align-items:center;gap:.4rem;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}.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-view{color:#86efac;font-size:.7rem;padding:.75rem;margin:0;white-space:pre-wrap;word-break:break-all}\n"] }]
|
|
344
342
|
}] });
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2dG9vbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RldnRvb2xzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFDTixNQUFNLEVBSVAsTUFBNkIsZUFBZSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBVyxlQUFlLENBQUE7QUFFN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFPLG1CQUFtQixDQUFBO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTs7QUFrVDFDLE1BQU0sT0FBTyxzQkFBc0I7SUFFekIsTUFBTSxHQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNsRCxLQUFLLENBQWE7SUFFMUIsV0FBVztJQUNYLE1BQU0sR0FBUSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0IsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMzQixTQUFTLEdBQUssTUFBTSxDQUFzQixTQUFTLENBQUMsQ0FBQTtJQUNwRCxJQUFJLEdBQVUsTUFBTSxDQUFjLEVBQUUsQ0FBQyxDQUFBO0lBQ3JDLFdBQVcsR0FBRyxNQUFNLENBQW1CLElBQUksQ0FBQyxDQUFBO0lBRTVDLHFCQUFxQjtJQUNyQixJQUFJLEdBQVUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3hCLElBQUksR0FBVSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUM5QyxVQUFVLEdBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFFekIsYUFBYTtJQUNMLFVBQVUsR0FBSSxLQUFLLENBQUE7SUFDbkIsVUFBVSxHQUFJLEtBQUss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QUMsSUFBSSxDQUFDLENBQUE7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsU0FBUztRQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLENBQUM7d0dBakdVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDRFQTVTdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJIVCx3bUdBNUhZLFFBQVE7OzRGQTZTVixzQkFBc0I7a0JBaFRsQyxTQUFTOytCQUNJLGtCQUFrQixjQUNsQixJQUFJLFdBQ0osQ0FBQyxRQUFRLENBQUMsWUFDWjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkhUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBzaWduYWwsXHJcbiAgaW5qZWN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEFmdGVyVmlld0luaXRcclxufSAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IGRldlRvb2xzIH0gICAgICBmcm9tICdAbmdzdGF0by9jb3JlJ1xyXG5pbXBvcnQgdHlwZSB7IEFjdGlvbkxvZyB9IGZyb20gJ0BuZ3N0YXRvL2NvcmUnXHJcbmltcG9ydCB7IFNUQVRPX0NPTkZJRyB9ICBmcm9tICcuL3Byb3ZpZGUtbmdzdGF0bydcclxuaW1wb3J0IHsgSnNvblBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogICAnbmdzdGF0by1kZXZ0b29scycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiAgICBbSnNvblBpcGVdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8IS0tIEJvdXRvbiBmbG90dGFudCAtLT5cclxuICAgIEBpZiAoIWlzT3BlbigpKSB7XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJkZXZ0b29scy1mYWJcIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cclxuICAgICAgICDwn5ugIFN0YXRvXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG5cclxuICAgIDwhLS0gUGFuZWwgLS0+XHJcbiAgICBAaWYgKGlzT3BlbigpKSB7XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImRldnRvb2xzLXBhbmVsXCJcclxuICAgICAgICBbY2xhc3MuZGV2dG9vbHMtcGFuZWwtLW1pbmltaXplZF09XCJpc01pbmltaXplZCgpXCJcclxuICAgICAgICBbc3R5bGUubGVmdC5weF09XCJwb3NYKClcIlxyXG4gICAgICAgIFtzdHlsZS50b3AucHhdPVwicG9zWSgpXCJcclxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiaXNNaW5pbWl6ZWQoKSA/IDIwMCA6IHBhbmVsV2lkdGgoKVwiXHJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJpc01pbmltaXplZCgpID8gJ2F1dG8nIDogcGFuZWxIZWlnaHQoKSArICdweCdcIlxyXG4gICAgICA+XHJcblxyXG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBkcmFnZ2FibGUgLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJkZXZ0b29scy1oZWFkZXJcIlxyXG4gICAgICAgICAgKG1vdXNlZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldnRvb2xzLXRpdGxlXCI+8J+boCBTdGF0bzwvc3Bhbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy1oZWFkZXItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICBAaWYgKCFpc01pbmltaXplZCgpKSB7XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uXCIgKGNsaWNrKT1cImNsZWFyKClcIiB0aXRsZT1cIlZpZGVyXCI+8J+XkTwvYnV0dG9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4taWNvblwiIChjbGljayk9XCJ0b2dnbGVNaW5pbWl6ZSgpXCIgdGl0bGU9XCJNaW5pbWlzZXIvQWdyYW5kaXJcIj5cclxuICAgICAgICAgICAgICB7eyBpc01pbmltaXplZCgpID8gJ+KWsicgOiAn4pa8JyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1pY29uXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCIgdGl0bGU9XCJGZXJtZXJcIj7inJU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlc2l6ZSBoYW5kbGUg4oCUIGNvaW4gYmFzIGRyb2l0ZSAtLT5cclxuICAgICAgICBAaWYgKCFpc01pbmltaXplZCgpKSB7XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiZGV2dG9vbHMtcmVzaXplXCJcclxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIlxyXG4gICAgICAgICAgPuKKvzwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQGlmICghaXNNaW5pbWl6ZWQoKSkge1xyXG5cclxuICAgICAgICAgIDwhLS0gVGFicyAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZ0b29scy10YWJzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cInRhYlwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLnRhYi0tYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnYWN0aW9ucydcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhY3RpdmVUYWIuc2V0KCdhY3Rpb25zJylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgQWN0aW9ucyAoe3sgbG9ncygpLmxlbmd0aCB9fSlcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBjbGFzcz1cInRhYlwiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLnRhYi0tYWN0aXZlXT1cImFjdGl2ZVRhYigpID09PSAnc3RhdGUnXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aXZlVGFiLnNldCgnc3RhdGUnKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICBTdGF0ZVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gVGFiIEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICBAaWYgKGFjdGl2ZVRhYigpID09PSAnYWN0aW9ucycpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICBAaWYgKCFsb2dzKCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2dG9vbHMtZW1wdHlcIj5BdWN1bmUgYWN0aW9uIHBvdXIgbCdpbnN0YW50PC9kaXY+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIEBmb3IgKGxvZyBvZiBsb2dzKCk7IHRyYWNrIGxvZy5pZCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImxvZy1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxvZy1pdGVtLS1lcnJvcl09XCJsb2cuc3RhdHVzID09PSAnZXJyb3InXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvZyhsb2cpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1pdGVtX19sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctc3RhdHVzXCI+e3sgbG9nLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnID8gJ+KckycgOiAn4pyXJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1uYW1lXCI+e3sgbG9nLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWl0ZW1fX3JpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2cuc3RhdHVzID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1lcnJvci1iYWRnZVwiPmVycmV1cjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLWR1cmF0aW9uXCI+e3sgbG9nLmR1cmF0aW9uIH19bXM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXRpbWVcIj57eyBmb3JtYXRUaW1lKGxvZy5hdCkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZExvZygpPy5pZCA9PT0gbG9nLmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2cuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsX19lcnJvclwiPnt7IGxvZy5lcnJvciB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nLWRldGFpbF9fc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctZGV0YWlsX19sYWJlbFwiPkF2YW50PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHByZT57eyBsb2cucHJldlN0YXRlIHwganNvbiB9fTwvcHJlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZGV0YWlsX19zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvZy1kZXRhaWxfX2xhYmVsXCI+QXByw6hzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHByZT57eyBsb2cubmV4dFN0YXRlIHwganNvbiB9fTwvcHJlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIDwhLS0gVGFiIFN0YXRlIC0tPlxyXG4gICAgICAgICAgQGlmIChhY3RpdmVUYWIoKSA9PT0gJ3N0YXRlJykge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2dG9vbHMtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgIEBpZiAobG9ncygpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgPHByZSBjbGFzcz1cInN0YXRlLXZpZXdcIj57eyBsb2dzKClbMF0ubmV4dFN0YXRlIHwganNvbiB9fTwvcHJlPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldnRvb2xzLWVtcHR5XCI+QXVjdW4gc3RhdGUgZGlzcG9uaWJsZTwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuZGV2dG9vbHMtZmFiIHtcclxuICAgICAgcG9zaXRpb246ICAgICAgZml4ZWQ7XHJcbiAgICAgIGJvdHRvbTogICAgICAgIDEuNXJlbTtcclxuICAgICAgbGVmdDogICAgICAgICAgMS41cmVtO1xyXG4gICAgICBiYWNrZ3JvdW5kOiAgICAjMWUyOTNiO1xyXG4gICAgICBjb2xvcjogICAgICAgICB3aGl0ZTtcclxuICAgICAgYm9yZGVyOiAgICAgICAgbm9uZTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XHJcbiAgICAgIHBhZGRpbmc6ICAgICAgIDAuNXJlbSAxcmVtO1xyXG4gICAgICBmb250LXNpemU6ICAgICAwLjg1cmVtO1xyXG4gICAgICBmb250LXdlaWdodDogICA2MDA7XHJcbiAgICAgIGN1cnNvcjogICAgICAgIHBvaW50ZXI7XHJcbiAgICAgIHotaW5kZXg6ICAgICAgIDk5OTk7XHJcbiAgICAgIGJveC1zaGFkb3c6ICAgIDAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjMpO1xyXG4gICAgICB0cmFuc2l0aW9uOiAgICBiYWNrZ3JvdW5kIDAuMTVzO1xyXG4gICAgfVxyXG4gICAgLmRldnRvb2xzLWZhYjpob3ZlciB7IGJhY2tncm91bmQ6ICMzMzQxNTU7IH1cclxuXHJcbiAgICAuZGV2dG9vbHMtcGFuZWwge1xyXG4gICAgICBwb3NpdGlvbjogICAgICAgZml4ZWQ7XHJcbiAgICAgIGJhY2tncm91bmQ6ICAgICAjMGYxNzJhO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAgMTJweDtcclxuICAgICAgYm94LXNoYWRvdzogICAgIDAgOHB4IDMycHggcmdiYSgwLDAsMCwwLjQpO1xyXG4gICAgICB6LWluZGV4OiAgICAgICAgOTk5OTtcclxuICAgICAgZGlzcGxheTogICAgICAgIGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIG92ZXJmbG93OiAgICAgICBoaWRkZW47XHJcbiAgICAgIGZvbnQtZmFtaWx5OiAgICAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XHJcbiAgICAgIG1pbi13aWR0aDogICAgICAyMDBweDtcclxuICAgICAgbWluLWhlaWdodDogICAgIDQwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmRldnRvb2xzLXBhbmVsLS1taW5pbWl6ZWQge1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmRldnRvb2xzLWhlYWRlciB7XHJcbiAgICAgIGRpc3BsYXk6ICAgICAgICAgZmxleDtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBhbGlnbi1pdGVtczogICAgIGNlbnRlcjtcclxuICAgICAgcGFkZGluZzogICAgICAgICAwLjZyZW0gMC43NXJlbTtcclxuICAgICAgYmFja2dyb3VuZDogICAgICAjMWUyOTNiO1xyXG4gICAgICBib3JkZXItYm90dG9tOiAgIDFweCBzb2xpZCAjMzM0MTU1O1xyXG4gICAgICBjdXJzb3I6ICAgICAgICAgIGdyYWI7XHJcbiAgICAgIHVzZXItc2VsZWN0OiAgICAgbm9uZTtcclxuICAgIH1cclxuICAgIC5kZXZ0b29scy1oZWFkZXI6YWN0aXZlIHsgY3Vyc29yOiBncmFiYmluZzsgfVxyXG5cclxuICAgIC5kZXZ0b29scy10aXRsZSB7XHJcbiAgICAgIGNvbG9yOiAgICAgICAjZTJlOGYwO1xyXG4gICAgICBmb250LXNpemU6ICAgMC44MnJlbTtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTtcclxuICAgIH1cclxuXHJcbiAgICAuZGV2dG9vbHMtaGVhZGVyLWFjdGlvbnMgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDAuMjVyZW07IH1cclxuXHJcbiAgICAuYnRuLWljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAgICB0cmFuc3BhcmVudDtcclxuICAgICAgY29sb3I6ICAgICAgICAgIzY0NzQ4YjtcclxuICAgICAgYm9yZGVyOiAgICAgICAgbm9uZTtcclxuICAgICAgY3Vyc29yOiAgICAgICAgcG9pbnRlcjtcclxuICAgICAgZm9udC1zaXplOiAgICAgMC44cmVtO1xyXG4gICAgICBwYWRkaW5nOiAgICAgICAwLjE1cmVtIDAuMzVyZW07XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgICAgbGluZS1oZWlnaHQ6ICAgMTtcclxuICAgIH1cclxuICAgIC5idG4taWNvbjpob3ZlciB7IGJhY2tncm91bmQ6ICMzMzQxNTU7IGNvbG9yOiB3aGl0ZTsgfVxyXG5cclxuICAgIC5kZXZ0b29scy1yZXNpemUge1xyXG4gICAgICBwb3NpdGlvbjogIGFic29sdXRlO1xyXG4gICAgICBib3R0b206ICAgIDJweDtcclxuICAgICAgcmlnaHQ6ICAgICA0cHg7XHJcbiAgICAgIGNvbG9yOiAgICAgIzMzNDE1NTtcclxuICAgICAgZm9udC1zaXplOiAwLjlyZW07XHJcbiAgICAgIGN1cnNvcjogICAgbndzZS1yZXNpemU7XHJcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gICAgICBsaW5lLWhlaWdodDogMTtcclxuICAgIH1cclxuICAgIC5kZXZ0b29scy1yZXNpemU6aG92ZXIgeyBjb2xvcjogIzY0NzQ4YjsgfVxyXG5cclxuICAgIC5kZXZ0b29scy10YWJzIHtcclxuICAgICAgZGlzcGxheTogICAgICAgZmxleDtcclxuICAgICAgYmFja2dyb3VuZDogICAgIzFlMjkzYjtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzQxNTU7XHJcbiAgICB9XHJcbiAgICAudGFiIHtcclxuICAgICAgcGFkZGluZzogICAgIDAuNHJlbSAwLjc1cmVtO1xyXG4gICAgICBiYWNrZ3JvdW5kOiAgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGNvbG9yOiAgICAgICAjNjQ3NDhiO1xyXG4gICAgICBib3JkZXI6ICAgICAgbm9uZTtcclxuICAgICAgY3Vyc29yOiAgICAgIHBvaW50ZXI7XHJcbiAgICAgIGZvbnQtc2l6ZTogICAwLjc4cmVtO1xyXG4gICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpO1xyXG4gICAgfVxyXG4gICAgLnRhYjpob3ZlciAgICB7IGNvbG9yOiAjZTJlOGYwOyB9XHJcbiAgICAudGFiLS1hY3RpdmUgIHsgY29sb3I6ICMzYjgyZjY7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjM2I4MmY2OyB9XHJcblxyXG4gICAgLmRldnRvb2xzLWNvbnRlbnQge1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICBmbGV4OiAgICAgICAxO1xyXG4gICAgICBwYWRkaW5nOiAgICAwLjI1cmVtIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLmRldnRvb2xzLWVtcHR5IHtcclxuICAgICAgcGFkZGluZzogICAgIDJyZW07XHJcbiAgICAgIHRleHQtYWxpZ246ICBjZW50ZXI7XHJcbiAgICAgIGNvbG9yOiAgICAgICAjNDc1NTY5O1xyXG4gICAgICBmb250LXNpemU6ICAgMC43OHJlbTtcclxuICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTtcclxuICAgIH1cclxuXHJcbiAgICAubG9nLWl0ZW0ge1xyXG4gICAgICBkaXNwbGF5OiAgICAgICAgIGZsZXg7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgYWxpZ24taXRlbXM6ICAgICBjZW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6ICAgICAgICAgMC4zNXJlbSAwLjc1cmVtO1xyXG4gICAgICBjdXJzb3I6ICAgICAgICAgIHBvaW50ZXI7XHJcbiAgICAgIGJvcmRlci1ib3R0b206ICAgMXB4IHNvbGlkICMxZTI5M2I7XHJcbiAgICB9XHJcbiAgICAubG9nLWl0ZW06aG92ZXIgICAgICAgIHsgYmFja2dyb3VuZDogIzFlMjkzYjsgfVxyXG4gICAgLmxvZy1pdGVtLS1lcnJvciAgICAgICB7IGJhY2tncm91bmQ6ICMxYTBhMGE7IH1cclxuXHJcbiAgICAubG9nLWl0ZW1fX2xlZnQgIHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAwLjRyZW07IG92ZXJmbG93OiBoaWRkZW47IH1cclxuICAgIC5sb2ctaXRlbV9fcmlnaHQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDAuNHJlbTsgZmxleC1zaHJpbms6IDA7IH1cclxuXHJcbiAgICAubG9nLXN0YXR1cyAgeyBmb250LXNpemU6IDAuNzJyZW07IGNvbG9yOiAjMjJjNTVlOyBmbGV4LXNocmluazogMDsgfVxyXG4gICAgLmxvZy1pdGVtLS1lcnJvciAubG9nLXN0YXR1cyB7IGNvbG9yOiAjZWY0NDQ0OyB9XHJcbiAgICAubG9nLW5hbWUgICAgeyBjb2xvcjogI2UyZThmMDsgZm9udC1zaXplOiAwLjc1cmVtOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgfVxyXG4gICAgLmxvZy1kdXJhdGlvbiB7IGNvbG9yOiAjNjQ3NDhiOyBmb250LXNpemU6IDAuN3JlbTsgfVxyXG4gICAgLmxvZy10aW1lICAgIHsgY29sb3I6ICM0NzU1Njk7IGZvbnQtc2l6ZTogMC42OHJlbTsgfVxyXG5cclxuICAgIC5sb2ctZXJyb3ItYmFkZ2Uge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAgICAjN2YxZDFkO1xyXG4gICAgICBjb2xvcjogICAgICAgICAjZmNhNWE1O1xyXG4gICAgICBmb250LXNpemU6ICAgICAwLjY4cmVtO1xyXG4gICAgICBwYWRkaW5nOiAgICAgICAwLjFyZW0gMC4zNXJlbTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5sb2ctZGV0YWlsIHtcclxuICAgICAgYmFja2dyb3VuZDogICAgIzBhMGYxYTtcclxuICAgICAgcGFkZGluZzogICAgICAgMC42cmVtIDAuNzVyZW07XHJcbiAgICAgIGJvcmRlci1sZWZ0OiAgIDNweCBzb2xpZCAjM2I4MmY2O1xyXG4gICAgICBtYXJnaW46ICAgICAgICAwIDAuNHJlbSAwLjRyZW07XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgNHB4IDRweCAwO1xyXG4gICAgfVxyXG4gICAgLmxvZy1kZXRhaWxfX2Vycm9yICAgeyBjb2xvcjogI2ZjYTVhNTsgZm9udC1zaXplOiAwLjcycmVtOyBtYXJnaW4tYm90dG9tOiAwLjRyZW07IH1cclxuICAgIC5sb2ctZGV0YWlsX19zZWN0aW9uIHsgbWFyZ2luLWJvdHRvbTogMC40cmVtOyB9XHJcbiAgICAubG9nLWRldGFpbF9fbGFiZWwgICB7XHJcbiAgICAgIGNvbG9yOiAgICAgICAgICM2NDc0OGI7XHJcbiAgICAgIGZvbnQtc2l6ZTogICAgIDAuNjhyZW07XHJcbiAgICAgIGRpc3BsYXk6ICAgICAgIGJsb2NrO1xyXG4gICAgICBtYXJnaW4tYm90dG9tOiAwLjJyZW07XHJcbiAgICAgIGZvbnQtZmFtaWx5OiAgIHN5c3RlbS11aTtcclxuICAgIH1cclxuICAgIHByZSB7XHJcbiAgICAgIGNvbG9yOiAgICAgICAjODZlZmFjO1xyXG4gICAgICBmb250LXNpemU6ICAgMC43cmVtO1xyXG4gICAgICBtYXJnaW46ICAgICAgMDtcclxuICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xyXG4gICAgICB3b3JkLWJyZWFrOiAgYnJlYWstYWxsO1xyXG4gICAgICBtYXgtaGVpZ2h0OiAgMTQwcHg7XHJcbiAgICAgIG92ZXJmbG93LXk6ICBhdXRvO1xyXG4gICAgfVxyXG4gICAgLnN0YXRlLXZpZXcge1xyXG4gICAgICBjb2xvcjogICAgICAgIzg2ZWZhYztcclxuICAgICAgZm9udC1zaXplOiAgIDAuN3JlbTtcclxuICAgICAgcGFkZGluZzogICAgIDAuNzVyZW07XHJcbiAgICAgIG1hcmdpbjogICAgICAwO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XHJcbiAgICAgIHdvcmQtYnJlYWs6ICBicmVhay1hbGw7XHJcbiAgICB9XHJcbiAgYF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFN0YXRvRGV2VG9vbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgY29uZmlnICA9IGluamVjdChTVEFUT19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSlcclxuICBwcml2YXRlIHVuc3ViPzogKCkgPT4gdm9pZFxyXG5cclxuICAvLyBTdGF0ZSBVSVxyXG4gIGlzT3BlbiAgICAgID0gc2lnbmFsKGZhbHNlKVxyXG4gIGlzTWluaW1pemVkID0gc2lnbmFsKGZhbHNlKVxyXG4gIGFjdGl2ZVRhYiAgID0gc2lnbmFsPCdhY3Rpb25zJyB8ICdzdGF0ZSc+KCdhY3Rpb25zJylcclxuICBsb2dzICAgICAgICA9IHNpZ25hbDxBY3Rpb25Mb2dbXT4oW10pXHJcbiAgc2VsZWN0ZWRMb2cgPSBzaWduYWw8QWN0aW9uTG9nIHwgbnVsbD4obnVsbClcclxuXHJcbiAgLy8gUG9zaXRpb24gZXQgdGFpbGxlXHJcbiAgcG9zWCAgICAgICAgPSBzaWduYWwoMjQpXHJcbiAgcG9zWSAgICAgICAgPSBzaWduYWwod2luZG93LmlubmVySGVpZ2h0IC0gNTAwKVxyXG4gIHBhbmVsV2lkdGggID0gc2lnbmFsKDQyMClcclxuICBwYW5lbEhlaWdodCA9IHNpZ25hbCg0NjApXHJcblxyXG4gIC8vIERyYWcgc3RhdGVcclxuICBwcml2YXRlIGlzRHJhZ2dpbmcgID0gZmFsc2VcclxuICBwcml2YXRlIGlzUmVzaXppbmcgID0gZmFsc2VcclxuICBwcml2YXRlIGRyYWdPZmZzZXRYID0gMFxyXG4gIHByaXZhdGUgZHJhZ09mZnNldFkgPSAwXHJcbiAgcHJpdmF0ZSBzdGFydFcgICAgICA9IDBcclxuICBwcml2YXRlIHN0YXJ0SCAgICAgID0gMFxyXG4gIHByaXZhdGUgc3RhcnRYICAgICAgPSAwXHJcbiAgcHJpdmF0ZSBzdGFydFkgICAgICA9IDBcclxuXHJcbiAgLy8gQm91bmQgbGlzdGVuZXJzXHJcbiAgcHJpdmF0ZSBib3VuZE1vdXNlTW92ZSA9IHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKVxyXG4gIHByaXZhdGUgYm91bmRNb3VzZVVwICAgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpXHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51bnN1YiA9IGRldlRvb2xzLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcclxuICAgICAgdGhpcy5sb2dzLnNldChzdGF0ZS5sb2dzKVxyXG4gICAgICB0aGlzLmlzT3Blbi5zZXQoc3RhdGUuaXNPcGVuKVxyXG4gICAgfSlcclxuXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKVxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICAgdGhpcy5ib3VuZE1vdXNlVXApXHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMudW5zdWI/LigpXHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmJvdW5kTW91c2VNb3ZlKVxyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICAgdGhpcy5ib3VuZE1vdXNlVXApXHJcbiAgfVxyXG5cclxuICAvLyDilIDilIAgVG9nZ2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4gIHRvZ2dsZSgpICAgICAgICAgeyBkZXZUb29scy50b2dnbGUoKSB9XHJcbiAgdG9nZ2xlTWluaW1pemUoKSB7IHRoaXMuaXNNaW5pbWl6ZWQudXBkYXRlKHYgPT4gIXYpIH1cclxuICBjbGVhcigpICAgICAgICAgIHsgZGV2VG9vbHMuY2xlYXIoKTsgdGhpcy5zZWxlY3RlZExvZy5zZXQobnVsbCkgfVxyXG4gIHNlbGVjdExvZyhsb2c6IEFjdGlvbkxvZykge1xyXG4gICAgdGhpcy5zZWxlY3RlZExvZy5zZXQodGhpcy5zZWxlY3RlZExvZygpPy5pZCA9PT0gbG9nLmlkID8gbnVsbCA6IGxvZylcclxuICB9XHJcbiAgZm9ybWF0VGltZShpc286IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoaXNvKS50b1RpbWVTdHJpbmcoKS5zbGljZSgwLCA4KVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIERyYWcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgb25EcmFnU3RhcnQoZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdidG4taWNvbicpKSByZXR1cm5cclxuICAgIHRoaXMuaXNEcmFnZ2luZyAgPSB0cnVlXHJcbiAgICB0aGlzLmRyYWdPZmZzZXRYID0gZS5jbGllbnRYIC0gdGhpcy5wb3NYKClcclxuICAgIHRoaXMuZHJhZ09mZnNldFkgPSBlLmNsaWVudFkgLSB0aGlzLnBvc1koKVxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgfVxyXG5cclxuICAvLyDilIDilIAgUmVzaXplIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4gIG9uUmVzaXplU3RhcnQoZTogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZVxyXG4gICAgdGhpcy5zdGFydFcgICAgID0gdGhpcy5wYW5lbFdpZHRoKClcclxuICAgIHRoaXMuc3RhcnRIICAgICA9IHRoaXMucGFuZWxIZWlnaHQoKVxyXG4gICAgdGhpcy5zdGFydFggICAgID0gZS5jbGllbnRYXHJcbiAgICB0aGlzLnN0YXJ0WSAgICAgPSBlLmNsaWVudFlcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSAIE1vdXNlIE1vdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgb25Nb3VzZU1vdmUoZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xyXG4gICAgICB0aGlzLnBvc1guc2V0KE1hdGgubWF4KDAsIGUuY2xpZW50WCAtIHRoaXMuZHJhZ09mZnNldFgpKVxyXG4gICAgICB0aGlzLnBvc1kuc2V0KE1hdGgubWF4KDAsIGUuY2xpZW50WSAtIHRoaXMuZHJhZ09mZnNldFkpKVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNSZXNpemluZykge1xyXG4gICAgICBjb25zdCBuZXdXID0gTWF0aC5tYXgoMzAwLCB0aGlzLnN0YXJ0VyArIGUuY2xpZW50WCAtIHRoaXMuc3RhcnRYKVxyXG4gICAgICBjb25zdCBuZXdIID0gTWF0aC5tYXgoMjAwLCB0aGlzLnN0YXJ0SCArIGUuY2xpZW50WSAtIHRoaXMuc3RhcnRZKVxyXG4gICAgICB0aGlzLnBhbmVsV2lkdGguc2V0KG5ld1cpXHJcbiAgICAgIHRoaXMucGFuZWxIZWlnaHQuc2V0KG5ld0gpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIAgTW91c2UgVXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgb25Nb3VzZVVwKCkge1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2VcclxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlXHJcbiAgfVxyXG59Il19
|
|
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=
|