@firestitch/report 18.3.0 → 18.3.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/app/reports/data/report.data.d.ts +1 -0
- package/app/reports/interfaces/report.interface.d.ts +3 -4
- package/app/reports/views/reports/fs-ai-reports.component.d.ts +5 -3
- package/esm2022/app/reports/data/report.data.mjs +14 -4
- package/esm2022/app/reports/interfaces/report.interface.mjs +5 -9
- package/esm2022/app/reports/views/reports/fs-ai-reports.component.mjs +186 -79
- package/fesm2022/{firestitch-report-echarts-dBElcPnl.mjs → firestitch-report-echarts-D4xJt3zs.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-dBElcPnl.mjs.map → firestitch-report-echarts-D4xJt3zs.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-DhxGcHlU.mjs → firestitch-report-firestitch-report-DY8HwvAU.mjs} +208 -97
- package/fesm2022/firestitch-report-firestitch-report-DY8HwvAU.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-DhxGcHlU.mjs.map +0 -1
|
@@ -3,6 +3,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
|
3
3
|
import { ActivatedRoute, Router, RouterLink } from '@angular/router';
|
|
4
4
|
import { MatDialog } from '@angular/material/dialog';
|
|
5
5
|
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import { FsChipModule } from '@firestitch/chip';
|
|
6
7
|
import { FsFilterModule, ItemType } from '@firestitch/filter';
|
|
7
8
|
import { FsMessage } from '@firestitch/message';
|
|
8
9
|
import { FsPrompt } from '@firestitch/prompt';
|
|
@@ -11,12 +12,13 @@ import { FsTreeComponent, FsTreeModule, TreeActionType, TreeDragMode, } from '@f
|
|
|
11
12
|
import { switchMap } from 'rxjs';
|
|
12
13
|
import { ReportData } from '../../data/report.data';
|
|
13
14
|
import { GlobalSettingsComponent } from '../../dialogs/global-settings/global-settings.component';
|
|
14
|
-
import { ReportNodeType, ReportState,
|
|
15
|
+
import { ReportNodeType, ReportState, } from '../../interfaces/report.interface';
|
|
15
16
|
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@firestitch/
|
|
17
|
-
import * as i2 from "@firestitch/
|
|
18
|
-
import * as i3 from "@firestitch/
|
|
19
|
-
import * as i4 from "@
|
|
17
|
+
import * as i1 from "@firestitch/chip";
|
|
18
|
+
import * as i2 from "@firestitch/filter";
|
|
19
|
+
import * as i3 from "@firestitch/skeleton";
|
|
20
|
+
import * as i4 from "@firestitch/tree";
|
|
21
|
+
import * as i5 from "@angular/material/icon";
|
|
20
22
|
// The reports listing — an fs-tree of folders and the reports filed into them.
|
|
21
23
|
// Rows link out through a URL pattern (a ':id' token → the report id; a leading
|
|
22
24
|
// '/' makes it absolute, otherwise it's relative to this component's route).
|
|
@@ -30,17 +32,17 @@ import * as i4 from "@angular/material/icon";
|
|
|
30
32
|
// report in no folder is a root node, which is where every report sat before
|
|
31
33
|
// folders existed, so nothing had to be migrated or bucketed as "uncategorized".
|
|
32
34
|
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
35
|
+
// Folders and reports are both soft-deletable, and a folder deletes whatever it
|
|
36
|
+
// holds. Only the folder's own row is written: everything under it drops out of
|
|
37
|
+
// the listing because it sits under a deleted folder, and comes back with it.
|
|
38
|
+
// "Show Deleted" shows the WHOLE tree — live and deleted together, each deleted
|
|
39
|
+
// row where it was filed — and on anything deleted the kebab offers Restore
|
|
40
|
+
// instead. Restoring also restores any deleted folder above the row, so it lands
|
|
41
|
+
// back where it was rather than at the root.
|
|
42
|
+
//
|
|
43
|
+
// Every folder starts collapsed; the tree remembers what was opened across its
|
|
44
|
+
// own reloads (a rename, a move, the Show Deleted toggle) and across a search.
|
|
40
45
|
export class FsAiReportsComponent {
|
|
41
|
-
// How deep the tree opens on load. Folders are audience buckets, not a
|
|
42
|
-
// filesystem, so there is nothing worth hiding behind a closed chevron.
|
|
43
|
-
static EXPAND_LEVEL = 10;
|
|
44
46
|
// API base for the reports endpoints; override to mount elsewhere.
|
|
45
47
|
basePath = input('reports');
|
|
46
48
|
// Where a row links to; ':id' is replaced with the report id. Default takes
|
|
@@ -64,6 +66,10 @@ export class FsAiReportsComponent {
|
|
|
64
66
|
_destroyRef = inject(DestroyRef);
|
|
65
67
|
// The filter bar's current query — carries `state` when Show Deleted is on.
|
|
66
68
|
_query = {};
|
|
69
|
+
// The folders that were open when a search started; null while no search is
|
|
70
|
+
// running. The search opens every match's path over the top of them, and
|
|
71
|
+
// clearing it puts these back.
|
|
72
|
+
_expandedBeforeSearch = null;
|
|
67
73
|
constructor() {
|
|
68
74
|
effect(() => {
|
|
69
75
|
this._reportData.basePath = this.basePath();
|
|
@@ -81,20 +87,16 @@ export class FsAiReportsComponent {
|
|
|
81
87
|
openLink(report) {
|
|
82
88
|
return this._patternCommands(this.openPattern(), report.id);
|
|
83
89
|
}
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
return report?.state === ReportState.Deleted;
|
|
88
|
-
}
|
|
89
|
-
// Prompt for a title, create the report, then route to it (createPattern).
|
|
90
|
-
createReport() {
|
|
90
|
+
// Prompt for a title, create the report — filed under reportFolderId when a
|
|
91
|
+
// folder's kebab asked, at the root otherwise — then route to it (createPattern).
|
|
92
|
+
createReport(reportFolderId = null) {
|
|
91
93
|
this._prompt.input({
|
|
92
94
|
title: 'Create Report',
|
|
93
95
|
label: 'Title',
|
|
94
96
|
commitLabel: 'Create',
|
|
95
97
|
required: true,
|
|
96
98
|
})
|
|
97
|
-
.pipe(switchMap((name) => this._reportData.create(name)), takeUntilDestroyed(this._destroyRef))
|
|
99
|
+
.pipe(switchMap((name) => this._reportData.create(name, reportFolderId)), takeUntilDestroyed(this._destroyRef))
|
|
98
100
|
.subscribe((report) => {
|
|
99
101
|
const pattern = this.createPattern();
|
|
100
102
|
this._router.navigate(this._patternCommands(pattern, report.id), pattern.startsWith('/') ? {} : { relativeTo: this._route });
|
|
@@ -119,13 +121,16 @@ export class FsAiReportsComponent {
|
|
|
119
121
|
type: ItemType.Keyword,
|
|
120
122
|
label: 'Search',
|
|
121
123
|
},
|
|
124
|
+
// A checkbox rather than the usual Status select with a "Show Deleted"
|
|
125
|
+
// isolate. Isolating the deleted rows would strand them: a deleted
|
|
126
|
+
// report in a live folder arrives without the folder it sits in, and a
|
|
127
|
+
// tree cannot place a node whose parent it never received. So the
|
|
128
|
+
// toggle asks for everything, and the rows mark what is deleted.
|
|
122
129
|
{
|
|
123
130
|
name: 'state',
|
|
124
|
-
type: ItemType.
|
|
125
|
-
label: '
|
|
126
|
-
|
|
127
|
-
values: () => ReportStates,
|
|
128
|
-
isolate: { label: 'Show Deleted', value: ReportState.Deleted },
|
|
131
|
+
type: ItemType.Checkbox,
|
|
132
|
+
label: 'Show Deleted',
|
|
133
|
+
checked: [ReportState.Active, ReportState.Deleted].join(','),
|
|
129
134
|
},
|
|
130
135
|
],
|
|
131
136
|
actions: [
|
|
@@ -158,15 +163,19 @@ export class FsAiReportsComponent {
|
|
|
158
163
|
click: () => this.createReport(),
|
|
159
164
|
},
|
|
160
165
|
],
|
|
161
|
-
// The two items are answered in different places and
|
|
162
|
-
// The keyword drives the tree's own search, which is the whole
|
|
163
|
-
// searching a tree — it reveals a match nested inside collapsed
|
|
164
|
-
// rather than only filtering what is already on screen. `state` is
|
|
165
|
-
// Show Deleted toggle, and only the server can answer that.
|
|
166
|
+
// The two items are answered in different places, and each only when it
|
|
167
|
+
// changed. The keyword drives the tree's own search, which is the whole
|
|
168
|
+
// point of searching a tree — it reveals a match nested inside collapsed
|
|
169
|
+
// folders rather than only filtering what is already on screen. `state` is
|
|
170
|
+
// the Show Deleted toggle, and only the server can answer that. Running the
|
|
171
|
+
// search on a toggle would clear it, and clearing collapses the tree.
|
|
166
172
|
change: (query) => {
|
|
173
|
+
const keywordChanged = String(query?.keyword ?? '') !== String(this._query.keyword ?? '');
|
|
167
174
|
const stateChanged = String(query?.state ?? '') !== String(this._query.state ?? '');
|
|
168
175
|
this._query = { ...query };
|
|
169
|
-
|
|
176
|
+
if (keywordChanged) {
|
|
177
|
+
this._search(query?.keyword);
|
|
178
|
+
}
|
|
170
179
|
if (stateChanged) {
|
|
171
180
|
this._load();
|
|
172
181
|
}
|
|
@@ -174,22 +183,26 @@ export class FsAiReportsComponent {
|
|
|
174
183
|
};
|
|
175
184
|
}
|
|
176
185
|
_initTreeConfig() {
|
|
186
|
+
// No expandLevel: every folder starts collapsed.
|
|
177
187
|
this.treeConfig = {
|
|
178
188
|
data: [],
|
|
179
189
|
childrenName: 'children',
|
|
180
|
-
expandLevel: FsAiReportsComponent.EXPAND_LEVEL,
|
|
181
190
|
draggable: true,
|
|
182
191
|
// The whole row is the grip and the handle stays hidden; a press only
|
|
183
192
|
// becomes a drag once the pointer moves, so the kebab, the chevron and the
|
|
184
193
|
// report link all stay clickable.
|
|
185
194
|
dragMode: TreeDragMode.Node,
|
|
195
|
+
// Anything deleted is restored before it is moved — the backend refuses
|
|
196
|
+
// to edit a deleted row, and a drag would only snap back.
|
|
197
|
+
canDrag: (node) => !this._isDeletedNode(node),
|
|
186
198
|
// canDrop is asked about the node being DRAGGED, so only `toParent`
|
|
187
199
|
// describes the destination — reading node.level/node.parent here would
|
|
188
200
|
// describe where it came from. A report can never be a parent because its
|
|
189
201
|
// type says so, and that single test is the whole "folders nest, reports
|
|
190
|
-
// are leaves" rule on this side.
|
|
202
|
+
// are leaves" rule on this side. A deleted folder is no destination
|
|
203
|
+
// either: whatever landed in it would vanish from the live listing.
|
|
191
204
|
canDrop: (node, fromParent, toParent) => {
|
|
192
|
-
return !toParent || toParent
|
|
205
|
+
return !toParent || (this._isFolderNode(toParent) && !this._isDeletedNode(toParent));
|
|
193
206
|
},
|
|
194
207
|
changeReorder: (event) => this._move(event),
|
|
195
208
|
nodeClass: (node) => node.data?.type,
|
|
@@ -212,8 +225,13 @@ export class FsAiReportsComponent {
|
|
|
212
225
|
click: (node) => this._rename(node),
|
|
213
226
|
},
|
|
214
227
|
{
|
|
215
|
-
label: 'New
|
|
216
|
-
show: (node) => this._isFolderNode(node),
|
|
228
|
+
label: 'New report',
|
|
229
|
+
show: (node) => this._isFolderNode(node) && !this._isDeletedNode(node),
|
|
230
|
+
click: (node) => this.createReport(node.data?.id),
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
label: 'New folder',
|
|
234
|
+
show: (node) => this._isFolderNode(node) && !this._isDeletedNode(node),
|
|
217
235
|
click: (node) => this._createFolder(node.data?.id),
|
|
218
236
|
},
|
|
219
237
|
{
|
|
@@ -221,8 +239,8 @@ export class FsAiReportsComponent {
|
|
|
221
239
|
show: (node) => !this._isDeletedNode(node),
|
|
222
240
|
click: (node) => this._delete(node),
|
|
223
241
|
},
|
|
224
|
-
//
|
|
225
|
-
//
|
|
242
|
+
// On every deleted row, including a live one that is only hidden by
|
|
243
|
+
// a deleted folder above it — restoring that brings the folder back.
|
|
226
244
|
{
|
|
227
245
|
label: 'Restore',
|
|
228
246
|
show: (node) => this._isDeletedNode(node),
|
|
@@ -237,66 +255,128 @@ export class FsAiReportsComponent {
|
|
|
237
255
|
return node?.data?.type === ReportNodeType.Folder;
|
|
238
256
|
}
|
|
239
257
|
_isDeletedNode(node) {
|
|
240
|
-
return
|
|
258
|
+
return !!node?.data?.deleted;
|
|
241
259
|
}
|
|
242
260
|
// Drive the tree's built-in search: it collapses everything, hides every node,
|
|
243
261
|
// then unhides each match and walks its ancestors open, so a report several
|
|
244
|
-
// folders deep surfaces with its path expanded. Clearing
|
|
245
|
-
//
|
|
246
|
-
// left fully collapsed the moment somebody empties the search box.
|
|
262
|
+
// folders deep surfaces with its path expanded. Clearing collapses everything
|
|
263
|
+
// again, so the folders that were open before the search are put back.
|
|
247
264
|
_search(keyword) {
|
|
248
265
|
const tree = this._tree();
|
|
249
266
|
if (!tree) {
|
|
250
267
|
return;
|
|
251
268
|
}
|
|
252
269
|
if (keyword) {
|
|
270
|
+
this._expandedBeforeSearch ??= this._expandedKeys();
|
|
253
271
|
tree.search(keyword);
|
|
254
272
|
return;
|
|
255
273
|
}
|
|
256
274
|
tree.clearSearch();
|
|
257
|
-
|
|
275
|
+
this._expandKeys(this._expandedBeforeSearch ?? []);
|
|
276
|
+
this._expandedBeforeSearch = null;
|
|
258
277
|
}
|
|
259
278
|
_load() {
|
|
260
|
-
|
|
279
|
+
// Only the Show Deleted toggle is the server's to answer — the keyword is
|
|
280
|
+
// the tree's own search — and an unchecked toggle sends nothing, leaving the
|
|
281
|
+
// backend's active-only default in charge.
|
|
282
|
+
const query = this._query.state ? { state: this._query.state } : {};
|
|
283
|
+
this._reportData.tree(query)
|
|
261
284
|
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
262
|
-
.subscribe((
|
|
263
|
-
const nodes = this._buildNodes(
|
|
285
|
+
.subscribe((reportTree) => {
|
|
286
|
+
const nodes = this._buildNodes(reportTree);
|
|
264
287
|
this.nodes.set(nodes);
|
|
265
288
|
// The tree reads `config` once, in its own ngOnInit. The first load
|
|
266
289
|
// lands before it exists, so the data has to arrive through the config;
|
|
267
290
|
// every later one has to go through the instance or nothing changes.
|
|
268
291
|
this.treeConfig = { ...this.treeConfig, data: nodes };
|
|
269
|
-
this._tree()
|
|
292
|
+
const tree = this._tree();
|
|
293
|
+
if (!tree) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
// setData() rebuilds every node collapsed, so a rename or a move would
|
|
297
|
+
// otherwise slam shut every folder somebody had opened. Keys are stable
|
|
298
|
+
// across loads ('f:12'), so what was open is reopened by key — and a
|
|
299
|
+
// folder that no longer comes back simply is not.
|
|
300
|
+
const expandedKeys = this._expandedKeys();
|
|
301
|
+
tree.setData(nodes);
|
|
302
|
+
this._expandKeys(expandedKeys);
|
|
303
|
+
const keyword = String(this._query.keyword ?? '');
|
|
304
|
+
if (keyword) {
|
|
305
|
+
tree.search(keyword);
|
|
306
|
+
}
|
|
270
307
|
});
|
|
271
308
|
}
|
|
309
|
+
// The keys of every open folder, walked through the tree's public node API.
|
|
310
|
+
_expandedKeys() {
|
|
311
|
+
const tree = this._tree();
|
|
312
|
+
if (!tree) {
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
const walk = (parent) => tree.getNodes(parent)
|
|
316
|
+
.filter((node) => node.isExpanded())
|
|
317
|
+
.flatMap((node) => [node.data?.key, ...walk(node)]);
|
|
318
|
+
return walk(null);
|
|
319
|
+
}
|
|
320
|
+
_expandKeys(keys) {
|
|
321
|
+
const tree = this._tree();
|
|
322
|
+
if (!tree || !keys.length) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const open = new Set(keys);
|
|
326
|
+
const walk = (parent) => {
|
|
327
|
+
tree.getNodes(parent)
|
|
328
|
+
.filter((node) => open.has(node.data?.key))
|
|
329
|
+
.forEach((node) => {
|
|
330
|
+
node.expand();
|
|
331
|
+
walk(node);
|
|
332
|
+
});
|
|
333
|
+
};
|
|
334
|
+
walk(null);
|
|
335
|
+
}
|
|
272
336
|
// Flat API rows → the nested shape fs-tree renders. Folders come before
|
|
273
337
|
// reports at every level, each already name-ordered by the backend.
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
338
|
+
//
|
|
339
|
+
// `deleted` is inherited downward: a deleted folder hides everything below it
|
|
340
|
+
// without the rows below being deleted themselves, and that is only visible
|
|
341
|
+
// from here, where the parent is in hand. The backend applies the same rule
|
|
342
|
+
// when it filters (ReportFolderModel::getDeletedFolderIds()).
|
|
343
|
+
_buildNodes(reportTree) {
|
|
344
|
+
const folders = reportTree?.folders ?? [];
|
|
345
|
+
const reports = reportTree?.reports ?? [];
|
|
346
|
+
const build = (parentId, parentDeleted) => {
|
|
278
347
|
const folderNodes = folders
|
|
279
348
|
.filter((folder) => (folder.parentReportFolderId ?? null) === parentId)
|
|
280
|
-
.map((folder) =>
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
349
|
+
.map((folder) => {
|
|
350
|
+
const stateDeleted = folder.state === ReportState.Deleted;
|
|
351
|
+
const deleted = parentDeleted || stateDeleted;
|
|
352
|
+
return {
|
|
353
|
+
key: `f:${folder.id}`,
|
|
354
|
+
id: folder.id,
|
|
355
|
+
name: folder.name,
|
|
356
|
+
type: ReportNodeType.Folder,
|
|
357
|
+
children: build(folder.id, deleted),
|
|
358
|
+
stateDeleted,
|
|
359
|
+
deleted,
|
|
360
|
+
};
|
|
361
|
+
});
|
|
287
362
|
const reportNodes = reports
|
|
288
363
|
.filter((report) => (report.reportFolderId ?? null) === parentId)
|
|
289
|
-
.map((report) =>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
364
|
+
.map((report) => {
|
|
365
|
+
const stateDeleted = report.state === ReportState.Deleted;
|
|
366
|
+
return {
|
|
367
|
+
key: `r:${report.id}`,
|
|
368
|
+
id: report.id,
|
|
369
|
+
name: report.name,
|
|
370
|
+
type: ReportNodeType.Report,
|
|
371
|
+
children: [],
|
|
372
|
+
report,
|
|
373
|
+
stateDeleted,
|
|
374
|
+
deleted: parentDeleted || stateDeleted,
|
|
375
|
+
};
|
|
376
|
+
});
|
|
297
377
|
return [...folderNodes, ...reportNodes];
|
|
298
378
|
};
|
|
299
|
-
return build(null);
|
|
379
|
+
return build(null, false);
|
|
300
380
|
}
|
|
301
381
|
// A drop moved a node under a new parent, or out to the root. The tree has
|
|
302
382
|
// already moved it on screen, so both outcomes reload: a success to pick up
|
|
@@ -357,9 +437,9 @@ export class FsAiReportsComponent {
|
|
|
357
437
|
this._load();
|
|
358
438
|
});
|
|
359
439
|
}
|
|
360
|
-
//
|
|
361
|
-
//
|
|
362
|
-
//
|
|
440
|
+
// A folder deletes with everything in it, so the confirm says what that is —
|
|
441
|
+
// and that it all comes back from Show Deleted, which is what makes it safe to
|
|
442
|
+
// offer.
|
|
363
443
|
_delete(node) {
|
|
364
444
|
const data = node?.data;
|
|
365
445
|
if (!data) {
|
|
@@ -369,7 +449,7 @@ export class FsAiReportsComponent {
|
|
|
369
449
|
this._prompt.confirm({
|
|
370
450
|
title: 'Confirm',
|
|
371
451
|
template: folder
|
|
372
|
-
?
|
|
452
|
+
? this._deleteFolderMessage(data)
|
|
373
453
|
: 'Are you sure you would like to delete this report?',
|
|
374
454
|
})
|
|
375
455
|
.pipe(switchMap(() => (folder
|
|
@@ -380,15 +460,41 @@ export class FsAiReportsComponent {
|
|
|
380
460
|
this._load();
|
|
381
461
|
});
|
|
382
462
|
}
|
|
463
|
+
// Counted from the node already on screen, live rows only: in Show Deleted
|
|
464
|
+
// mode the folder can also hold rows that are gone already, and those are not
|
|
465
|
+
// leaving with it.
|
|
466
|
+
_deleteFolderMessage(folder) {
|
|
467
|
+
const count = (node) => node.children
|
|
468
|
+
.filter((child) => !child.deleted)
|
|
469
|
+
.reduce((total, child) => {
|
|
470
|
+
const below = count(child);
|
|
471
|
+
return {
|
|
472
|
+
folders: total.folders + below.folders + (child.type === ReportNodeType.Folder ? 1 : 0),
|
|
473
|
+
reports: total.reports + below.reports + (child.type === ReportNodeType.Report ? 1 : 0),
|
|
474
|
+
};
|
|
475
|
+
}, { folders: 0, reports: 0 });
|
|
476
|
+
const { folders, reports } = count(folder);
|
|
477
|
+
const contents = [
|
|
478
|
+
folders ? `${folders} ${folders === 1 ? 'folder' : 'folders'}` : '',
|
|
479
|
+
reports ? `${reports} ${reports === 1 ? 'report' : 'reports'}` : '',
|
|
480
|
+
].filter(Boolean);
|
|
481
|
+
const inside = contents.length ? ` and the ${contents.join(' and ')} inside it` : '';
|
|
482
|
+
return `Are you sure you would like to delete the folder "${folder.name}"${inside}? It can be restored from Show Deleted.`;
|
|
483
|
+
}
|
|
484
|
+
// Both endpoints also restore any deleted folder above the row, so a row that
|
|
485
|
+
// is live itself but hidden by a deleted folder is restored by the same call.
|
|
383
486
|
_restore(node) {
|
|
384
487
|
const data = node?.data;
|
|
385
488
|
if (!data) {
|
|
386
489
|
return;
|
|
387
490
|
}
|
|
388
|
-
|
|
491
|
+
const folder = data.type === ReportNodeType.Folder;
|
|
492
|
+
(folder
|
|
493
|
+
? this._reportData.undeleteFolder(data.id)
|
|
494
|
+
: this._reportData.undelete(data.id))
|
|
389
495
|
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
390
496
|
.subscribe(() => {
|
|
391
|
-
this._message.success('Restored report');
|
|
497
|
+
this._message.success(folder ? 'Restored folder' : 'Restored report');
|
|
392
498
|
this._load();
|
|
393
499
|
});
|
|
394
500
|
}
|
|
@@ -408,16 +514,17 @@ export class FsAiReportsComponent {
|
|
|
408
514
|
return segments;
|
|
409
515
|
}
|
|
410
516
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
411
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportsComponent, isStandalone: true, selector: "fs-ai-reports", inputs: { basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, openPattern: { classPropertyName: "openPattern", publicName: "openPattern", isSignal: true, isRequired: false, transformFunction: null }, createPattern: { classPropertyName: "createPattern", publicName: "createPattern", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_tree", first: true, predicate: FsTreeComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div
|
|
517
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FsAiReportsComponent, isStandalone: true, selector: "fs-ai-reports", inputs: { basePath: { classPropertyName: "basePath", publicName: "basePath", isSignal: true, isRequired: false, transformFunction: null }, openPattern: { classPropertyName: "openPattern", publicName: "openPattern", isSignal: true, isRequired: false, transformFunction: null }, createPattern: { classPropertyName: "createPattern", publicName: "createPattern", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_tree", first: true, predicate: FsTreeComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div\n class=\"fs-row.gap-sm.align-center node-row\"\n [class.deleted]=\"data.deleted\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder || data.deleted) {\n <!-- A deleted report can't be opened (the backend only assembles\n live ones, and one under a deleted folder is not on the live\n listing), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n\n <!-- Only on the row somebody deleted. Everything under a deleted\n folder is muted with it, but was not deleted itself. -->\n @if (data.stateDeleted) {\n <fs-chip size=\"tiny\">Deleted</fs-chip>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-row.deleted{opacity:.55}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FsChipModule }, { kind: "component", type: i1.FsChipComponent, selector: "fs-chip", inputs: ["selectable", "removable", "value", "maxWidth", "width", "backgroundColor", "borderColor", "color", "shape", "outlined", "outlineDash", "icon", "image", "selected", "disabled", "padding", "contrastColor", "size"], outputs: ["selectedToggled", "removed", "click"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i3.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { kind: "ngmodule", type: FsTreeModule }, { kind: "component", type: i4.FsTreeComponent, selector: "fs-tree", inputs: ["config"] }, { kind: "directive", type: i4.FsTreeNodeDirective, selector: "[fsTreeNode]", inputs: ["class"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
412
518
|
}
|
|
413
519
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportsComponent, decorators: [{
|
|
414
520
|
type: Component,
|
|
415
521
|
args: [{ selector: 'fs-ai-reports', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
522
|
+
FsChipModule,
|
|
416
523
|
FsFilterModule,
|
|
417
524
|
FsSkeletonModule,
|
|
418
525
|
FsTreeModule,
|
|
419
526
|
MatIconModule,
|
|
420
527
|
RouterLink,
|
|
421
|
-
], template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div
|
|
528
|
+
], template: "<fs-filter [config]=\"filterConfig\"></fs-filter>\n\n<ng-container *fsSkeleton=\"nodes()\">\n <fs-tree [config]=\"treeConfig\">\n <ng-template\n fsTreeNode\n let-data=\"data\">\n <div\n class=\"fs-row.gap-sm.align-center node-row\"\n [class.deleted]=\"data.deleted\">\n <mat-icon class=\"node-icon\">\n {{ data.type === nodeType.Folder ? 'folder' : 'insert_chart_outlined' }}\n </mat-icon>\n\n @if (data.type === nodeType.Folder || data.deleted) {\n <!-- A deleted report can't be opened (the backend only assembles\n live ones, and one under a deleted folder is not on the live\n listing), so in Show Deleted mode the name is plain text \u2014\n restore it from the row menu first. -->\n <span class=\"node-name\">{{ data.name }}</span>\n } @else {\n <a\n class=\"node-name\"\n [routerLink]=\"openLink(data.report)\">\n {{ data.name }}\n </a>\n }\n\n <!-- Only on the row somebody deleted. Everything under a deleted\n folder is muted with it, but was not deleted itself. -->\n @if (data.stateDeleted) {\n <fs-chip size=\"tiny\">Deleted</fs-chip>\n }\n </div>\n </ng-template>\n </fs-tree>\n\n @if (!nodes().length) {\n <p class=\"small tree-empty\">\n No reports yet. Create one, or add a folder to group them.\n </p>\n }\n</ng-container>\n", styles: ["a{cursor:pointer}fs-tree .node>.container{flex:1;min-width:0}fs-tree .node>.container>.content{min-width:0}fs-tree .node>.container>button{margin-top:-5px}.node-row{min-width:0}.node-row.deleted{opacity:.55}.node-icon{font-size:18px;width:18px;height:18px;flex:none}.node-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-empty{margin-top:10px}\n"] }]
|
|
422
529
|
}], ctorParameters: () => [] });
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0cy9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnRzL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFFTCxlQUFlLEVBQ2YsWUFBWSxFQUdaLGNBQWMsRUFDZCxZQUFZLEdBQ2IsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0Is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QWdCO3dCQUNoQixZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsVUFBVTtxQkFDWCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIE9uSW5pdCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSwgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5pbXBvcnQgeyBGc1NrZWxldG9uTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2tlbGV0b24nO1xuaW1wb3J0IHtcbiAgRmxhdEl0ZW1Ob2RlLFxuICBGc1RyZWVDb21wb25lbnQsXG4gIEZzVHJlZU1vZHVsZSxcbiAgSVRyZWVDaGFuZ2VSZW9yZGVyLFxuICBJVHJlZUNvbmZpZyxcbiAgVHJlZUFjdGlvblR5cGUsXG4gIFRyZWVEcmFnTW9kZSxcbn0gZnJvbSAnQGZpcmVzdGl0Y2gvdHJlZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5nc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvZ2xvYmFsLXNldHRpbmdzL2dsb2JhbC1zZXR0aW5ncy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgUmVwb3J0Rm9sZGVyLFxuICBSZXBvcnRMaXN0SXRlbSxcbiAgUmVwb3J0Tm9kZSxcbiAgUmVwb3J0Tm9kZVR5cGUsXG4gIFJlcG9ydFN0YXRlLFxuICBSZXBvcnRTdGF0ZXMsXG4gIFJlcG9ydFRyZWUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIHJlcG9ydHMgbGlzdGluZyDigJQgYW4gZnMtdHJlZSBvZiBmb2xkZXJzIGFuZCB0aGUgcmVwb3J0cyBmaWxlZCBpbnRvIHRoZW0uXG4vLyBSb3dzIGxpbmsgb3V0IHRocm91Z2ggYSBVUkwgcGF0dGVybiAoYSAnOmlkJyB0b2tlbiDihpIgdGhlIHJlcG9ydCBpZDsgYSBsZWFkaW5nXG4vLyAnLycgbWFrZXMgaXQgYWJzb2x1dGUsIG90aGVyd2lzZSBpdCdzIHJlbGF0aXZlIHRvIHRoaXMgY29tcG9uZW50J3Mgcm91dGUpLlxuLy8gQ3JlYXRlIHByb21wdHMgZm9yIGEgdGl0bGUsIGNyZWF0ZXMgdGhlIHJlcG9ydCwgdGhlbiByb3V0ZXMgdG8gaXQuIFRoZSBnZWFyXG4vLyBvcGVucyB0aGUgZ2xvYmFsIFJlcG9ydCBTZXR0aW5ncyBkaWFsb2cgKEFJIGtub3dsZWRnZSBkb2N1bWVudCArXG4vLyBzZW1hbnRpYy1kYXRhYmFzZSBidWlsZCksIHdoaWNoIGxpdmVzIGluIHRoaXMgcGFja2FnZS4gTm8gcm91dGluZyBpc1xuLy8gaGFyZC1jb2RlZCBoZXJlLlxuLy9cbi8vIEZvbGRlcnMgbmVzdDsgcmVwb3J0cyBhcmUgYWx3YXlzIGxlYXZlcyDigJQgY2FuRHJvcCBlbmZvcmNlcyBpdCBoZXJlLCBhbmQgdGhlXG4vLyBiYWNrZW5kIGVuZm9yY2VzIGl0IHN0cnVjdHVyYWxseSBieSBrZWVwaW5nIHRoZSB0cmVlIGluIGl0cyBvd24gdGFibGUuIEFcbi8vIHJlcG9ydCBpbiBubyBmb2xkZXIgaXMgYSByb290IG5vZGUsIHdoaWNoIGlzIHdoZXJlIGV2ZXJ5IHJlcG9ydCBzYXQgYmVmb3JlXG4vLyBmb2xkZXJzIGV4aXN0ZWQsIHNvIG5vdGhpbmcgaGFkIHRvIGJlIG1pZ3JhdGVkIG9yIGJ1Y2tldGVkIGFzIFwidW5jYXRlZ29yaXplZFwiLlxuLy9cbi8vIFJlcG9ydHMgYXJlIHNvZnQtZGVsZXRhYmxlOiB0aGUgcm93IGtlYmFiIGRlbGV0ZXMsIFwiU2hvdyBEZWxldGVkXCIgZmxpcHMgdGhlXG4vLyBsaXN0aW5nIGludG8gZGVsZXRlZCBtb2RlICh0aGUgYmFja2VuZCBoaWRlcyBkZWxldGVkIHJlcG9ydHMgb3RoZXJ3aXNlKSwgYW5kXG4vLyBpbiB0aGF0IG1vZGUgdGhlIGtlYmFiIG9mZmVycyBSZXN0b3JlIGluc3RlYWQuIEZvbGRlcnMgZG8gTk9UIHRha2UgcGFydCBpblxuLy8gdGhhdCDigJQgYSBmb2xkZXIgaXMgb25seSBkZWxldGFibGUgb25jZSBpdCBpcyBlbXB0eSwgc28gaXQgaGFyZCBkZWxldGVzIGFuZCBoYXNcbi8vIG5vdGhpbmcgdG8gcmVzdG9yZS4gVGhlIHVwc2hvdCBpcyB0aGF0IGRlbGV0ZWQgbW9kZSBrZWVwcyB0aGUgZm9sZGVyIHN0cnVjdHVyZVxuLy8gb24gc2NyZWVuIHdpdGggdGhlIGRlbGV0ZWQgcmVwb3J0cyBzaXR0aW5nIHdoZXJlIHRoZXkgYmVsb25nLCBzbyByZXN0b3Jpbmcgb25lXG4vLyBwdXRzIGl0IGJhY2sgcmF0aGVyIHRoYW4gZHJvcHBpbmcgaXQgYXQgdGhlIHJvb3QuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1haS1yZXBvcnRzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgICBGc1RyZWVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLy8gSG93IGRlZXAgdGhlIHRyZWUgb3BlbnMgb24gbG9hZC4gRm9sZGVycyBhcmUgYXVkaWVuY2UgYnVja2V0cywgbm90IGFcbiAgLy8gZmlsZXN5c3RlbSwgc28gdGhlcmUgaXMgbm90aGluZyB3b3J0aCBoaWRpbmcgYmVoaW5kIGEgY2xvc2VkIGNoZXZyb24uXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRVhQQU5EX0xFVkVMID0gMTA7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzIGVuZHBvaW50czsgb3ZlcnJpZGUgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZVBhdGggPSBpbnB1dDxzdHJpbmc+KCdyZXBvcnRzJyk7XG5cbiAgLy8gV2hlcmUgYSByb3cgbGlua3MgdG87ICc6aWQnIGlzIHJlcGxhY2VkIHdpdGggdGhlIHJlcG9ydCBpZC4gRGVmYXVsdCB0YWtlc1xuICAvLyB5b3UgdG8gPGN1cnJlbnQgcm91dGU+LzppZC4gQWJzb2x1dGUgd2hlbiBpdCBzdGFydHMgd2l0aCAnLycuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuUGF0dGVybiA9IGlucHV0PHN0cmluZz4oJzppZCcpO1xuXG4gIC8vIFdoZXJlIGEgZnJlc2hseS1jcmVhdGVkIHJlcG9ydCByb3V0ZXMgdG87IHNhbWUgJzppZCcgcGF0dGVybiBydWxlcy5cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZVBhdHRlcm4gPSBpbnB1dDxzdHJpbmc+KCc6aWQnKTtcblxuICAvLyBOdWxsIHVudGlsIHRoZSBmaXJzdCBsb2FkIHJlc29sdmVzIOKAlCB0aGF0IGlzIHdoYXQgZ2F0ZXMgKmZzU2tlbGV0b24uXG4gIHB1YmxpYyByZWFkb25seSBub2RlcyA9IHNpZ25hbDxSZXBvcnROb2RlW10+KG51bGwpO1xuXG4gIHB1YmxpYyB0cmVlQ29uZmlnOiBJVHJlZUNvbmZpZzxSZXBvcnROb2RlW10+O1xuICBwdWJsaWMgZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWc7XG5cbiAgLy8gVGVtcGxhdGUtc2lkZSBoYW5kbGUgb24gdGhlIGVudW0sIHNvIGEgcm93IGNhbiB0ZWxsIGEgZm9sZGVyIGZyb20gYSByZXBvcnQuXG4gIHB1YmxpYyByZWFkb25seSBub2RlVHlwZSA9IFJlcG9ydE5vZGVUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyZWUgPSB2aWV3Q2hpbGQoRnNUcmVlQ29tcG9uZW50KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vIFRoZSBmaWx0ZXIgYmFyJ3MgY3VycmVudCBxdWVyeSDigJQgY2FycmllcyBgc3RhdGVgIHdoZW4gU2hvdyBEZWxldGVkIGlzIG9uLlxuICBwcml2YXRlIF9xdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGgoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgYmVmb3JlIHRoZSBmaXJzdCBmZXRjaCByYXRoZXIgdGhhbiB3YWl0aW5nIG9uIHRoZSBlZmZlY3QgYWJvdmUsIHdoaWNoXG4gICAgLy8gZG9lcyBub3QgcnVuIHVudGlsIGFmdGVyIHRoZSBpbml0aWFsIGNoYW5nZSBkZXRlY3Rpb24gcGFzcy5cbiAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xuXG4gICAgdGhpcy5faW5pdEZpbHRlckNvbmZpZygpO1xuICAgIHRoaXMuX2luaXRUcmVlQ29uZmlnKCk7XG4gICAgdGhpcy5fbG9hZCgpO1xuICB9XG5cbiAgLy8gcm91dGVyTGluayBjb21tYW5kcyBmb3IgYSByZXBvcnQgcm93IChidWlsdCBmcm9tIG9wZW5QYXR0ZXJuKS5cbiAgcHVibGljIG9wZW5MaW5rKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuQ29tbWFuZHModGhpcy5vcGVuUGF0dGVybigpLCByZXBvcnQuaWQpO1xuICB9XG5cbiAgLy8gQSBkZWxldGVkIHJlcG9ydCBjYW4ndCBiZSBvcGVuZWQg4oCUIHRoZSBiYWNrZW5kIG9ubHkgYXNzZW1ibGVzIGFjdGl2ZSBvbmVzIOKAlFxuICAvLyBzbyBpbiBTaG93IERlbGV0ZWQgbW9kZSBpdHMgbmFtZSByZW5kZXJzIGFzIHBsYWluIHRleHQgcmF0aGVyIHRoYW4gYSBsaW5rLlxuICBwdWJsaWMgaXNEZWxldGVkKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVwb3J0Py5zdGF0ZSA9PT0gUmVwb3J0U3RhdGUuRGVsZXRlZDtcbiAgfVxuXG4gIC8vIFByb21wdCBmb3IgYSB0aXRsZSwgY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gcm91dGUgdG8gaXQgKGNyZWF0ZVBhdHRlcm4pLlxuICBwdWJsaWMgY3JlYXRlUmVwb3J0KCk6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5pbnB1dCh7XG4gICAgICB0aXRsZTogJ0NyZWF0ZSBSZXBvcnQnLFxuICAgICAgbGFiZWw6ICdUaXRsZScsXG4gICAgICBjb21taXRMYWJlbDogJ0NyZWF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZShuYW1lKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuY3JlYXRlUGF0dGVybigpO1xuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgdGhpcy5fcGF0dGVybkNvbW1hbmRzKHBhdHRlcm4sIHJlcG9ydC5pZCksXG4gICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKCcvJykgPyB7fSA6IHsgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBSZXBvcnQgU2V0dGluZ3MgZGlhbG9nOiB0aGUgQUkga25vd2xlZGdlIGRvY3VtZW50IGFuZCB0aGVcbiAgLy8gc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQuIEEgcnVubmluZyBidWlsZCBzdHJlYW1zIGludG8gdGhlIEZzUHJvY2VzcyBkb2NrLFxuICAvLyB3aGljaCBzdXJ2aXZlcyB0aGUgZGlhbG9nIGNsb3NpbmcuXG4gIHB1YmxpYyBvcGVuU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oR2xvYmFsU2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnOTAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRGaWx0ZXJDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJDb25maWcgPSB7XG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2tleXdvcmQnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3N0YXRlJyxcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlczogKCkgPT4gUmVwb3J0U3RhdGVzLFxuICAgICAgICAgIGlzb2xhdGU6IHsgbGFiZWw6ICdTaG93IERlbGV0ZWQnLCB2YWx1ZTogUmVwb3J0U3RhdGUuRGVsZXRlZCB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGljb246ICd1bmZvbGRfbW9yZScsXG4gICAgICAgICAgdG9vbHRpcDogJ0V4cGFuZCBhbGwnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLl90cmVlKCk/LmV4cGFuZEFsbCgpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWNvbjogJ3VuZm9sZF9sZXNzJyxcbiAgICAgICAgICB0b29sdGlwOiAnQ29sbGFwc2UgYWxsJyxcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5fdHJlZSgpPy5jb2xsYXBzZUFsbCgpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWNvbjogJ3NldHRpbmdzJyxcbiAgICAgICAgICB0b29sdGlwOiAnUmVwb3J0IHNldHRpbmdzJyxcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5vcGVuU2V0dGluZ3MoKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnTmV3IEZvbGRlcicsXG4gICAgICAgICAgcHJpbWFyeTogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuX2NyZWF0ZUZvbGRlcihudWxsKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnQ3JlYXRlJyxcbiAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLmNyZWF0ZVJlcG9ydCgpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIC8vIFRoZSB0d28gaXRlbXMgYXJlIGFuc3dlcmVkIGluIGRpZmZlcmVudCBwbGFjZXMgYW5kIGJvdGggaGF2ZSB0byBydW4uXG4gICAgICAvLyBUaGUga2V5d29yZCBkcml2ZXMgdGhlIHRyZWUncyBvd24gc2VhcmNoLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2ZcbiAgICAgIC8vIHNlYXJjaGluZyBhIHRyZWUg4oCUIGl0IHJldmVhbHMgYSBtYXRjaCBuZXN0ZWQgaW5zaWRlIGNvbGxhcHNlZCBmb2xkZXJzXG4gICAgICAvLyByYXRoZXIgdGhhbiBvbmx5IGZpbHRlcmluZyB3aGF0IGlzIGFscmVhZHkgb24gc2NyZWVuLiBgc3RhdGVgIGlzIHRoZVxuICAgICAgLy8gU2hvdyBEZWxldGVkIHRvZ2dsZSwgYW5kIG9ubHkgdGhlIHNlcnZlciBjYW4gYW5zd2VyIHRoYXQuXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0ZUNoYW5nZWQgPSBTdHJpbmcocXVlcnk/LnN0YXRlID8/ICcnKSAhPT0gU3RyaW5nKHRoaXMuX3F1ZXJ5LnN0YXRlID8/ICcnKTtcbiAgICAgICAgdGhpcy5fcXVlcnkgPSB7IC4uLnF1ZXJ5IH07XG5cbiAgICAgICAgdGhpcy5fc2VhcmNoKHF1ZXJ5Py5rZXl3b3JkKTtcblxuICAgICAgICBpZiAoc3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9pbml0VHJlZUNvbmZpZygpOiB2b2lkIHtcbiAgICB0aGlzLnRyZWVDb25maWcgPSB7XG4gICAgICBkYXRhOiBbXSxcbiAgICAgIGNoaWxkcmVuTmFtZTogJ2NoaWxkcmVuJyxcbiAgICAgIGV4cGFuZExldmVsOiBGc0FpUmVwb3J0c0NvbXBvbmVudC5FWFBBTkRfTEVWRUwsXG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAvLyBUaGUgd2hvbGUgcm93IGlzIHRoZSBncmlwIGFuZCB0aGUgaGFuZGxlIHN0YXlzIGhpZGRlbjsgYSBwcmVzcyBvbmx5XG4gICAgICAvLyBiZWNvbWVzIGEgZHJhZyBvbmNlIHRoZSBwb2ludGVyIG1vdmVzLCBzbyB0aGUga2ViYWIsIHRoZSBjaGV2cm9uIGFuZCB0aGVcbiAgICAgIC8vIHJlcG9ydCBsaW5rIGFsbCBzdGF5IGNsaWNrYWJsZS5cbiAgICAgIGRyYWdNb2RlOiBUcmVlRHJhZ01vZGUuTm9kZSxcbiAgICAgIC8vIGNhbkRyb3AgaXMgYXNrZWQgYWJvdXQgdGhlIG5vZGUgYmVpbmcgRFJBR0dFRCwgc28gb25seSBgdG9QYXJlbnRgXG4gICAgICAvLyBkZXNjcmliZXMgdGhlIGRlc3RpbmF0aW9uIOKAlCByZWFkaW5nIG5vZGUubGV2ZWwvbm9kZS5wYXJlbnQgaGVyZSB3b3VsZFxuICAgICAgLy8gZGVzY3JpYmUgd2hlcmUgaXQgY2FtZSBmcm9tLiBBIHJlcG9ydCBjYW4gbmV2ZXIgYmUgYSBwYXJlbnQgYmVjYXVzZSBpdHNcbiAgICAgIC8vIHR5cGUgc2F5cyBzbywgYW5kIHRoYXQgc2luZ2xlIHRlc3QgaXMgdGhlIHdob2xlIFwiZm9sZGVycyBuZXN0LCByZXBvcnRzXG4gICAgICAvLyBhcmUgbGVhdmVzXCIgcnVsZSBvbiB0aGlzIHNpZGUuXG4gICAgICBjYW5Ecm9wOiAobm9kZTogRmxhdEl0ZW1Ob2RlLCBmcm9tUGFyZW50OiBGbGF0SXRlbU5vZGUsIHRvUGFyZW50OiBGbGF0SXRlbU5vZGUpID0+IHtcbiAgICAgICAgcmV0dXJuICF0b1BhcmVudCB8fCB0b1BhcmVudC5kYXRhPy50eXBlID09PSBSZXBvcnROb2RlVHlwZS5Gb2xkZXI7XG4gICAgICB9LFxuICAgICAgY2hhbmdlUmVvcmRlcjogKGV2ZW50OiBJVHJlZUNoYW5nZVJlb3JkZXIpID0+IHRoaXMuX21vdmUoZXZlbnQpLFxuICAgICAgbm9kZUNsYXNzOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiBub2RlLmRhdGE/LnR5cGUsXG4gICAgICAvLyBNYXRjaCBvbiB0aGUgbmFtZSBvbmx5LiBUaGUgbGlicmFyeSdzIGRlZmF1bHQgbWF0Y2hlciBzdHJpbmdpZmllcyB0aGVcbiAgICAgIC8vIHdob2xlIG5vZGUsIHNvIGl0IHdvdWxkIGhpdCBpZHMsIHRoZSBsaXRlcmFsIHR5cGUgd29yZCwgYW5kIGV2ZXJ5dGhpbmdcbiAgICAgIC8vIGVsc2UgcmlkaW5nIG9uIHRoZSByb3cuXG4gICAgICBmaWx0ZXJJdGVtOiAobm9kZSwgcXVlcnkpID0+IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhub2RlLmRhdGE/Lm5hbWUgPz8gJycpXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAuaW5jbHVkZXMoU3RyaW5nKHF1ZXJ5ID8/ICcnKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0sXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBUcmVlQWN0aW9uVHlwZS5NZW51LFxuICAgICAgICAgIGljb246ICdtb3JlX3ZlcnQnLFxuICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVuYW1lJyxcbiAgICAgICAgICAgICAgc2hvdzogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gIXRoaXMuX2lzRGVsZXRlZE5vZGUobm9kZSksXG4gICAgICAgICAgICAgIGNsaWNrOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9yZW5hbWUobm9kZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ05ldyBGb2xkZXIgSW5zaWRlJyxcbiAgICAgICAgICAgICAgc2hvdzogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5faXNGb2xkZXJOb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fY3JlYXRlRm9sZGVyKG5vZGUuZGF0YT8uaWQpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdEZWxldGUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiAhdGhpcy5faXNEZWxldGVkTm9kZShub2RlKSxcbiAgICAgICAgICAgICAgY2xpY2s6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHRoaXMuX2RlbGV0ZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBGb2xkZXJzIG5ldmVyIHJlYWNoIHRoaXM6IHRoZXkgaGFyZCBkZWxldGUsIHNvIGEgZGVsZXRlZCBmb2xkZXJcbiAgICAgICAgICAgIC8vIGRvZXMgbm90IGV4aXN0IHRvIGJlIHJlc3RvcmVkLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1Jlc3RvcmUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVzdG9yZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRm9sZGVyTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZT8uZGF0YT8udHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEZWxldGVkTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0RlbGV0ZWQobm9kZT8uZGF0YT8ucmVwb3J0KTtcbiAgfVxuXG4gIC8vIERyaXZlIHRoZSB0cmVlJ3MgYnVpbHQtaW4gc2VhcmNoOiBpdCBjb2xsYXBzZXMgZXZlcnl0aGluZywgaGlkZXMgZXZlcnkgbm9kZSxcbiAgLy8gdGhlbiB1bmhpZGVzIGVhY2ggbWF0Y2ggYW5kIHdhbGtzIGl0cyBhbmNlc3RvcnMgb3Blbiwgc28gYSByZXBvcnQgc2V2ZXJhbFxuICAvLyBmb2xkZXJzIGRlZXAgc3VyZmFjZXMgd2l0aCBpdHMgcGF0aCBleHBhbmRlZC4gQ2xlYXJpbmcgZG9lcyBOT1QgdW5kbyB0aGF0XG4gIC8vIGluaXRpYWwgY29sbGFwc2UsIHNvIHRoZSB0cmVlIGlzIHJlLW9wZW5lZCBoZXJlIOKAlCBvdGhlcndpc2UgdGhlIGxpc3RpbmcgaXNcbiAgLy8gbGVmdCBmdWxseSBjb2xsYXBzZWQgdGhlIG1vbWVudCBzb21lYm9keSBlbXB0aWVzIHRoZSBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZWFyY2goa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5d29yZCkge1xuICAgICAgdHJlZS5zZWFyY2goa2V5d29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJlZS5jbGVhclNlYXJjaCgpO1xuICAgIHRyZWUuZXhwYW5kQWxsKCk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlcG9ydERhdGEudHJlZSh0aGlzLl9xdWVyeSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh0cmVlOiBSZXBvcnRUcmVlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fYnVpbGROb2Rlcyh0cmVlKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5zZXQobm9kZXMpO1xuXG4gICAgICAgIC8vIFRoZSB0cmVlIHJlYWRzIGBjb25maWdgIG9uY2UsIGluIGl0cyBvd24gbmdPbkluaXQuIFRoZSBmaXJzdCBsb2FkXG4gICAgICAgIC8vIGxhbmRzIGJlZm9yZSBpdCBleGlzdHMsIHNvIHRoZSBkYXRhIGhhcyB0byBhcnJpdmUgdGhyb3VnaCB0aGUgY29uZmlnO1xuICAgICAgICAvLyBldmVyeSBsYXRlciBvbmUgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGluc3RhbmNlIG9yIG5vdGhpbmcgY2hhbmdlcy5cbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0geyAuLi50aGlzLnRyZWVDb25maWcsIGRhdGE6IG5vZGVzIH07XG4gICAgICAgIHRoaXMuX3RyZWUoKT8uc2V0RGF0YShub2Rlcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIEZsYXQgQVBJIHJvd3Mg4oaSIHRoZSBuZXN0ZWQgc2hhcGUgZnMtdHJlZSByZW5kZXJzLiBGb2xkZXJzIGNvbWUgYmVmb3JlXG4gIC8vIHJlcG9ydHMgYXQgZXZlcnkgbGV2ZWwsIGVhY2ggYWxyZWFkeSBuYW1lLW9yZGVyZWQgYnkgdGhlIGJhY2tlbmQuXG4gIHByaXZhdGUgX2J1aWxkTm9kZXModHJlZTogUmVwb3J0VHJlZSk6IFJlcG9ydE5vZGVbXSB7XG4gICAgY29uc3QgZm9sZGVycyA9IHRyZWU/LmZvbGRlcnMgPz8gW107XG4gICAgY29uc3QgcmVwb3J0cyA9IHRyZWU/LnJlcG9ydHMgPz8gW107XG5cbiAgICBjb25zdCBidWlsZCA9IChwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IFJlcG9ydE5vZGVbXSA9PiB7XG4gICAgICBjb25zdCBmb2xkZXJOb2RlczogUmVwb3J0Tm9kZVtdID0gZm9sZGVyc1xuICAgICAgICAuZmlsdGVyKChmb2xkZXI6IFJlcG9ydEZvbGRlcikgPT4gKGZvbGRlci5wYXJlbnRSZXBvcnRGb2xkZXJJZCA/PyBudWxsKSA9PT0gcGFyZW50SWQpXG4gICAgICAgIC5tYXAoKGZvbGRlcjogUmVwb3J0Rm9sZGVyKSA9PiAoe1xuICAgICAgICAgIGtleTogYGY6JHtmb2xkZXIuaWR9YCxcbiAgICAgICAgICBpZDogZm9sZGVyLmlkLFxuICAgICAgICAgIG5hbWU6IGZvbGRlci5uYW1lLFxuICAgICAgICAgIHR5cGU6IFJlcG9ydE5vZGVUeXBlLkZvbGRlcixcbiAgICAgICAgICBjaGlsZHJlbjogYnVpbGQoZm9sZGVyLmlkKSxcbiAgICAgICAgfSkpO1xuXG4gICAgICBjb25zdCByZXBvcnROb2RlczogUmVwb3J0Tm9kZVtdID0gcmVwb3J0c1xuICAgICAgICAuZmlsdGVyKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiAocmVwb3J0LnJlcG9ydEZvbGRlcklkID8/IG51bGwpID09PSBwYXJlbnRJZClcbiAgICAgICAgLm1hcCgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4gKHtcbiAgICAgICAgICBrZXk6IGByOiR7cmVwb3J0LmlkfWAsXG4gICAgICAgICAgaWQ6IHJlcG9ydC5pZCxcbiAgICAgICAgICBuYW1lOiByZXBvcnQubmFtZSxcbiAgICAgICAgICB0eXBlOiBSZXBvcnROb2RlVHlwZS5SZXBvcnQsXG4gICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gWy4uLmZvbGRlck5vZGVzLCAuLi5yZXBvcnROb2Rlc107XG4gICAgfTtcblxuICAgIHJldHVybiBidWlsZChudWxsKTtcbiAgfVxuXG4gIC8vIEEgZHJvcCBtb3ZlZCBhIG5vZGUgdW5kZXIgYSBuZXcgcGFyZW50LCBvciBvdXQgdG8gdGhlIHJvb3QuIFRoZSB0cmVlIGhhc1xuICAvLyBhbHJlYWR5IG1vdmVkIGl0IG9uIHNjcmVlbiwgc28gYm90aCBvdXRjb21lcyByZWxvYWQ6IGEgc3VjY2VzcyB0byBwaWNrIHVwXG4gIC8vIHRoZSBzZXJ2ZXIncyBvcmRlcmluZywgYSBmYWlsdXJlIHRvIHB1dCB0aGUgcm93IGJhY2sgd2hlcmUgaXQgcmVhbGx5IGlzLlxuICBwcml2YXRlIF9tb3ZlKGV2ZW50OiBJVHJlZUNoYW5nZVJlb3JkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlOiBSZXBvcnROb2RlID0gZXZlbnQubm9kZT8uZGF0YTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyID0gZXZlbnQudG9QYXJlbnQ/LmRhdGE/LmlkID8/IG51bGw7XG5cbiAgICBpZiAoZXZlbnQudG9QYXJlbnQgJiYgIWV2ZW50LnRvUGFyZW50LmlzRXhwYW5kZWQoKSkge1xuICAgICAgZXZlbnQudG9QYXJlbnQuZXhwYW5kKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZSQ6IE9ic2VydmFibGU8dW5rbm93bj4gPSBub2RlLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLkZvbGRlclxuICAgICAgPyB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUZvbGRlcihub2RlLmlkLCB7IHBhcmVudFJlcG9ydEZvbGRlcklkIH0pXG4gICAgICA6IHRoaXMuX3JlcG9ydERhdGEubW92ZVJlcG9ydChub2RlLmlkLCBwYXJlbnRSZXBvcnRGb2xkZXJJZCk7XG5cbiAgICBzYXZlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBjaGFuZ2VzJyk7XG4gICAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5fbG9hZCgpLFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVGb2xkZXIocGFyZW50UmVwb3J0Rm9sZGVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Byb21wdC5pbnB1dCh7XG4gICAgICB0aXRsZTogJ05ldyBGb2xkZXInLFxuICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlRm9sZGVyKG5hbWUsIHBhcmVudFJlcG9ydEZvbGRlcklkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ0NyZWF0ZWQgZm9sZGVyJyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuYW1lKG5vZGU6IEZsYXRJdGVtTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IFJlcG9ydE5vZGUgPSBub2RlPy5kYXRhO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRhdGEudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuXG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiBmb2xkZXIgPyAnUmVuYW1lIEZvbGRlcicgOiAnUmVuYW1lIFJlcG9ydCcsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgZGVmYXVsdDogZGF0YS5uYW1lLFxuICAgICAgY29tbWl0TGFiZWw6ICdTYXZlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IChmb2xkZXJcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRm9sZGVyKGRhdGEuaWQsIHsgbmFtZSB9KVxuICAgICAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5yZW5hbWUoZGF0YS5pZCwgbmFtZSkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU2F2ZWQgY2hhbmdlcycpO1xuICAgICAgICB0aGlzLl9sb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIERlbGV0aW5nIGEgZm9sZGVyIGlzIHJlZnVzZWQgc2VydmVyLXNpZGUgd2hpbGUgaXQgc3RpbGwgaG9sZHMgYSBzdWItZm9sZGVyXG4gIC8vIG9yIGFuIGFjdGl2ZSByZXBvcnQsIGFuZCB0aGUgbWVzc2FnZSBzYXlzIHdoaWNoIOKAlCBzbyB0aGUgY29uZmlybSBoZXJlIHdhcm5zXG4gIC8vIHRoYXQgYSBmb2xkZXIgZGVsZXRlIGlzIHBlcm1hbmVudCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gcmVzdGF0ZSB0aGUgcnVsZS5cbiAgcHJpdmF0ZSBfZGVsZXRlKG5vZGU6IEZsYXRJdGVtTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IFJlcG9ydE5vZGUgPSBub2RlPy5kYXRhO1xuICAgIGlmICghZGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRhdGEudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdDb25maXJtJyxcbiAgICAgIHRlbXBsYXRlOiBmb2xkZXJcbiAgICAgICAgPyBgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGUgZm9sZGVyIFwiJHtkYXRhLm5hbWV9XCI/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS5gXG4gICAgICAgIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgdGhpcyByZXBvcnQ/JyxcbiAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiAoZm9sZGVyXG4gICAgICAgICAgPyB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZUZvbGRlcihkYXRhLmlkKVxuICAgICAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5kZWxldGUoZGF0YS5pZCkpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2Vzcyhmb2xkZXIgPyAnRGVsZXRlZCBmb2xkZXInIDogJ0RlbGV0ZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZShub2RlOiBGbGF0SXRlbU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBSZXBvcnROb2RlID0gbm9kZT8uZGF0YTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnREYXRhLnVuZGVsZXRlKGRhdGEuaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVzdG9yZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVHVybiBhICc6aWQnIHBhdHRlcm4gaW50byByb3V0ZXIgY29tbWFuZHMuIFJlbGF0aXZlIHVubGVzcyBpdCBzdGFydHNcbiAgLy8gd2l0aCAnLycsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHNlZ21lbnQgY2FycmllcyB0aGUgbGVhZGluZyBzbGFzaC5cbiAgcHJpdmF0ZSBfcGF0dGVybkNvbW1hbmRzKHBhdHRlcm46IHN0cmluZywgaWQ6IG51bWJlcik6IHVua25vd25bXSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICBjb25zdCBzZWdtZW50czogdW5rbm93bltdID0gcGF0dGVybi5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoc2VnbWVudCA9PT0gJzppZCcgPyBpZCA6IHNlZ21lbnQpKTtcblxuICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW2lkXTtcbiAgICB9XG5cbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHNlZ21lbnRzWzBdID0gYC8ke3NlZ21lbnRzWzBdfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG59XG4iLCI8ZnMtZmlsdGVyIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+PC9mcy1maWx0ZXI+XG5cbjxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJub2RlcygpXCI+XG4gIDxmcy10cmVlIFtjb25maWddPVwidHJlZUNvbmZpZ1wiPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmc1RyZWVOb2RlXG4gICAgICAgIGxldC1kYXRhPVwiZGF0YVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtc20uYWxpZ24tY2VudGVyIG5vZGUtcm93XCI+XG4gICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZGUtaWNvblwiPlxuICAgICAgICAgIHt7IGRhdGEudHlwZSA9PT0gbm9kZVR5cGUuRm9sZGVyID8gJ2ZvbGRlcicgOiAnaW5zZXJ0X2NoYXJ0X291dGxpbmVkJyB9fVxuICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgIEBpZiAoZGF0YS50eXBlID09PSBub2RlVHlwZS5Gb2xkZXIpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZGUtbmFtZVwiPnt7IGRhdGEubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSBpZiAoaXNEZWxldGVkKGRhdGEucmVwb3J0KSkge1xuICAgICAgICAgIDwhLS0gQSBkZWxldGVkIHJlcG9ydCBjYW4ndCBiZSBvcGVuZWQgKHRoZSBiYWNrZW5kIG9ubHkgYXNzZW1ibGVzXG4gICAgICAgICAgICAgICBhY3RpdmUgb25lcyksIHNvIGluIFNob3cgRGVsZXRlZCBtb2RlIHRoZSBuYW1lIGlzIHBsYWluIHRleHQg4oCUXG4gICAgICAgICAgICAgICByZXN0b3JlIGl0IGZyb20gdGhlIHJvdyBtZW51IGZpcnN0LiAtLT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZGUtbmFtZVwiPnt7IGRhdGEubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgICAgY2xhc3M9XCJub2RlLW5hbWVcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJvcGVuTGluayhkYXRhLnJlcG9ydClcIj5cbiAgICAgICAgICAgIHt7IGRhdGEubmFtZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy10cmVlPlxuXG4gIEBpZiAoIW5vZGVzKCkubGVuZ3RoKSB7XG4gICAgPHAgY2xhc3M9XCJzbWFsbCB0cmVlLWVtcHR5XCI+XG4gICAgICBObyByZXBvcnRzIHlldC4gQ3JlYXRlIG9uZSwgb3IgYWRkIGEgZm9sZGVyIHRvIGdyb3VwIHRoZW0uXG4gICAgPC9wPlxuICB9XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|
|
530
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtYWktcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvdmlld3MvcmVwb3J0cy9mcy1haS1yZXBvcnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy92aWV3cy9yZXBvcnRzL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFnQixjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBRUwsZUFBZSxFQUNmLFlBQVksRUFHWixjQUFjLEVBQ2QsWUFBWSxHQUNiLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0s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Q0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO3dHQS9pQlUsb0JBQW9COzRGQUFwQixvQkFBb0IsdWhCQXFCSSxlQUFlLGdFQ3pHcEQsbytDQTJDQSxrYkRpQ0ksWUFBWSxxWEFDWixjQUFjLGtLQUNkLGdCQUFnQixpS0FDaEIsWUFBWSwwTkFDWixhQUFhLG9MQUNiLFVBQVU7OzRGQUdELG9CQUFvQjtrQkFmaEMsU0FBUzsrQkFDRSxlQUFlLG1CQUdSLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixVQUFVO3FCQUNYIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgT25Jbml0LFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHNpZ25hbCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIsIFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuXG5pbXBvcnQgeyBGc0NoaXBNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jaGlwJztcbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUsIEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7XG4gIEZsYXRJdGVtTm9kZSxcbiAgRnNUcmVlQ29tcG9uZW50LFxuICBGc1RyZWVNb2R1bGUsXG4gIElUcmVlQ2hhbmdlUmVvcmRlcixcbiAgSVRyZWVDb25maWcsXG4gIFRyZWVBY3Rpb25UeXBlLFxuICBUcmVlRHJhZ01vZGUsXG59IGZyb20gJ0BmaXJlc3RpdGNoL3RyZWUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgR2xvYmFsU2V0dGluZ3NDb21wb25lbnQgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2dsb2JhbC1zZXR0aW5ncy9nbG9iYWwtc2V0dGluZ3MuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJlcG9ydEZvbGRlcixcbiAgUmVwb3J0TGlzdEl0ZW0sXG4gIFJlcG9ydE5vZGUsXG4gIFJlcG9ydE5vZGVUeXBlLFxuICBSZXBvcnRTdGF0ZSxcbiAgUmVwb3J0VHJlZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBUaGUgcmVwb3J0cyBsaXN0aW5nIOKAlCBhbiBmcy10cmVlIG9mIGZvbGRlcnMgYW5kIHRoZSByZXBvcnRzIGZpbGVkIGludG8gdGhlbS5cbi8vIFJvd3MgbGluayBvdXQgdGhyb3VnaCBhIFVSTCBwYXR0ZXJuIChhICc6aWQnIHRva2VuIOKGkiB0aGUgcmVwb3J0IGlkOyBhIGxlYWRpbmdcbi8vICcvJyBtYWtlcyBpdCBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGl0J3MgcmVsYXRpdmUgdG8gdGhpcyBjb21wb25lbnQncyByb3V0ZSkuXG4vLyBDcmVhdGUgcHJvbXB0cyBmb3IgYSB0aXRsZSwgY3JlYXRlcyB0aGUgcmVwb3J0LCB0aGVuIHJvdXRlcyB0byBpdC4gVGhlIGdlYXJcbi8vIG9wZW5zIHRoZSBnbG9iYWwgUmVwb3J0IFNldHRpbmdzIGRpYWxvZyAoQUkga25vd2xlZGdlIGRvY3VtZW50ICtcbi8vIHNlbWFudGljLWRhdGFiYXNlIGJ1aWxkKSwgd2hpY2ggbGl2ZXMgaW4gdGhpcyBwYWNrYWdlLiBObyByb3V0aW5nIGlzXG4vLyBoYXJkLWNvZGVkIGhlcmUuXG4vL1xuLy8gRm9sZGVycyBuZXN0OyByZXBvcnRzIGFyZSBhbHdheXMgbGVhdmVzIOKAlCBjYW5Ecm9wIGVuZm9yY2VzIGl0IGhlcmUsIGFuZCB0aGVcbi8vIGJhY2tlbmQgZW5mb3JjZXMgaXQgc3RydWN0dXJhbGx5IGJ5IGtlZXBpbmcgdGhlIHRyZWUgaW4gaXRzIG93biB0YWJsZS4gQVxuLy8gcmVwb3J0IGluIG5vIGZvbGRlciBpcyBhIHJvb3Qgbm9kZSwgd2hpY2ggaXMgd2hlcmUgZXZlcnkgcmVwb3J0IHNhdCBiZWZvcmVcbi8vIGZvbGRlcnMgZXhpc3RlZCwgc28gbm90aGluZyBoYWQgdG8gYmUgbWlncmF0ZWQgb3IgYnVja2V0ZWQgYXMgXCJ1bmNhdGVnb3JpemVkXCIuXG4vL1xuLy8gRm9sZGVycyBhbmQgcmVwb3J0cyBhcmUgYm90aCBzb2Z0LWRlbGV0YWJsZSwgYW5kIGEgZm9sZGVyIGRlbGV0ZXMgd2hhdGV2ZXIgaXRcbi8vIGhvbGRzLiBPbmx5IHRoZSBmb2xkZXIncyBvd24gcm93IGlzIHdyaXR0ZW46IGV2ZXJ5dGhpbmcgdW5kZXIgaXQgZHJvcHMgb3V0IG9mXG4vLyB0aGUgbGlzdGluZyBiZWNhdXNlIGl0IHNpdHMgdW5kZXIgYSBkZWxldGVkIGZvbGRlciwgYW5kIGNvbWVzIGJhY2sgd2l0aCBpdC5cbi8vIFwiU2hvdyBEZWxldGVkXCIgc2hvd3MgdGhlIFdIT0xFIHRyZWUg4oCUIGxpdmUgYW5kIGRlbGV0ZWQgdG9nZXRoZXIsIGVhY2ggZGVsZXRlZFxuLy8gcm93IHdoZXJlIGl0IHdhcyBmaWxlZCDigJQgYW5kIG9uIGFueXRoaW5nIGRlbGV0ZWQgdGhlIGtlYmFiIG9mZmVycyBSZXN0b3JlXG4vLyBpbnN0ZWFkLiBSZXN0b3JpbmcgYWxzbyByZXN0b3JlcyBhbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgdGhlIHJvdywgc28gaXQgbGFuZHNcbi8vIGJhY2sgd2hlcmUgaXQgd2FzIHJhdGhlciB0aGFuIGF0IHRoZSByb290LlxuLy9cbi8vIEV2ZXJ5IGZvbGRlciBzdGFydHMgY29sbGFwc2VkOyB0aGUgdHJlZSByZW1lbWJlcnMgd2hhdCB3YXMgb3BlbmVkIGFjcm9zcyBpdHNcbi8vIG93biByZWxvYWRzIChhIHJlbmFtZSwgYSBtb3ZlLCB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSkgYW5kIGFjcm9zcyBhIHNlYXJjaC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFpLXJlcG9ydHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZnMtYWktcmVwb3J0cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZzLWFpLXJlcG9ydHMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGc0NoaXBNb2R1bGUsXG4gICAgRnNGaWx0ZXJNb2R1bGUsXG4gICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgICBGc1RyZWVNb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FpUmVwb3J0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgLy8gQVBJIGJhc2UgZm9yIHRoZSByZXBvcnRzIGVuZHBvaW50czsgb3ZlcnJpZGUgdG8gbW91bnQgZWxzZXdoZXJlLlxuICBwdWJsaWMgcmVhZG9ubHkgYmFzZVBhdGggPSBpbnB1dDxzdHJpbmc+KCdyZXBvcnRzJyk7XG5cbiAgLy8gV2hlcmUgYSByb3cgbGlua3MgdG87ICc6aWQnIGlzIHJlcGxhY2VkIHdpdGggdGhlIHJlcG9ydCBpZC4gRGVmYXVsdCB0YWtlc1xuICAvLyB5b3UgdG8gPGN1cnJlbnQgcm91dGU+LzppZC4gQWJzb2x1dGUgd2hlbiBpdCBzdGFydHMgd2l0aCAnLycuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuUGF0dGVybiA9IGlucHV0PHN0cmluZz4oJzppZCcpO1xuXG4gIC8vIFdoZXJlIGEgZnJlc2hseS1jcmVhdGVkIHJlcG9ydCByb3V0ZXMgdG87IHNhbWUgJzppZCcgcGF0dGVybiBydWxlcy5cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZVBhdHRlcm4gPSBpbnB1dDxzdHJpbmc+KCc6aWQnKTtcblxuICAvLyBOdWxsIHVudGlsIHRoZSBmaXJzdCBsb2FkIHJlc29sdmVzIOKAlCB0aGF0IGlzIHdoYXQgZ2F0ZXMgKmZzU2tlbGV0b24uXG4gIHB1YmxpYyByZWFkb25seSBub2RlcyA9IHNpZ25hbDxSZXBvcnROb2RlW10+KG51bGwpO1xuXG4gIHB1YmxpYyB0cmVlQ29uZmlnOiBJVHJlZUNvbmZpZzxSZXBvcnROb2RlW10+O1xuICBwdWJsaWMgZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWc7XG5cbiAgLy8gVGVtcGxhdGUtc2lkZSBoYW5kbGUgb24gdGhlIGVudW0sIHNvIGEgcm93IGNhbiB0ZWxsIGEgZm9sZGVyIGZyb20gYSByZXBvcnQuXG4gIHB1YmxpYyByZWFkb25seSBub2RlVHlwZSA9IFJlcG9ydE5vZGVUeXBlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyZWUgPSB2aWV3Q2hpbGQoRnNUcmVlQ29tcG9uZW50KTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9kZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vIFRoZSBmaWx0ZXIgYmFyJ3MgY3VycmVudCBxdWVyeSDigJQgY2FycmllcyBgc3RhdGVgIHdoZW4gU2hvdyBEZWxldGVkIGlzIG9uLlxuICBwcml2YXRlIF9xdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvLyBUaGUgZm9sZGVycyB0aGF0IHdlcmUgb3BlbiB3aGVuIGEgc2VhcmNoIHN0YXJ0ZWQ7IG51bGwgd2hpbGUgbm8gc2VhcmNoIGlzXG4gIC8vIHJ1bm5pbmcuIFRoZSBzZWFyY2ggb3BlbnMgZXZlcnkgbWF0Y2gncyBwYXRoIG92ZXIgdGhlIHRvcCBvZiB0aGVtLCBhbmRcbiAgLy8gY2xlYXJpbmcgaXQgcHV0cyB0aGVzZSBiYWNrLlxuICBwcml2YXRlIF9leHBhbmRlZEJlZm9yZVNlYXJjaDogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5iYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGgoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgYmVmb3JlIHRoZSBmaXJzdCBmZXRjaCByYXRoZXIgdGhhbiB3YWl0aW5nIG9uIHRoZSBlZmZlY3QgYWJvdmUsIHdoaWNoXG4gICAgLy8gZG9lcyBub3QgcnVuIHVudGlsIGFmdGVyIHRoZSBpbml0aWFsIGNoYW5nZSBkZXRlY3Rpb24gcGFzcy5cbiAgICB0aGlzLl9yZXBvcnREYXRhLmJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aCgpO1xuXG4gICAgdGhpcy5faW5pdEZpbHRlckNvbmZpZygpO1xuICAgIHRoaXMuX2luaXRUcmVlQ29uZmlnKCk7XG4gICAgdGhpcy5fbG9hZCgpO1xuICB9XG5cbiAgLy8gcm91dGVyTGluayBjb21tYW5kcyBmb3IgYSByZXBvcnQgcm93IChidWlsdCBmcm9tIG9wZW5QYXR0ZXJuKS5cbiAgcHVibGljIG9wZW5MaW5rKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pOiB1bmtub3duW10ge1xuICAgIHJldHVybiB0aGlzLl9wYXR0ZXJuQ29tbWFuZHModGhpcy5vcGVuUGF0dGVybigpLCByZXBvcnQuaWQpO1xuICB9XG5cbiAgLy8gUHJvbXB0IGZvciBhIHRpdGxlLCBjcmVhdGUgdGhlIHJlcG9ydCDigJQgZmlsZWQgdW5kZXIgcmVwb3J0Rm9sZGVySWQgd2hlbiBhXG4gIC8vIGZvbGRlcidzIGtlYmFiIGFza2VkLCBhdCB0aGUgcm9vdCBvdGhlcndpc2Ug4oCUIHRoZW4gcm91dGUgdG8gaXQgKGNyZWF0ZVBhdHRlcm4pLlxuICBwdWJsaWMgY3JlYXRlUmVwb3J0KHJlcG9ydEZvbGRlcklkOiBudW1iZXIgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiAnQ3JlYXRlIFJlcG9ydCcsXG4gICAgICBsYWJlbDogJ1RpdGxlJyxcbiAgICAgIGNvbW1pdExhYmVsOiAnQ3JlYXRlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuX3JlcG9ydERhdGEuY3JlYXRlKG5hbWUsIHJlcG9ydEZvbGRlcklkKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlcG9ydDogUmVwb3J0TGlzdEl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMuY3JlYXRlUGF0dGVybigpO1xuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgdGhpcy5fcGF0dGVybkNvbW1hbmRzKHBhdHRlcm4sIHJlcG9ydC5pZCksXG4gICAgICAgICAgcGF0dGVybi5zdGFydHNXaXRoKCcvJykgPyB7fSA6IHsgcmVsYXRpdmVUbzogdGhpcy5fcm91dGUgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIGdsb2JhbCBSZXBvcnQgU2V0dGluZ3MgZGlhbG9nOiB0aGUgQUkga25vd2xlZGdlIGRvY3VtZW50IGFuZCB0aGVcbiAgLy8gc2VtYW50aWMtZGF0YWJhc2UgYnVpbGQuIEEgcnVubmluZyBidWlsZCBzdHJlYW1zIGludG8gdGhlIEZzUHJvY2VzcyBkb2NrLFxuICAvLyB3aGljaCBzdXJ2aXZlcyB0aGUgZGlhbG9nIGNsb3NpbmcuXG4gIHB1YmxpYyBvcGVuU2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oR2xvYmFsU2V0dGluZ3NDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnOTAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc5NXZ3JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRGaWx0ZXJDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJDb25maWcgPSB7XG4gICAgICBpdGVtczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2tleXdvcmQnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxuICAgICAgICB9LFxuICAgICAgICAvLyBBIGNoZWNrYm94IHJhdGhlciB0aGFuIHRoZSB1c3VhbCBTdGF0dXMgc2VsZWN0IHdpdGggYSBcIlNob3cgRGVsZXRlZFwiXG4gICAgICAgIC8vIGlzb2xhdGUuIElzb2xhdGluZyB0aGUgZGVsZXRlZCByb3dzIHdvdWxkIHN0cmFuZCB0aGVtOiBhIGRlbGV0ZWRcbiAgICAgICAgLy8gcmVwb3J0IGluIGEgbGl2ZSBmb2xkZXIgYXJyaXZlcyB3aXRob3V0IHRoZSBmb2xkZXIgaXQgc2l0cyBpbiwgYW5kIGFcbiAgICAgICAgLy8gdHJlZSBjYW5ub3QgcGxhY2UgYSBub2RlIHdob3NlIHBhcmVudCBpdCBuZXZlciByZWNlaXZlZC4gU28gdGhlXG4gICAgICAgIC8vIHRvZ2dsZSBhc2tzIGZvciBldmVyeXRoaW5nLCBhbmQgdGhlIHJvd3MgbWFyayB3aGF0IGlzIGRlbGV0ZWQuXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RhdGUnLFxuICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLkNoZWNrYm94LFxuICAgICAgICAgIGxhYmVsOiAnU2hvdyBEZWxldGVkJyxcbiAgICAgICAgICBjaGVja2VkOiBbUmVwb3J0U3RhdGUuQWN0aXZlLCBSZXBvcnRTdGF0ZS5EZWxldGVkXS5qb2luKCcsJyksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWNvbjogJ3VuZm9sZF9tb3JlJyxcbiAgICAgICAgICB0b29sdGlwOiAnRXhwYW5kIGFsbCcsXG4gICAgICAgICAgcHJpbWFyeTogZmFsc2UsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuX3RyZWUoKT8uZXhwYW5kQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAndW5mb2xkX2xlc3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdDb2xsYXBzZSBhbGwnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLl90cmVlKCk/LmNvbGxhcHNlQWxsKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpY29uOiAnc2V0dGluZ3MnLFxuICAgICAgICAgIHRvb2x0aXA6ICdSZXBvcnQgc2V0dGluZ3MnLFxuICAgICAgICAgIHByaW1hcnk6IGZhbHNlLFxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB0aGlzLm9wZW5TZXR0aW5ncygpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdOZXcgRm9sZGVyJyxcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5fY3JlYXRlRm9sZGVyKG51bGwpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdDcmVhdGUnLFxuICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY3JlYXRlUmVwb3J0KCksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLy8gVGhlIHR3byBpdGVtcyBhcmUgYW5zd2VyZWQgaW4gZGlmZmVyZW50IHBsYWNlcywgYW5kIGVhY2ggb25seSB3aGVuIGl0XG4gICAgICAvLyBjaGFuZ2VkLiBUaGUga2V5d29yZCBkcml2ZXMgdGhlIHRyZWUncyBvd24gc2VhcmNoLCB3aGljaCBpcyB0aGUgd2hvbGVcbiAgICAgIC8vIHBvaW50IG9mIHNlYXJjaGluZyBhIHRyZWUg4oCUIGl0IHJldmVhbHMgYSBtYXRjaCBuZXN0ZWQgaW5zaWRlIGNvbGxhcHNlZFxuICAgICAgLy8gZm9sZGVycyByYXRoZXIgdGhhbiBvbmx5IGZpbHRlcmluZyB3aGF0IGlzIGFscmVhZHkgb24gc2NyZWVuLiBgc3RhdGVgIGlzXG4gICAgICAvLyB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSwgYW5kIG9ubHkgdGhlIHNlcnZlciBjYW4gYW5zd2VyIHRoYXQuIFJ1bm5pbmcgdGhlXG4gICAgICAvLyBzZWFyY2ggb24gYSB0b2dnbGUgd291bGQgY2xlYXIgaXQsIGFuZCBjbGVhcmluZyBjb2xsYXBzZXMgdGhlIHRyZWUuXG4gICAgICBjaGFuZ2U6IChxdWVyeSkgPT4ge1xuICAgICAgICBjb25zdCBrZXl3b3JkQ2hhbmdlZCA9IFN0cmluZyhxdWVyeT8ua2V5d29yZCA/PyAnJykgIT09IFN0cmluZyh0aGlzLl9xdWVyeS5rZXl3b3JkID8/ICcnKTtcbiAgICAgICAgY29uc3Qgc3RhdGVDaGFuZ2VkID0gU3RyaW5nKHF1ZXJ5Py5zdGF0ZSA/PyAnJykgIT09IFN0cmluZyh0aGlzLl9xdWVyeS5zdGF0ZSA/PyAnJyk7XG4gICAgICAgIHRoaXMuX3F1ZXJ5ID0geyAuLi5xdWVyeSB9O1xuXG4gICAgICAgIGlmIChrZXl3b3JkQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMuX3NlYXJjaChxdWVyeT8ua2V5d29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9pbml0VHJlZUNvbmZpZygpOiB2b2lkIHtcbiAgICAvLyBObyBleHBhbmRMZXZlbDogZXZlcnkgZm9sZGVyIHN0YXJ0cyBjb2xsYXBzZWQuXG4gICAgdGhpcy50cmVlQ29uZmlnID0ge1xuICAgICAgZGF0YTogW10sXG4gICAgICBjaGlsZHJlbk5hbWU6ICdjaGlsZHJlbicsXG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICAvLyBUaGUgd2hvbGUgcm93IGlzIHRoZSBncmlwIGFuZCB0aGUgaGFuZGxlIHN0YXlzIGhpZGRlbjsgYSBwcmVzcyBvbmx5XG4gICAgICAvLyBiZWNvbWVzIGEgZHJhZyBvbmNlIHRoZSBwb2ludGVyIG1vdmVzLCBzbyB0aGUga2ViYWIsIHRoZSBjaGV2cm9uIGFuZCB0aGVcbiAgICAgIC8vIHJlcG9ydCBsaW5rIGFsbCBzdGF5IGNsaWNrYWJsZS5cbiAgICAgIGRyYWdNb2RlOiBUcmVlRHJhZ01vZGUuTm9kZSxcbiAgICAgIC8vIEFueXRoaW5nIGRlbGV0ZWQgaXMgcmVzdG9yZWQgYmVmb3JlIGl0IGlzIG1vdmVkIOKAlCB0aGUgYmFja2VuZCByZWZ1c2VzXG4gICAgICAvLyB0byBlZGl0IGEgZGVsZXRlZCByb3csIGFuZCBhIGRyYWcgd291bGQgb25seSBzbmFwIGJhY2suXG4gICAgICBjYW5EcmFnOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiAhdGhpcy5faXNEZWxldGVkTm9kZShub2RlKSxcbiAgICAgIC8vIGNhbkRyb3AgaXMgYXNrZWQgYWJvdXQgdGhlIG5vZGUgYmVpbmcgRFJBR0dFRCwgc28gb25seSBgdG9QYXJlbnRgXG4gICAgICAvLyBkZXNjcmliZXMgdGhlIGRlc3RpbmF0aW9uIOKAlCByZWFkaW5nIG5vZGUubGV2ZWwvbm9kZS5wYXJlbnQgaGVyZSB3b3VsZFxuICAgICAgLy8gZGVzY3JpYmUgd2hlcmUgaXQgY2FtZSBmcm9tLiBBIHJlcG9ydCBjYW4gbmV2ZXIgYmUgYSBwYXJlbnQgYmVjYXVzZSBpdHNcbiAgICAgIC8vIHR5cGUgc2F5cyBzbywgYW5kIHRoYXQgc2luZ2xlIHRlc3QgaXMgdGhlIHdob2xlIFwiZm9sZGVycyBuZXN0LCByZXBvcnRzXG4gICAgICAvLyBhcmUgbGVhdmVzXCIgcnVsZSBvbiB0aGlzIHNpZGUuIEEgZGVsZXRlZCBmb2xkZXIgaXMgbm8gZGVzdGluYXRpb25cbiAgICAgIC8vIGVpdGhlcjogd2hhdGV2ZXIgbGFuZGVkIGluIGl0IHdvdWxkIHZhbmlzaCBmcm9tIHRoZSBsaXZlIGxpc3RpbmcuXG4gICAgICBjYW5Ecm9wOiAobm9kZTogRmxhdEl0ZW1Ob2RlLCBmcm9tUGFyZW50OiBGbGF0SXRlbU5vZGUsIHRvUGFyZW50OiBGbGF0SXRlbU5vZGUpID0+IHtcbiAgICAgICAgcmV0dXJuICF0b1BhcmVudCB8fCAodGhpcy5faXNGb2xkZXJOb2RlKHRvUGFyZW50KSAmJiAhdGhpcy5faXNEZWxldGVkTm9kZSh0b1BhcmVudCkpO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZVJlb3JkZXI6IChldmVudDogSVRyZWVDaGFuZ2VSZW9yZGVyKSA9PiB0aGlzLl9tb3ZlKGV2ZW50KSxcbiAgICAgIG5vZGVDbGFzczogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gbm9kZS5kYXRhPy50eXBlLFxuICAgICAgLy8gTWF0Y2ggb24gdGhlIG5hbWUgb25seS4gVGhlIGxpYnJhcnkncyBkZWZhdWx0IG1hdGNoZXIgc3RyaW5naWZpZXMgdGhlXG4gICAgICAvLyB3aG9sZSBub2RlLCBzbyBpdCB3b3VsZCBoaXQgaWRzLCB0aGUgbGl0ZXJhbCB0eXBlIHdvcmQsIGFuZCBldmVyeXRoaW5nXG4gICAgICAvLyBlbHNlIHJpZGluZyBvbiB0aGUgcm93LlxuICAgICAgZmlsdGVySXRlbTogKG5vZGUsIHF1ZXJ5KSA9PiB7XG4gICAgICAgIHJldHVybiBTdHJpbmcobm9kZS5kYXRhPy5uYW1lID8/ICcnKVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLmluY2x1ZGVzKFN0cmluZyhxdWVyeSA/PyAnJykudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9LFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogVHJlZUFjdGlvblR5cGUuTWVudSxcbiAgICAgICAgICBpY29uOiAnbW9yZV92ZXJ0JyxcbiAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1JlbmFtZScsXG4gICAgICAgICAgICAgIHNob3c6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+ICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVuYW1lKG5vZGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdOZXcgcmVwb3J0JyxcbiAgICAgICAgICAgICAgc2hvdzogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5faXNGb2xkZXJOb2RlKG5vZGUpICYmICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5jcmVhdGVSZXBvcnQobm9kZS5kYXRhPy5pZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ05ldyBmb2xkZXInLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0ZvbGRlck5vZGUobm9kZSkgJiYgIXRoaXMuX2lzRGVsZXRlZE5vZGUobm9kZSksXG4gICAgICAgICAgICAgIGNsaWNrOiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9jcmVhdGVGb2xkZXIobm9kZS5kYXRhPy5pZCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgICAgICAgIHNob3c6IChub2RlOiBGbGF0SXRlbU5vZGUpID0+ICF0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fZGVsZXRlKG5vZGUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIE9uIGV2ZXJ5IGRlbGV0ZWQgcm93LCBpbmNsdWRpbmcgYSBsaXZlIG9uZSB0aGF0IGlzIG9ubHkgaGlkZGVuIGJ5XG4gICAgICAgICAgICAvLyBhIGRlbGV0ZWQgZm9sZGVyIGFib3ZlIGl0IOKAlCByZXN0b3JpbmcgdGhhdCBicmluZ3MgdGhlIGZvbGRlciBiYWNrLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYWJlbDogJ1Jlc3RvcmUnLFxuICAgICAgICAgICAgICBzaG93OiAobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiB0aGlzLl9pc0RlbGV0ZWROb2RlKG5vZGUpLFxuICAgICAgICAgICAgICBjbGljazogKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gdGhpcy5fcmVzdG9yZShub2RlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRm9sZGVyTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm9kZT8uZGF0YT8udHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEZWxldGVkTm9kZShub2RlOiBGbGF0SXRlbU5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFub2RlPy5kYXRhPy5kZWxldGVkO1xuICB9XG5cbiAgLy8gRHJpdmUgdGhlIHRyZWUncyBidWlsdC1pbiBzZWFyY2g6IGl0IGNvbGxhcHNlcyBldmVyeXRoaW5nLCBoaWRlcyBldmVyeSBub2RlLFxuICAvLyB0aGVuIHVuaGlkZXMgZWFjaCBtYXRjaCBhbmQgd2Fsa3MgaXRzIGFuY2VzdG9ycyBvcGVuLCBzbyBhIHJlcG9ydCBzZXZlcmFsXG4gIC8vIGZvbGRlcnMgZGVlcCBzdXJmYWNlcyB3aXRoIGl0cyBwYXRoIGV4cGFuZGVkLiBDbGVhcmluZyBjb2xsYXBzZXMgZXZlcnl0aGluZ1xuICAvLyBhZ2Fpbiwgc28gdGhlIGZvbGRlcnMgdGhhdCB3ZXJlIG9wZW4gYmVmb3JlIHRoZSBzZWFyY2ggYXJlIHB1dCBiYWNrLlxuICBwcml2YXRlIF9zZWFyY2goa2V5d29yZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoa2V5d29yZCkge1xuICAgICAgdGhpcy5fZXhwYW5kZWRCZWZvcmVTZWFyY2ggPz89IHRoaXMuX2V4cGFuZGVkS2V5cygpO1xuICAgICAgdHJlZS5zZWFyY2goa2V5d29yZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJlZS5jbGVhclNlYXJjaCgpO1xuICAgIHRoaXMuX2V4cGFuZEtleXModGhpcy5fZXhwYW5kZWRCZWZvcmVTZWFyY2ggPz8gW10pO1xuICAgIHRoaXMuX2V4cGFuZGVkQmVmb3JlU2VhcmNoID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2xvYWQoKTogdm9pZCB7XG4gICAgLy8gT25seSB0aGUgU2hvdyBEZWxldGVkIHRvZ2dsZSBpcyB0aGUgc2VydmVyJ3MgdG8gYW5zd2VyIOKAlCB0aGUga2V5d29yZCBpc1xuICAgIC8vIHRoZSB0cmVlJ3Mgb3duIHNlYXJjaCDigJQgYW5kIGFuIHVuY2hlY2tlZCB0b2dnbGUgc2VuZHMgbm90aGluZywgbGVhdmluZyB0aGVcbiAgICAvLyBiYWNrZW5kJ3MgYWN0aXZlLW9ubHkgZGVmYXVsdCBpbiBjaGFyZ2UuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLl9xdWVyeS5zdGF0ZSA/IHsgc3RhdGU6IHRoaXMuX3F1ZXJ5LnN0YXRlIH0gOiB7fTtcblxuICAgIHRoaXMuX3JlcG9ydERhdGEudHJlZShxdWVyeSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXBvcnRUcmVlOiBSZXBvcnRUcmVlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fYnVpbGROb2RlcyhyZXBvcnRUcmVlKTtcbiAgICAgICAgdGhpcy5ub2Rlcy5zZXQobm9kZXMpO1xuXG4gICAgICAgIC8vIFRoZSB0cmVlIHJlYWRzIGBjb25maWdgIG9uY2UsIGluIGl0cyBvd24gbmdPbkluaXQuIFRoZSBmaXJzdCBsb2FkXG4gICAgICAgIC8vIGxhbmRzIGJlZm9yZSBpdCBleGlzdHMsIHNvIHRoZSBkYXRhIGhhcyB0byBhcnJpdmUgdGhyb3VnaCB0aGUgY29uZmlnO1xuICAgICAgICAvLyBldmVyeSBsYXRlciBvbmUgaGFzIHRvIGdvIHRocm91Z2ggdGhlIGluc3RhbmNlIG9yIG5vdGhpbmcgY2hhbmdlcy5cbiAgICAgICAgdGhpcy50cmVlQ29uZmlnID0geyAuLi50aGlzLnRyZWVDb25maWcsIGRhdGE6IG5vZGVzIH07XG5cbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICAgICAgaWYgKCF0cmVlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0RGF0YSgpIHJlYnVpbGRzIGV2ZXJ5IG5vZGUgY29sbGFwc2VkLCBzbyBhIHJlbmFtZSBvciBhIG1vdmUgd291bGRcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHNsYW0gc2h1dCBldmVyeSBmb2xkZXIgc29tZWJvZHkgaGFkIG9wZW5lZC4gS2V5cyBhcmUgc3RhYmxlXG4gICAgICAgIC8vIGFjcm9zcyBsb2FkcyAoJ2Y6MTInKSwgc28gd2hhdCB3YXMgb3BlbiBpcyByZW9wZW5lZCBieSBrZXkg4oCUIGFuZCBhXG4gICAgICAgIC8vIGZvbGRlciB0aGF0IG5vIGxvbmdlciBjb21lcyBiYWNrIHNpbXBseSBpcyBub3QuXG4gICAgICAgIGNvbnN0IGV4cGFuZGVkS2V5cyA9IHRoaXMuX2V4cGFuZGVkS2V5cygpO1xuICAgICAgICB0cmVlLnNldERhdGEobm9kZXMpO1xuICAgICAgICB0aGlzLl9leHBhbmRLZXlzKGV4cGFuZGVkS2V5cyk7XG5cbiAgICAgICAgY29uc3Qga2V5d29yZCA9IFN0cmluZyh0aGlzLl9xdWVyeS5rZXl3b3JkID8/ICcnKTtcbiAgICAgICAgaWYgKGtleXdvcmQpIHtcbiAgICAgICAgICB0cmVlLnNlYXJjaChrZXl3b3JkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBUaGUga2V5cyBvZiBldmVyeSBvcGVuIGZvbGRlciwgd2Fsa2VkIHRocm91Z2ggdGhlIHRyZWUncyBwdWJsaWMgbm9kZSBBUEkuXG4gIHByaXZhdGUgX2V4cGFuZGVkS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdHJlZSA9IHRoaXMuX3RyZWUoKTtcbiAgICBpZiAoIXRyZWUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB3YWxrID0gKHBhcmVudDogRmxhdEl0ZW1Ob2RlKTogc3RyaW5nW10gPT4gdHJlZS5nZXROb2RlcyhwYXJlbnQpXG4gICAgICAuZmlsdGVyKChub2RlOiBGbGF0SXRlbU5vZGUpID0+IG5vZGUuaXNFeHBhbmRlZCgpKVxuICAgICAgLmZsYXRNYXAoKG5vZGU6IEZsYXRJdGVtTm9kZSkgPT4gW25vZGUuZGF0YT8ua2V5LCAuLi53YWxrKG5vZGUpXSk7XG5cbiAgICByZXR1cm4gd2FsayhudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2V4cGFuZEtleXMoa2V5czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5fdHJlZSgpO1xuICAgIGlmICghdHJlZSB8fCAha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuID0gbmV3IFNldChrZXlzKTtcbiAgICBjb25zdCB3YWxrID0gKHBhcmVudDogRmxhdEl0ZW1Ob2RlKTogdm9pZCA9PiB7XG4gICAgICB0cmVlLmdldE5vZGVzKHBhcmVudClcbiAgICAgICAgLmZpbHRlcigobm9kZTogRmxhdEl0ZW1Ob2RlKSA9PiBvcGVuLmhhcyhub2RlLmRhdGE/LmtleSkpXG4gICAgICAgIC5mb3JFYWNoKChub2RlOiBGbGF0SXRlbU5vZGUpID0+IHtcbiAgICAgICAgICBub2RlLmV4cGFuZCgpO1xuICAgICAgICAgIHdhbGsobm9kZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3YWxrKG51bGwpO1xuICB9XG5cbiAgLy8gRmxhdCBBUEkgcm93cyDihpIgdGhlIG5lc3RlZCBzaGFwZSBmcy10cmVlIHJlbmRlcnMuIEZvbGRlcnMgY29tZSBiZWZvcmVcbiAgLy8gcmVwb3J0cyBhdCBldmVyeSBsZXZlbCwgZWFjaCBhbHJlYWR5IG5hbWUtb3JkZXJlZCBieSB0aGUgYmFja2VuZC5cbiAgLy9cbiAgLy8gYGRlbGV0ZWRgIGlzIGluaGVyaXRlZCBkb3dud2FyZDogYSBkZWxldGVkIGZvbGRlciBoaWRlcyBldmVyeXRoaW5nIGJlbG93IGl0XG4gIC8vIHdpdGhvdXQgdGhlIHJvd3MgYmVsb3cgYmVpbmcgZGVsZXRlZCB0aGVtc2VsdmVzLCBhbmQgdGhhdCBpcyBvbmx5IHZpc2libGVcbiAgLy8gZnJvbSBoZXJlLCB3aGVyZSB0aGUgcGFyZW50IGlzIGluIGhhbmQuIFRoZSBiYWNrZW5kIGFwcGxpZXMgdGhlIHNhbWUgcnVsZVxuICAvLyB3aGVuIGl0IGZpbHRlcnMgKFJlcG9ydEZvbGRlck1vZGVsOjpnZXREZWxldGVkRm9sZGVySWRzKCkpLlxuICBwcml2YXRlIF9idWlsZE5vZGVzKHJlcG9ydFRyZWU6IFJlcG9ydFRyZWUpOiBSZXBvcnROb2RlW10ge1xuICAgIGNvbnN0IGZvbGRlcnMgPSByZXBvcnRUcmVlPy5mb2xkZXJzID8/IFtdO1xuICAgIGNvbnN0IHJlcG9ydHMgPSByZXBvcnRUcmVlPy5yZXBvcnRzID8/IFtdO1xuXG4gICAgY29uc3QgYnVpbGQgPSAocGFyZW50SWQ6IG51bWJlciB8IG51bGwsIHBhcmVudERlbGV0ZWQ6IGJvb2xlYW4pOiBSZXBvcnROb2RlW10gPT4ge1xuICAgICAgY29uc3QgZm9sZGVyTm9kZXM6IFJlcG9ydE5vZGVbXSA9IGZvbGRlcnNcbiAgICAgICAgLmZpbHRlcigoZm9sZGVyOiBSZXBvcnRGb2xkZXIpID0+IChmb2xkZXIucGFyZW50UmVwb3J0Rm9sZGVySWQgPz8gbnVsbCkgPT09IHBhcmVudElkKVxuICAgICAgICAubWFwKChmb2xkZXI6IFJlcG9ydEZvbGRlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGVsZXRlZCA9IGZvbGRlci5zdGF0ZSA9PT0gUmVwb3J0U3RhdGUuRGVsZXRlZDtcbiAgICAgICAgICBjb25zdCBkZWxldGVkID0gcGFyZW50RGVsZXRlZCB8fCBzdGF0ZURlbGV0ZWQ7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiBgZjoke2ZvbGRlci5pZH1gLFxuICAgICAgICAgICAgaWQ6IGZvbGRlci5pZCxcbiAgICAgICAgICAgIG5hbWU6IGZvbGRlci5uYW1lLFxuICAgICAgICAgICAgdHlwZTogUmVwb3J0Tm9kZVR5cGUuRm9sZGVyLFxuICAgICAgICAgICAgY2hpbGRyZW46IGJ1aWxkKGZvbGRlci5pZCwgZGVsZXRlZCksXG4gICAgICAgICAgICBzdGF0ZURlbGV0ZWQsXG4gICAgICAgICAgICBkZWxldGVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXBvcnROb2RlczogUmVwb3J0Tm9kZVtdID0gcmVwb3J0c1xuICAgICAgICAuZmlsdGVyKChyZXBvcnQ6IFJlcG9ydExpc3RJdGVtKSA9PiAocmVwb3J0LnJlcG9ydEZvbGRlcklkID8/IG51bGwpID09PSBwYXJlbnRJZClcbiAgICAgICAgLm1hcCgocmVwb3J0OiBSZXBvcnRMaXN0SXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlRGVsZXRlZCA9IHJlcG9ydC5zdGF0ZSA9PT0gUmVwb3J0U3RhdGUuRGVsZXRlZDtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IGByOiR7cmVwb3J0LmlkfWAsXG4gICAgICAgICAgICBpZDogcmVwb3J0LmlkLFxuICAgICAgICAgICAgbmFtZTogcmVwb3J0Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBSZXBvcnROb2RlVHlwZS5SZXBvcnQsXG4gICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICByZXBvcnQsXG4gICAgICAgICAgICBzdGF0ZURlbGV0ZWQsXG4gICAgICAgICAgICBkZWxldGVkOiBwYXJlbnREZWxldGVkIHx8IHN0YXRlRGVsZXRlZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIFsuLi5mb2xkZXJOb2RlcywgLi4ucmVwb3J0Tm9kZXNdO1xuICAgIH07XG5cbiAgICByZXR1cm4gYnVpbGQobnVsbCwgZmFsc2UpO1xuICB9XG5cbiAgLy8gQSBkcm9wIG1vdmVkIGEgbm9kZSB1bmRlciBhIG5ldyBwYXJlbnQsIG9yIG91dCB0byB0aGUgcm9vdC4gVGhlIHRyZWUgaGFzXG4gIC8vIGFscmVhZHkgbW92ZWQgaXQgb24gc2NyZWVuLCBzbyBib3RoIG91dGNvbWVzIHJlbG9hZDogYSBzdWNjZXNzIHRvIHBpY2sgdXBcbiAgLy8gdGhlIHNlcnZlcidzIG9yZGVyaW5nLCBhIGZhaWx1cmUgdG8gcHV0IHRoZSByb3cgYmFjayB3aGVyZSBpdCByZWFsbHkgaXMuXG4gIHByaXZhdGUgX21vdmUoZXZlbnQ6IElUcmVlQ2hhbmdlUmVvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IG5vZGU6IFJlcG9ydE5vZGUgPSBldmVudC5ub2RlPy5kYXRhO1xuICAgIGlmICghbm9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudFJlcG9ydEZvbGRlcklkOiBudW1iZXIgPSBldmVudC50b1BhcmVudD8uZGF0YT8uaWQgPz8gbnVsbDtcblxuICAgIGlmIChldmVudC50b1BhcmVudCAmJiAhZXZlbnQudG9QYXJlbnQuaXNFeHBhbmRlZCgpKSB7XG4gICAgICBldmVudC50b1BhcmVudC5leHBhbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlJDogT2JzZXJ2YWJsZTx1bmtub3duPiA9IG5vZGUudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyXG4gICAgICA/IHRoaXMuX3JlcG9ydERhdGEudXBkYXRlRm9sZGVyKG5vZGUuaWQsIHsgcGFyZW50UmVwb3J0Rm9sZGVySWQgfSlcbiAgICAgIDogdGhpcy5fcmVwb3J0RGF0YS5tb3ZlUmVwb3J0KG5vZGUuaWQsIHBhcmVudFJlcG9ydEZvbGRlcklkKTtcblxuICAgIHNhdmUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIGNoYW5nZXMnKTtcbiAgICAgICAgICB0aGlzLl9sb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB0aGlzLl9sb2FkKCksXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUZvbGRlcihwYXJlbnRSZXBvcnRGb2xkZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvbXB0LmlucHV0KHtcbiAgICAgIHRpdGxlOiAnTmV3IEZvbGRlcicsXG4gICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgY29tbWl0TGFiZWw6ICdDcmVhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gdGhpcy5fcmVwb3J0RGF0YS5jcmVhdGVGb2xkZXIobmFtZSwgcGFyZW50UmVwb3J0Rm9sZGVySWQpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ3JlYXRlZCBmb2xkZXInKTtcbiAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5hbWUobm9kZTogRmxhdEl0ZW1Ob2RlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogUmVwb3J0Tm9kZSA9IG5vZGU/LmRhdGE7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGF0YS50eXBlID09PSBSZXBvcnROb2RlVHlwZS5Gb2xkZXI7XG5cbiAgICB0aGlzLl9wcm9tcHQuaW5wdXQoe1xuICAgICAgdGl0bGU6IGZvbGRlciA/ICdSZW5hbWUgRm9sZGVyJyA6ICdSZW5hbWUgUmVwb3J0JyxcbiAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICBkZWZhdWx0OiBkYXRhLm5hbWUsXG4gICAgICBjb21taXRMYWJlbDogJ1NhdmUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKG5hbWU6IHN0cmluZykgPT4gKGZvbGRlclxuICAgICAgICAgID8gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVGb2xkZXIoZGF0YS5pZCwgeyBuYW1lIH0pXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLnJlbmFtZShkYXRhLmlkLCBuYW1lKSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBjaGFuZ2VzJyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gQSBmb2xkZXIgZGVsZXRlcyB3aXRoIGV2ZXJ5dGhpbmcgaW4gaXQsIHNvIHRoZSBjb25maXJtIHNheXMgd2hhdCB0aGF0IGlzIOKAlFxuICAvLyBhbmQgdGhhdCBpdCBhbGwgY29tZXMgYmFjayBmcm9tIFNob3cgRGVsZXRlZCwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCBzYWZlIHRvXG4gIC8vIG9mZmVyLlxuICBwcml2YXRlIF9kZWxldGUobm9kZTogRmxhdEl0ZW1Ob2RlKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogUmVwb3J0Tm9kZSA9IG5vZGU/LmRhdGE7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGF0YS50eXBlID09PSBSZXBvcnROb2RlVHlwZS5Gb2xkZXI7XG5cbiAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICB0aXRsZTogJ0NvbmZpcm0nLFxuICAgICAgdGVtcGxhdGU6IGZvbGRlclxuICAgICAgICA/IHRoaXMuX2RlbGV0ZUZvbGRlck1lc3NhZ2UoZGF0YSlcbiAgICAgICAgOiAnQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGlzIHJlcG9ydD8nLFxuICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IChmb2xkZXJcbiAgICAgICAgICA/IHRoaXMuX3JlcG9ydERhdGEuZGVsZXRlRm9sZGVyKGRhdGEuaWQpXG4gICAgICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZShkYXRhLmlkKSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKGZvbGRlciA/ICdEZWxldGVkIGZvbGRlcicgOiAnRGVsZXRlZCByZXBvcnQnKTtcbiAgICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBDb3VudGVkIGZyb20gdGhlIG5vZGUgYWxyZWFkeSBvbiBzY3JlZW4sIGxpdmUgcm93cyBvbmx5OiBpbiBTaG93IERlbGV0ZWRcbiAgLy8gbW9kZSB0aGUgZm9sZGVyIGNhbiBhbHNvIGhvbGQgcm93cyB0aGF0IGFyZSBnb25lIGFscmVhZHksIGFuZCB0aG9zZSBhcmUgbm90XG4gIC8vIGxlYXZpbmcgd2l0aCBpdC5cbiAgcHJpdmF0ZSBfZGVsZXRlRm9sZGVyTWVzc2FnZShmb2xkZXI6IFJlcG9ydE5vZGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gKG5vZGU6IFJlcG9ydE5vZGUpOiB7IGZvbGRlcnM6IG51bWJlcjsgcmVwb3J0czogbnVtYmVyIH0gPT4gbm9kZS5jaGlsZHJlblxuICAgICAgLmZpbHRlcigoY2hpbGQpID0+ICFjaGlsZC5kZWxldGVkKVxuICAgICAgLnJlZHVjZSgodG90YWwsIGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGJlbG93ID0gY291bnQoY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9sZGVyczogdG90YWwuZm9sZGVycyArIGJlbG93LmZvbGRlcnMgKyAoY2hpbGQudHlwZSA9PT0gUmVwb3J0Tm9kZVR5cGUuRm9sZGVyID8gMSA6IDApLFxuICAgICAgICAgIHJlcG9ydHM6IHRvdGFsLnJlcG9ydHMgKyBiZWxvdy5yZXBvcnRzICsgKGNoaWxkLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLlJlcG9ydCA/IDEgOiAwKSxcbiAgICAgICAgfTtcbiAgICAgIH0sIHsgZm9sZGVyczogMCwgcmVwb3J0czogMCB9KTtcblxuICAgIGNvbnN0IHsgZm9sZGVycywgcmVwb3J0cyB9ID0gY291bnQoZm9sZGVyKTtcbiAgICBjb25zdCBjb250ZW50cyA9IFtcbiAgICAgIGZvbGRlcnMgPyBgJHtmb2xkZXJzfSAke2ZvbGRlcnMgPT09IDEgPyAnZm9sZGVyJyA6ICdmb2xkZXJzJ31gIDogJycsXG4gICAgICByZXBvcnRzID8gYCR7cmVwb3J0c30gJHtyZXBvcnRzID09PSAxID8gJ3JlcG9ydCcgOiAncmVwb3J0cyd9YCA6ICcnLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgY29uc3QgaW5zaWRlID0gY29udGVudHMubGVuZ3RoID8gYCBhbmQgdGhlICR7Y29udGVudHMuam9pbignIGFuZCAnKX0gaW5zaWRlIGl0YCA6ICcnO1xuXG4gICAgcmV0dXJuIGBBcmUgeW91IHN1cmUgeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlIHRoZSBmb2xkZXIgXCIke2ZvbGRlci5uYW1lfVwiJHtpbnNpZGV9PyBJdCBjYW4gYmUgcmVzdG9yZWQgZnJvbSBTaG93IERlbGV0ZWQuYDtcbiAgfVxuXG4gIC8vIEJvdGggZW5kcG9pbnRzIGFsc28gcmVzdG9yZSBhbnkgZGVsZXRlZCBmb2xkZXIgYWJvdmUgdGhlIHJvdywgc28gYSByb3cgdGhhdFxuICAvLyBpcyBsaXZlIGl0c2VsZiBidXQgaGlkZGVuIGJ5IGEgZGVsZXRlZCBmb2xkZXIgaXMgcmVzdG9yZWQgYnkgdGhlIHNhbWUgY2FsbC5cbiAgcHJpdmF0ZSBfcmVzdG9yZShub2RlOiBGbGF0SXRlbU5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhOiBSZXBvcnROb2RlID0gbm9kZT8uZGF0YTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkYXRhLnR5cGUgPT09IFJlcG9ydE5vZGVUeXBlLkZvbGRlcjtcblxuICAgIChmb2xkZXJcbiAgICAgID8gdGhpcy5fcmVwb3J0RGF0YS51bmRlbGV0ZUZvbGRlcihkYXRhLmlkKVxuICAgICAgOiB0aGlzLl9yZXBvcnREYXRhLnVuZGVsZXRlKGRhdGEuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoZm9sZGVyID8gJ1Jlc3RvcmVkIGZvbGRlcicgOiAnUmVzdG9yZWQgcmVwb3J0Jyk7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gVHVybiBhICc6aWQnIHBhdHRlcm4gaW50byByb3V0ZXIgY29tbWFuZHMuIFJlbGF0aXZlIHVubGVzcyBpdCBzdGFydHNcbiAgLy8gd2l0aCAnLycsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IHNlZ21lbnQgY2FycmllcyB0aGUgbGVhZGluZyBzbGFzaC5cbiAgcHJpdmF0ZSBfcGF0dGVybkNvbW1hbmRzKHBhdHRlcm46IHN0cmluZywgaWQ6IG51bWJlcik6IHVua25vd25bXSB7XG4gICAgY29uc3QgYWJzb2x1dGUgPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICBjb25zdCBzZWdtZW50czogdW5rbm93bltdID0gcGF0dGVybi5zcGxpdCgnLycpXG4gICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50Lmxlbmd0aCA+IDApXG4gICAgICAubWFwKChzZWdtZW50KSA9PiAoc2VnbWVudCA9PT0gJzppZCcgPyBpZCA6IHNlZ21lbnQpKTtcblxuICAgIGlmICghc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW2lkXTtcbiAgICB9XG5cbiAgICBpZiAoYWJzb2x1dGUpIHtcbiAgICAgIHNlZ21lbnRzWzBdID0gYC8ke3NlZ21lbnRzWzBdfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG59XG4iLCI8ZnMtZmlsdGVyIFtjb25maWddPVwiZmlsdGVyQ29uZmlnXCI+PC9mcy1maWx0ZXI+XG5cbjxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJub2RlcygpXCI+XG4gIDxmcy10cmVlIFtjb25maWddPVwidHJlZUNvbmZpZ1wiPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmc1RyZWVOb2RlXG4gICAgICAgIGxldC1kYXRhPVwiZGF0YVwiPlxuICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZnMtcm93LmdhcC1zbS5hbGlnbi1jZW50ZXIgbm9kZS1yb3dcIlxuICAgICAgICAgIFtjbGFzcy5kZWxldGVkXT1cImRhdGEuZGVsZXRlZFwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2RlLWljb25cIj5cbiAgICAgICAgICB7eyBkYXRhLnR5cGUgPT09IG5vZGVUeXBlLkZvbGRlciA/ICdmb2xkZXInIDogJ2luc2VydF9jaGFydF9vdXRsaW5lZCcgfX1cbiAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICBAaWYgKGRhdGEudHlwZSA9PT0gbm9kZVR5cGUuRm9sZGVyIHx8IGRhdGEuZGVsZXRlZCkge1xuICAgICAgICAgIDwhLS0gQSBkZWxldGVkIHJlcG9ydCBjYW4ndCBiZSBvcGVuZWQgKHRoZSBiYWNrZW5kIG9ubHkgYXNzZW1ibGVzXG4gICAgICAgICAgICAgICBsaXZlIG9uZXMsIGFuZCBvbmUgdW5kZXIgYSBkZWxldGVkIGZvbGRlciBpcyBub3Qgb24gdGhlIGxpdmVcbiAgICAgICAgICAgICAgIGxpc3RpbmcpLCBzbyBpbiBTaG93IERlbGV0ZWQgbW9kZSB0aGUgbmFtZSBpcyBwbGFpbiB0ZXh0IOKAlFxuICAgICAgICAgICAgICAgcmVzdG9yZSBpdCBmcm9tIHRoZSByb3cgbWVudSBmaXJzdC4gLS0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2RlLW5hbWVcIj57eyBkYXRhLm5hbWUgfX08L3NwYW4+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGNsYXNzPVwibm9kZS1uYW1lXCJcbiAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwib3BlbkxpbmsoZGF0YS5yZXBvcnQpXCI+XG4gICAgICAgICAgICB7eyBkYXRhLm5hbWUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE9ubHkgb24gdGhlIHJvdyBzb21lYm9keSBkZWxldGVkLiBFdmVyeXRoaW5nIHVuZGVyIGEgZGVsZXRlZFxuICAgICAgICAgICAgIGZvbGRlciBpcyBtdXRlZCB3aXRoIGl0LCBidXQgd2FzIG5vdCBkZWxldGVkIGl0c2VsZi4gLS0+XG4gICAgICAgIEBpZiAoZGF0YS5zdGF0ZURlbGV0ZWQpIHtcbiAgICAgICAgICA8ZnMtY2hpcCBzaXplPVwidGlueVwiPkRlbGV0ZWQ8L2ZzLWNoaXA+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtdHJlZT5cblxuICBAaWYgKCFub2RlcygpLmxlbmd0aCkge1xuICAgIDxwIGNsYXNzPVwic21hbGwgdHJlZS1lbXB0eVwiPlxuICAgICAgTm8gcmVwb3J0cyB5ZXQuIENyZWF0ZSBvbmUsIG9yIGFkZCBhIGZvbGRlciB0byBncm91cCB0aGVtLlxuICAgIDwvcD5cbiAgfVxuPC9uZy1jb250YWluZXI+XG4iXX0=
|