@plumile/router 0.1.12 → 0.1.14
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 +426 -13
- package/lib/esm/index.d.ts +4 -0
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +5 -1
- package/lib/esm/routing/createRouter.d.ts +1 -0
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +447 -360
- package/lib/esm/routing/devtools.d.ts +21 -0
- package/lib/esm/routing/devtools.d.ts.map +1 -0
- package/lib/esm/routing/devtools.js +690 -0
- package/lib/esm/routing/filters.d.ts +97 -0
- package/lib/esm/routing/filters.d.ts.map +1 -0
- package/lib/esm/routing/filters.js +557 -0
- package/lib/esm/routing/index.d.ts +6 -0
- package/lib/esm/routing/index.d.ts.map +1 -1
- package/lib/esm/routing/index.js +7 -1
- package/lib/esm/routing/useActiveFilters.d.ts +9 -0
- package/lib/esm/routing/useActiveFilters.d.ts.map +1 -0
- package/lib/esm/routing/useActiveFilters.js +38 -0
- package/lib/esm/routing/useFilterState.d.ts +10 -0
- package/lib/esm/routing/useFilterState.d.ts.map +1 -0
- package/lib/esm/routing/useFilterState.js +14 -0
- package/lib/esm/routing/useNavigate.d.ts +7 -0
- package/lib/esm/routing/useNavigate.d.ts.map +1 -1
- package/lib/esm/routing/useNavigate.js +1 -1
- package/lib/esm/routing/useNavigateWithQuery.d.ts +15 -0
- package/lib/esm/routing/useNavigateWithQuery.d.ts.map +1 -0
- package/lib/esm/routing/useNavigateWithQuery.js +95 -0
- package/lib/esm/routing/useQueryObject.d.ts +18 -0
- package/lib/esm/routing/useQueryObject.d.ts.map +1 -0
- package/lib/esm/routing/useQueryObject.js +107 -0
- package/lib/esm/routing/useStableRefEquality.d.ts +5 -0
- package/lib/esm/routing/useStableRefEquality.d.ts.map +1 -0
- package/lib/esm/routing/useStableRefEquality.js +47 -0
- package/lib/esm/tools/buildSearch.d.ts +8 -2
- package/lib/esm/tools/buildSearch.d.ts.map +1 -1
- package/lib/esm/tools/buildSearch.js +216 -12
- package/lib/esm/types.d.ts +19 -0
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/index.d.ts +4 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts +1 -0
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/routing/devtools.d.ts +21 -0
- package/lib/types/routing/devtools.d.ts.map +1 -0
- package/lib/types/routing/filters.d.ts +97 -0
- package/lib/types/routing/filters.d.ts.map +1 -0
- package/lib/types/routing/index.d.ts +6 -0
- package/lib/types/routing/index.d.ts.map +1 -1
- package/lib/types/routing/useActiveFilters.d.ts +9 -0
- package/lib/types/routing/useActiveFilters.d.ts.map +1 -0
- package/lib/types/routing/useFilterState.d.ts +10 -0
- package/lib/types/routing/useFilterState.d.ts.map +1 -0
- package/lib/types/routing/useNavigate.d.ts +7 -0
- package/lib/types/routing/useNavigate.d.ts.map +1 -1
- package/lib/types/routing/useNavigateWithQuery.d.ts +15 -0
- package/lib/types/routing/useNavigateWithQuery.d.ts.map +1 -0
- package/lib/types/routing/useQueryObject.d.ts +18 -0
- package/lib/types/routing/useQueryObject.d.ts.map +1 -0
- package/lib/types/routing/useStableRefEquality.d.ts +5 -0
- package/lib/types/routing/useStableRefEquality.d.ts.map +1 -0
- package/lib/types/tools/buildSearch.d.ts +8 -2
- package/lib/types/tools/buildSearch.d.ts.map +1 -1
- package/lib/types/types.d.ts +19 -0
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -8,6 +8,7 @@ export default function createRouter(routes, opts = {}) {
|
|
|
8
8
|
let devtoolsGlobal;
|
|
9
9
|
let devtoolsPanel = false;
|
|
10
10
|
let devtoolsShortcut = 'Alt+Shift+R';
|
|
11
|
+
let devtoolsVerbose = false;
|
|
11
12
|
if (typeof opts.devtools === 'object') {
|
|
12
13
|
const baseEnabled = (() => {
|
|
13
14
|
try {
|
|
@@ -24,6 +25,14 @@ export default function createRouter(routes, opts = {}) {
|
|
|
24
25
|
opts.devtools.shortcut.trim() !== '') {
|
|
25
26
|
devtoolsShortcut = opts.devtools.shortcut;
|
|
26
27
|
}
|
|
28
|
+
try {
|
|
29
|
+
const maybeVerbose = opts.devtools
|
|
30
|
+
.verbose;
|
|
31
|
+
if (typeof maybeVerbose === 'boolean')
|
|
32
|
+
devtoolsVerbose = maybeVerbose;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
}
|
|
27
36
|
}
|
|
28
37
|
else {
|
|
29
38
|
const enabled = (() => {
|
|
@@ -46,11 +55,16 @@ export default function createRouter(routes, opts = {}) {
|
|
|
46
55
|
let initialSchema;
|
|
47
56
|
if (route != null) {
|
|
48
57
|
const collected = [];
|
|
58
|
+
const collectedFilters = [];
|
|
49
59
|
for (const r of route.route.routes) {
|
|
50
60
|
const maybe = r.query;
|
|
51
61
|
if (maybe != null) {
|
|
52
62
|
collected.push(maybe);
|
|
53
63
|
}
|
|
64
|
+
const maybeFilter = r.filterSchema;
|
|
65
|
+
if (maybeFilter != null) {
|
|
66
|
+
collectedFilters.push(maybeFilter);
|
|
67
|
+
}
|
|
54
68
|
}
|
|
55
69
|
if (collected.length > 0) {
|
|
56
70
|
initialSchema = collected.at(-1);
|
|
@@ -103,11 +117,16 @@ export default function createRouter(routes, opts = {}) {
|
|
|
103
117
|
let schema;
|
|
104
118
|
if (nextRoute != null) {
|
|
105
119
|
const collected = [];
|
|
120
|
+
const collectedFilters = [];
|
|
106
121
|
for (const r of nextRoute.route.routes) {
|
|
107
122
|
const maybe = r.query;
|
|
108
123
|
if (maybe != null) {
|
|
109
124
|
collected.push(maybe);
|
|
110
125
|
}
|
|
126
|
+
const maybeFilter = r.filterSchema;
|
|
127
|
+
if (maybeFilter != null) {
|
|
128
|
+
collectedFilters.push(maybeFilter);
|
|
129
|
+
}
|
|
111
130
|
}
|
|
112
131
|
if (collected.length > 0) {
|
|
113
132
|
schema = collected.at(-1);
|
|
@@ -152,23 +171,292 @@ export default function createRouter(routes, opts = {}) {
|
|
|
152
171
|
callback(nextEntry);
|
|
153
172
|
});
|
|
154
173
|
});
|
|
174
|
+
let pendingNavs;
|
|
175
|
+
let flushScheduled = false;
|
|
176
|
+
let batchedMergedQuery;
|
|
177
|
+
let lastBatchQuery;
|
|
178
|
+
let batchedFilters;
|
|
179
|
+
let batchedFilterSchema;
|
|
180
|
+
let devtoolsOnNavEvent;
|
|
181
|
+
let batchMode;
|
|
182
|
+
function collectRouteChain(pathname) {
|
|
183
|
+
if (pathname === currentEntry.location.pathname) {
|
|
184
|
+
if (currentEntry.route != null) {
|
|
185
|
+
return currentEntry.route.route.routes;
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
const destRoute = getMatchedRoute(flatRoutes, {
|
|
190
|
+
...window.location,
|
|
191
|
+
pathname,
|
|
192
|
+
});
|
|
193
|
+
if (destRoute != null)
|
|
194
|
+
return destRoute.route.routes;
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
function mergeQuerySchemaFromChain(chain) {
|
|
198
|
+
if (chain == null)
|
|
199
|
+
return undefined;
|
|
200
|
+
const merged = {};
|
|
201
|
+
for (const node of chain) {
|
|
202
|
+
const qobj = node.query;
|
|
203
|
+
if (qobj != null) {
|
|
204
|
+
for (const [k, v] of Object.entries(qobj)) {
|
|
205
|
+
merged[k] = v;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (Object.keys(merged).length === 0)
|
|
210
|
+
return undefined;
|
|
211
|
+
return merged;
|
|
212
|
+
}
|
|
213
|
+
function mergeFilterSchemaFromChain(chain) {
|
|
214
|
+
if (chain == null)
|
|
215
|
+
return undefined;
|
|
216
|
+
let merged;
|
|
217
|
+
for (const node of chain) {
|
|
218
|
+
const fs = node.filterSchema;
|
|
219
|
+
if (fs != null) {
|
|
220
|
+
merged ??= {};
|
|
221
|
+
Object.assign(merged, fs.schema);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (merged != null)
|
|
225
|
+
return { __defined: true, schema: merged };
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
function resolveSchema(pathname) {
|
|
229
|
+
return mergeQuerySchemaFromChain(collectRouteChain(pathname));
|
|
230
|
+
}
|
|
231
|
+
function resolveFilterSchema(pathname) {
|
|
232
|
+
return mergeFilterSchemaFromChain(collectRouteChain(pathname));
|
|
233
|
+
}
|
|
234
|
+
function coalesceNavigations(list) {
|
|
235
|
+
let targetPathname = currentEntry.location.pathname;
|
|
236
|
+
if (targetPathname === '') {
|
|
237
|
+
targetPathname = '/';
|
|
238
|
+
}
|
|
239
|
+
for (const nav of list) {
|
|
240
|
+
if (nav.pathname !== undefined) {
|
|
241
|
+
const pn = nav.pathname;
|
|
242
|
+
if (pn === '') {
|
|
243
|
+
targetPathname = '/';
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
targetPathname = pn;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let replaceFlag;
|
|
251
|
+
for (const nav of list) {
|
|
252
|
+
if (nav.replace !== undefined) {
|
|
253
|
+
replaceFlag = nav.replace;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
let baseQuery = currentEntry.typedQuery ?? currentEntry.query ?? {};
|
|
257
|
+
if (batchedMergedQuery != null) {
|
|
258
|
+
baseQuery = batchedMergedQuery;
|
|
259
|
+
}
|
|
260
|
+
else if (lastBatchQuery != null) {
|
|
261
|
+
baseQuery = lastBatchQuery;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
for (let i = list.length - 1; i >= 0; i -= 1) {
|
|
265
|
+
const item = list[i];
|
|
266
|
+
if (item != null) {
|
|
267
|
+
const q = item.query;
|
|
268
|
+
if (q != null && Object.keys(q).length > 0) {
|
|
269
|
+
baseQuery = q;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const batchFilters = batchedFilters;
|
|
276
|
+
const batchFilterSchema = batchedFilterSchema;
|
|
277
|
+
const schema = resolveSchema(targetPathname);
|
|
278
|
+
let buildOpts;
|
|
279
|
+
if (batchFilters !== undefined) {
|
|
280
|
+
const fs = batchFilterSchema ?? resolveFilterSchema(targetPathname);
|
|
281
|
+
if (fs != null) {
|
|
282
|
+
buildOpts = { filters: batchFilters, filterSchema: fs };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const search = buildSearch(baseQuery, schema, buildOpts);
|
|
286
|
+
let normalizedPath = targetPathname;
|
|
287
|
+
if (normalizedPath === '') {
|
|
288
|
+
normalizedPath = '/';
|
|
289
|
+
}
|
|
290
|
+
let nextRoute = currentEntry.route;
|
|
291
|
+
if (normalizedPath !== currentEntry.location.pathname) {
|
|
292
|
+
nextRoute = getMatchedRoute(flatRoutes, {
|
|
293
|
+
...window.location,
|
|
294
|
+
pathname: normalizedPath,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
const effectiveSchema = schema ?? resolveSchema(normalizedPath);
|
|
298
|
+
const rawQueryObj = parseRawQuery(search);
|
|
299
|
+
const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
|
|
300
|
+
const prepared = prepareMatch(nextRoute, typed);
|
|
301
|
+
const nextEntry = {
|
|
302
|
+
forceRerender: false,
|
|
303
|
+
location: { ...currentEntry.location, pathname: normalizedPath, search },
|
|
304
|
+
route: nextRoute,
|
|
305
|
+
preparedMatch: prepared,
|
|
306
|
+
rawSearch: search,
|
|
307
|
+
query: rawQueryObj,
|
|
308
|
+
typedQuery: typed,
|
|
309
|
+
};
|
|
310
|
+
return {
|
|
311
|
+
search,
|
|
312
|
+
pathname: normalizedPath,
|
|
313
|
+
replace: replaceFlag,
|
|
314
|
+
nextEntry,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function flushNavigations() {
|
|
318
|
+
flushScheduled = false;
|
|
319
|
+
const list = pendingNavs;
|
|
320
|
+
pendingNavs = undefined;
|
|
321
|
+
if (list == null || list.length === 0) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const prevPath = currentEntry.location.pathname;
|
|
325
|
+
const prevSearch = currentEntry.rawSearch;
|
|
326
|
+
const { search, pathname, replace: replaceFlag, nextEntry, } = coalesceNavigations(list);
|
|
327
|
+
batchedMergedQuery = undefined;
|
|
328
|
+
lastBatchQuery = undefined;
|
|
329
|
+
batchedFilters = undefined;
|
|
330
|
+
batchedFilterSchema = undefined;
|
|
331
|
+
currentEntry = nextEntry;
|
|
332
|
+
const loc = { pathname, search, hash: '' };
|
|
333
|
+
const sameAsBefore = prevPath === pathname && prevSearch === search;
|
|
334
|
+
if (sameAsBefore && devtoolsVerbose) {
|
|
335
|
+
subscribers.forEach((cb) => {
|
|
336
|
+
cb(currentEntry);
|
|
337
|
+
});
|
|
338
|
+
devtoolsOnNavEvent?.({
|
|
339
|
+
kind: 'batch-flush',
|
|
340
|
+
mode: batchMode ?? 'manual',
|
|
341
|
+
count: list.length,
|
|
342
|
+
pathname,
|
|
343
|
+
search,
|
|
344
|
+
timestamp: Date.now(),
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
if (replaceFlag)
|
|
349
|
+
history.set(loc);
|
|
350
|
+
else
|
|
351
|
+
history.push(loc);
|
|
352
|
+
}
|
|
353
|
+
let mode = 'manual';
|
|
354
|
+
if (batchMode === 'auto') {
|
|
355
|
+
mode = 'auto';
|
|
356
|
+
}
|
|
357
|
+
else if (batchMode === 'mixed') {
|
|
358
|
+
mode = 'mixed';
|
|
359
|
+
}
|
|
360
|
+
if (!(sameAsBefore && devtoolsVerbose)) {
|
|
361
|
+
devtoolsOnNavEvent?.({
|
|
362
|
+
kind: 'batch-flush',
|
|
363
|
+
mode,
|
|
364
|
+
count: list.length,
|
|
365
|
+
pathname,
|
|
366
|
+
search,
|
|
367
|
+
timestamp: Date.now(),
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
batchMode = undefined;
|
|
371
|
+
}
|
|
372
|
+
function applyProvisionalBatchUpdate(pathname) {
|
|
373
|
+
try {
|
|
374
|
+
const basePath = pathname ?? currentEntry.location.pathname;
|
|
375
|
+
const schema = resolveSchema(basePath);
|
|
376
|
+
const mergedQ = batchedMergedQuery ?? lastBatchQuery ?? {};
|
|
377
|
+
let buildOpts;
|
|
378
|
+
if (batchedFilters != null && batchedFilterSchema != null) {
|
|
379
|
+
buildOpts = {
|
|
380
|
+
filters: batchedFilters,
|
|
381
|
+
filterSchema: batchedFilterSchema,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
else if (batchedFilters != null && batchedFilterSchema == null) {
|
|
385
|
+
let merged;
|
|
386
|
+
let routeChain;
|
|
387
|
+
if (basePath === currentEntry.location.pathname) {
|
|
388
|
+
if (currentEntry.route != null) {
|
|
389
|
+
routeChain = currentEntry.route.route.routes;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
const destRoute = getMatchedRoute(flatRoutes, {
|
|
394
|
+
...window.location,
|
|
395
|
+
pathname: basePath,
|
|
396
|
+
});
|
|
397
|
+
if (destRoute != null) {
|
|
398
|
+
routeChain = destRoute.route.routes;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (routeChain != null) {
|
|
402
|
+
for (const node of routeChain) {
|
|
403
|
+
const fs = node.filterSchema;
|
|
404
|
+
if (fs != null) {
|
|
405
|
+
merged ??= {};
|
|
406
|
+
Object.assign(merged, fs.schema);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (merged != null) {
|
|
411
|
+
buildOpts = {
|
|
412
|
+
filters: batchedFilters,
|
|
413
|
+
filterSchema: { __defined: true, schema: merged },
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
const provisionalSearch = buildSearch(mergedQ, schema, buildOpts);
|
|
418
|
+
const pathChanged = basePath !== currentEntry.location.pathname;
|
|
419
|
+
if (provisionalSearch !== currentEntry.rawSearch || pathChanged) {
|
|
420
|
+
const typed = parseTypedQuery(schema, mergedQ);
|
|
421
|
+
const rawQueryObj = parseRawQuery(provisionalSearch);
|
|
422
|
+
currentEntry = {
|
|
423
|
+
...currentEntry,
|
|
424
|
+
location: {
|
|
425
|
+
...currentEntry.location,
|
|
426
|
+
pathname: basePath,
|
|
427
|
+
search: provisionalSearch,
|
|
428
|
+
},
|
|
429
|
+
rawSearch: provisionalSearch,
|
|
430
|
+
query: rawQueryObj,
|
|
431
|
+
typedQuery: typed,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
catch {
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const autoBatch = opts.autoBatch === true;
|
|
155
439
|
const context = {
|
|
156
440
|
history,
|
|
157
441
|
get() {
|
|
158
442
|
return currentEntry;
|
|
159
443
|
},
|
|
444
|
+
resolveFilterSchema(pathname) {
|
|
445
|
+
return resolveFilterSchema(pathname);
|
|
446
|
+
},
|
|
447
|
+
currentMergedFilterSchema() {
|
|
448
|
+
return resolveFilterSchema(currentEntry.location.pathname);
|
|
449
|
+
},
|
|
160
450
|
preloadCode(pathname) {
|
|
161
451
|
const matches = getMatchedRoute(flatRoutes, {
|
|
162
452
|
...window.location,
|
|
163
453
|
pathname,
|
|
164
454
|
});
|
|
165
|
-
if (matches == null)
|
|
455
|
+
if (matches == null)
|
|
166
456
|
return;
|
|
167
|
-
}
|
|
168
457
|
matches.route.routes.forEach(({ resourcePage }) => {
|
|
169
|
-
if (resourcePage == null)
|
|
458
|
+
if (resourcePage == null)
|
|
170
459
|
return;
|
|
171
|
-
}
|
|
172
460
|
resourcePage.load();
|
|
173
461
|
});
|
|
174
462
|
},
|
|
@@ -182,377 +470,176 @@ export default function createRouter(routes, opts = {}) {
|
|
|
182
470
|
subscribe(callback) {
|
|
183
471
|
nextId += 1;
|
|
184
472
|
const id = nextId;
|
|
185
|
-
|
|
473
|
+
function dispose() {
|
|
186
474
|
subscribers.delete(id);
|
|
187
|
-
}
|
|
475
|
+
}
|
|
188
476
|
subscribers.set(id, callback);
|
|
189
477
|
return dispose;
|
|
190
478
|
},
|
|
191
|
-
navigate({ pathname, query, replace, }) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
if (
|
|
479
|
+
navigate({ pathname, query, replace, filters, filterSchema, batch, immediate, inherit, }) {
|
|
480
|
+
try {
|
|
481
|
+
const effectiveInherit = inherit === true;
|
|
482
|
+
const wantsBatch = batch === true ||
|
|
483
|
+
(autoBatch && immediate !== true && batch !== false);
|
|
484
|
+
if (wantsBatch) {
|
|
485
|
+
const nav = {};
|
|
486
|
+
if (pathname !== undefined)
|
|
487
|
+
nav.pathname = pathname;
|
|
488
|
+
if (query !== undefined)
|
|
489
|
+
nav.query = query;
|
|
490
|
+
if (replace !== undefined)
|
|
491
|
+
nav.replace = replace;
|
|
492
|
+
if (filters !== undefined)
|
|
493
|
+
nav.filters = filters;
|
|
494
|
+
if (filterSchema !== undefined)
|
|
495
|
+
nav.filterSchema = filterSchema;
|
|
496
|
+
if (effectiveInherit)
|
|
497
|
+
nav.inherit = true;
|
|
498
|
+
pendingNavs ??= [];
|
|
499
|
+
pendingNavs.push(nav);
|
|
500
|
+
let thisMode;
|
|
501
|
+
if (batch === true)
|
|
502
|
+
thisMode = 'manual';
|
|
503
|
+
else
|
|
504
|
+
thisMode = 'auto';
|
|
505
|
+
if (batchMode == null)
|
|
506
|
+
batchMode = thisMode;
|
|
507
|
+
else if (batchMode !== thisMode)
|
|
508
|
+
batchMode = 'mixed';
|
|
509
|
+
if (query != null) {
|
|
510
|
+
if (effectiveInherit) {
|
|
511
|
+
const base = batchedMergedQuery ??
|
|
512
|
+
lastBatchQuery ??
|
|
513
|
+
currentEntry.typedQuery ??
|
|
514
|
+
currentEntry.query ??
|
|
515
|
+
{};
|
|
516
|
+
batchedMergedQuery = { ...base, ...query };
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
batchedMergedQuery = { ...query };
|
|
520
|
+
}
|
|
521
|
+
lastBatchQuery = query;
|
|
522
|
+
}
|
|
523
|
+
if (filters != null) {
|
|
524
|
+
batchedFilters = filters;
|
|
525
|
+
if (filterSchema != null)
|
|
526
|
+
batchedFilterSchema = filterSchema;
|
|
527
|
+
}
|
|
528
|
+
if (!flushScheduled) {
|
|
529
|
+
flushScheduled = true;
|
|
530
|
+
Promise.resolve().then(flushNavigations);
|
|
531
|
+
}
|
|
532
|
+
applyProvisionalBatchUpdate(pathname);
|
|
533
|
+
subscribers.forEach((cb) => {
|
|
534
|
+
cb(currentEntry);
|
|
535
|
+
});
|
|
197
536
|
return;
|
|
198
537
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if (maybe != null) {
|
|
203
|
-
collected.push(maybe);
|
|
204
|
-
}
|
|
538
|
+
let base;
|
|
539
|
+
if (effectiveInherit) {
|
|
540
|
+
base = { ...(currentEntry.typedQuery ?? currentEntry.query ?? {}) };
|
|
205
541
|
}
|
|
206
|
-
if (
|
|
207
|
-
|
|
542
|
+
if (query != null) {
|
|
543
|
+
if (base != null)
|
|
544
|
+
Object.assign(base, query);
|
|
545
|
+
else
|
|
546
|
+
base = query;
|
|
208
547
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
});
|
|
218
|
-
collectSchema(destRoute?.route.routes);
|
|
219
|
-
}
|
|
220
|
-
const search = buildSearch(query, schema);
|
|
221
|
-
const locationObj = { pathname: targetPathname, search, hash: '' };
|
|
222
|
-
if (replace) {
|
|
223
|
-
history.set(locationObj);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
history.push(locationObj);
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
if (devtoolsGlobal) {
|
|
231
|
-
try {
|
|
232
|
-
if (typeof window !== 'undefined') {
|
|
233
|
-
window.__PLUMILE_ROUTER__ =
|
|
234
|
-
{
|
|
235
|
-
get: context.get,
|
|
236
|
-
subscribe: context.subscribe,
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
if (devtoolsPanel) {
|
|
244
|
-
try {
|
|
245
|
-
if (typeof window !== 'undefined' &&
|
|
246
|
-
typeof document !== 'undefined' &&
|
|
247
|
-
document.querySelector('[data-plumile-router-devtools-panel]') == null) {
|
|
248
|
-
const host = document.createElement('div');
|
|
249
|
-
host.setAttribute('data-plumile-router-devtools-panel', '');
|
|
250
|
-
host.style.position = 'fixed';
|
|
251
|
-
host.style.zIndex = '2147483646';
|
|
252
|
-
host.style.bottom = '8px';
|
|
253
|
-
host.style.right = '8px';
|
|
254
|
-
host.style.fontFamily =
|
|
255
|
-
'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';
|
|
256
|
-
host.style.fontSize = '12px';
|
|
257
|
-
host.style.lineHeight = '1.3';
|
|
258
|
-
host.style.color = '#111';
|
|
259
|
-
host.style.background = 'transparent';
|
|
260
|
-
host.style.pointerEvents = 'none';
|
|
261
|
-
const shadow = host.attachShadow({ mode: 'open' });
|
|
262
|
-
const panel = document.createElement('div');
|
|
263
|
-
panel.style.pointerEvents = 'auto';
|
|
264
|
-
panel.style.minWidth = '260px';
|
|
265
|
-
panel.style.maxWidth = '420px';
|
|
266
|
-
panel.style.maxHeight = '50vh';
|
|
267
|
-
panel.style.overflow = 'auto';
|
|
268
|
-
panel.style.background = 'rgba(255,255,255,0.95)';
|
|
269
|
-
panel.style.border = '1px solid #ccc';
|
|
270
|
-
panel.style.borderRadius = '6px';
|
|
271
|
-
panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
|
|
272
|
-
panel.style.padding = '6px 8px 8px';
|
|
273
|
-
panel.style.backdropFilter = 'blur(4px)';
|
|
274
|
-
panel.style.display = 'flex';
|
|
275
|
-
panel.style.flexDirection = 'column';
|
|
276
|
-
panel.style.rowGap = '4px';
|
|
277
|
-
const header = document.createElement('div');
|
|
278
|
-
header.style.display = 'flex';
|
|
279
|
-
header.style.alignItems = 'center';
|
|
280
|
-
header.style.justifyContent = 'space-between';
|
|
281
|
-
header.style.gap = '8px';
|
|
282
|
-
const title = document.createElement('span');
|
|
283
|
-
title.textContent = 'Plumile Router';
|
|
284
|
-
title.style.fontWeight = '600';
|
|
285
|
-
const buttons = document.createElement('div');
|
|
286
|
-
buttons.style.display = 'flex';
|
|
287
|
-
buttons.style.gap = '4px';
|
|
288
|
-
const collapseBtn = document.createElement('button');
|
|
289
|
-
collapseBtn.textContent = '−';
|
|
290
|
-
const closeBtn = document.createElement('button');
|
|
291
|
-
closeBtn.textContent = '×';
|
|
292
|
-
const btns = [collapseBtn, closeBtn];
|
|
293
|
-
for (const b of btns) {
|
|
294
|
-
b.style.cursor = 'pointer';
|
|
295
|
-
b.style.background = '#eee';
|
|
296
|
-
b.style.border = '1px solid #ccc';
|
|
297
|
-
b.style.borderRadius = '4px';
|
|
298
|
-
b.style.fontSize = '11px';
|
|
299
|
-
b.style.lineHeight = '1';
|
|
300
|
-
b.style.padding = '2px 5px';
|
|
548
|
+
base ??= currentEntry.typedQuery ?? currentEntry.query ?? {};
|
|
549
|
+
const targetPath = pathname ?? currentEntry.location.pathname;
|
|
550
|
+
const schema = resolveSchema(targetPath);
|
|
551
|
+
let buildOpts;
|
|
552
|
+
if (filters != null) {
|
|
553
|
+
const fs = filterSchema ?? resolveFilterSchema(targetPath);
|
|
554
|
+
if (fs != null)
|
|
555
|
+
buildOpts = { filters, filterSchema: fs };
|
|
301
556
|
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
timelineWrap.style.display = 'flex';
|
|
313
|
-
timelineWrap.style.flexDirection = 'column';
|
|
314
|
-
timelineWrap.style.gap = '2px';
|
|
315
|
-
timelineWrap.style.marginTop = '4px';
|
|
316
|
-
const timelineHeader = document.createElement('div');
|
|
317
|
-
timelineHeader.textContent = 'Timeline (query changes)';
|
|
318
|
-
timelineHeader.style.fontWeight = '600';
|
|
319
|
-
timelineHeader.style.fontSize = '11px';
|
|
320
|
-
const timeline = document.createElement('div');
|
|
321
|
-
timeline.style.display = 'flex';
|
|
322
|
-
timeline.style.flexDirection = 'column-reverse';
|
|
323
|
-
timeline.style.maxHeight = '140px';
|
|
324
|
-
timeline.style.overflowY = 'auto';
|
|
325
|
-
timeline.style.border = '1px solid #e2e2e2';
|
|
326
|
-
timeline.style.borderRadius = '4px';
|
|
327
|
-
timeline.style.background = '#fafbfc';
|
|
328
|
-
timeline.style.fontFamily = 'inherit';
|
|
329
|
-
timeline.style.fontSize = '11px';
|
|
330
|
-
timelineWrap.appendChild(timelineHeader);
|
|
331
|
-
timelineWrap.appendChild(timeline);
|
|
332
|
-
const pres = [varsEl, queryEl, typedEl];
|
|
333
|
-
for (const p of pres) {
|
|
334
|
-
p.style.margin = '0';
|
|
335
|
-
p.style.padding = '4px';
|
|
336
|
-
p.style.background = '#f6f8fa';
|
|
337
|
-
p.style.border = '1px solid #e2e2e2';
|
|
338
|
-
p.style.borderRadius = '4px';
|
|
339
|
-
p.style.overflowX = 'auto';
|
|
340
|
-
p.style.maxHeight = '160px';
|
|
557
|
+
const search = buildSearch(base, schema, buildOpts);
|
|
558
|
+
let targetPathname = targetPath;
|
|
559
|
+
if (targetPathname === '')
|
|
560
|
+
targetPathname = '/';
|
|
561
|
+
let nextRoute = currentEntry.route;
|
|
562
|
+
if (targetPathname !== currentEntry.location.pathname) {
|
|
563
|
+
nextRoute = getMatchedRoute(flatRoutes, {
|
|
564
|
+
...window.location,
|
|
565
|
+
pathname: targetPathname,
|
|
566
|
+
});
|
|
341
567
|
}
|
|
342
|
-
const
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
});
|
|
369
|
-
let unsub;
|
|
370
|
-
closeBtn.addEventListener('click', () => {
|
|
371
|
-
host.remove();
|
|
372
|
-
if (typeof unsub === 'function') {
|
|
373
|
-
unsub();
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
let lastQuery;
|
|
377
|
-
let lastSearch;
|
|
378
|
-
function diffQueries(prev, next) {
|
|
379
|
-
const added = [];
|
|
380
|
-
const removed = [];
|
|
381
|
-
const changed = [];
|
|
382
|
-
const unchanged = [];
|
|
383
|
-
const prevKeys = new Set(Object.keys(prev ?? {}));
|
|
384
|
-
const nextKeys = new Set(Object.keys(next));
|
|
385
|
-
nextKeys.forEach((k) => {
|
|
386
|
-
if (!prevKeys.has(k)) {
|
|
387
|
-
added.push(k);
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
let pv;
|
|
391
|
-
if (prev != null) {
|
|
392
|
-
pv = prev[k];
|
|
393
|
-
}
|
|
394
|
-
const nv = next[k];
|
|
395
|
-
let same = false;
|
|
396
|
-
if (Array.isArray(pv) && Array.isArray(nv)) {
|
|
397
|
-
if (pv.length === nv.length) {
|
|
398
|
-
same = pv.every((v, i) => {
|
|
399
|
-
return v === nv[i];
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
else {
|
|
404
|
-
same = pv === nv;
|
|
405
|
-
}
|
|
406
|
-
if (same) {
|
|
407
|
-
unchanged.push(k);
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
changed.push(k);
|
|
411
|
-
}
|
|
412
|
-
prevKeys.delete(k);
|
|
568
|
+
const effectiveSchema = schema ?? resolveSchema(targetPathname);
|
|
569
|
+
const rawQueryObj = parseRawQuery(search);
|
|
570
|
+
const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
|
|
571
|
+
const prepared = prepareMatch(nextRoute, typed);
|
|
572
|
+
currentEntry = {
|
|
573
|
+
forceRerender: false,
|
|
574
|
+
location: {
|
|
575
|
+
...currentEntry.location,
|
|
576
|
+
pathname: targetPathname,
|
|
577
|
+
search,
|
|
578
|
+
},
|
|
579
|
+
route: nextRoute,
|
|
580
|
+
preparedMatch: prepared,
|
|
581
|
+
rawSearch: search,
|
|
582
|
+
query: rawQueryObj,
|
|
583
|
+
typedQuery: typed,
|
|
584
|
+
};
|
|
585
|
+
let normImmediate = targetPathname;
|
|
586
|
+
if (normImmediate === '')
|
|
587
|
+
normImmediate = '/';
|
|
588
|
+
const locationObj = { pathname: normImmediate, search, hash: '' };
|
|
589
|
+
const sameAsBefore = currentEntry.location.pathname === normImmediate &&
|
|
590
|
+
currentEntry.rawSearch === search;
|
|
591
|
+
if (sameAsBefore && devtoolsVerbose && !replace) {
|
|
592
|
+
subscribers.forEach((cb) => {
|
|
593
|
+
cb(currentEntry);
|
|
413
594
|
});
|
|
414
|
-
|
|
415
|
-
|
|
595
|
+
devtoolsOnNavEvent?.({
|
|
596
|
+
kind: 'navigate',
|
|
597
|
+
mode: 'immediate',
|
|
598
|
+
count: 1,
|
|
599
|
+
pathname: normImmediate,
|
|
600
|
+
search,
|
|
601
|
+
timestamp: Date.now(),
|
|
416
602
|
});
|
|
417
|
-
return { added, removed, changed, unchanged };
|
|
418
603
|
}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
const row = document.createElement('div');
|
|
433
|
-
row.style.display = 'flex';
|
|
434
|
-
row.style.flexDirection = 'column';
|
|
435
|
-
row.style.borderBottom = '1px solid #e9e9e9';
|
|
436
|
-
row.style.padding = '3px 4px';
|
|
437
|
-
const head = document.createElement('div');
|
|
438
|
-
head.style.display = 'flex';
|
|
439
|
-
head.style.justifyContent = 'space-between';
|
|
440
|
-
const ts = new Date().toLocaleTimeString();
|
|
441
|
-
let searchDisplay = '(empty)';
|
|
442
|
-
if (entry.location.search !== '') {
|
|
443
|
-
searchDisplay = entry.location.search;
|
|
444
|
-
}
|
|
445
|
-
head.innerHTML = `<strong>${ts}</strong> <code style="background:#eee;padding:1px 3px;border-radius:3px;">${searchDisplay}</code>`;
|
|
446
|
-
const body = document.createElement('div');
|
|
447
|
-
body.style.display = 'flex';
|
|
448
|
-
body.style.flexWrap = 'wrap';
|
|
449
|
-
body.style.gap = '4px';
|
|
450
|
-
function pill(label, kind) {
|
|
451
|
-
const span = document.createElement('span');
|
|
452
|
-
span.textContent = label;
|
|
453
|
-
span.style.padding = '1px 4px';
|
|
454
|
-
span.style.borderRadius = '10px';
|
|
455
|
-
span.style.fontSize = '10px';
|
|
456
|
-
span.style.border = '1px solid';
|
|
457
|
-
switch (kind) {
|
|
458
|
-
case 'added':
|
|
459
|
-
span.style.background = '#e6ffed';
|
|
460
|
-
span.style.borderColor = '#2cbe4e';
|
|
461
|
-
span.style.color = '#22863a';
|
|
462
|
-
break;
|
|
463
|
-
case 'removed':
|
|
464
|
-
span.style.background = '#ffeef0';
|
|
465
|
-
span.style.borderColor = '#d73a49';
|
|
466
|
-
span.style.color = '#cb2431';
|
|
467
|
-
break;
|
|
468
|
-
case 'changed':
|
|
469
|
-
span.style.background = '#fff5b1';
|
|
470
|
-
span.style.borderColor = '#ffd33d';
|
|
471
|
-
span.style.color = '#735c0f';
|
|
472
|
-
break;
|
|
473
|
-
case 'unchanged':
|
|
474
|
-
span.style.background = '#f1f8ff';
|
|
475
|
-
span.style.borderColor = '#79b8ff';
|
|
476
|
-
span.style.color = '#0366d6';
|
|
477
|
-
break;
|
|
478
|
-
default:
|
|
479
|
-
break;
|
|
480
|
-
}
|
|
481
|
-
return span;
|
|
482
|
-
}
|
|
483
|
-
if (diff.added.length > 0) {
|
|
484
|
-
body.append(...diff.added.map((k) => {
|
|
485
|
-
return pill(`+${k}`, 'added');
|
|
486
|
-
}));
|
|
487
|
-
}
|
|
488
|
-
if (diff.changed.length > 0) {
|
|
489
|
-
body.append(...diff.changed.map((k) => {
|
|
490
|
-
return pill(`~${k}`, 'changed');
|
|
491
|
-
}));
|
|
492
|
-
}
|
|
493
|
-
if (diff.removed.length > 0) {
|
|
494
|
-
body.append(...diff.removed.map((k) => {
|
|
495
|
-
return pill(`-${k}`, 'removed');
|
|
496
|
-
}));
|
|
497
|
-
}
|
|
498
|
-
const noAdds = diff.added.length === 0;
|
|
499
|
-
const noChanges = diff.changed.length === 0;
|
|
500
|
-
const noRemovals = diff.removed.length === 0;
|
|
501
|
-
if (noAdds && noChanges && noRemovals) {
|
|
502
|
-
body.append(pill('no-change', 'unchanged'));
|
|
503
|
-
}
|
|
504
|
-
row.appendChild(head);
|
|
505
|
-
row.appendChild(body);
|
|
506
|
-
timeline.appendChild(row);
|
|
507
|
-
if (timeline.childElementCount > 50) {
|
|
508
|
-
const first = timeline.firstElementChild;
|
|
509
|
-
if (first != null) {
|
|
510
|
-
timeline.removeChild(first);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
lastQuery = nowQuery;
|
|
514
|
-
lastSearch = entry.rawSearch;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
catch {
|
|
518
|
-
}
|
|
604
|
+
else {
|
|
605
|
+
if (replace)
|
|
606
|
+
history.set(locationObj);
|
|
607
|
+
else
|
|
608
|
+
history.push(locationObj);
|
|
609
|
+
devtoolsOnNavEvent?.({
|
|
610
|
+
kind: 'navigate',
|
|
611
|
+
mode: 'immediate',
|
|
612
|
+
count: 1,
|
|
613
|
+
pathname: normImmediate,
|
|
614
|
+
search,
|
|
615
|
+
timestamp: Date.now(),
|
|
616
|
+
});
|
|
519
617
|
}
|
|
520
|
-
render();
|
|
521
|
-
unsub = context.subscribe(() => {
|
|
522
|
-
render();
|
|
523
|
-
});
|
|
524
|
-
window.addEventListener('keydown', (ev) => {
|
|
525
|
-
try {
|
|
526
|
-
const parts = [];
|
|
527
|
-
if (ev.altKey)
|
|
528
|
-
parts.push('Alt');
|
|
529
|
-
if (ev.shiftKey)
|
|
530
|
-
parts.push('Shift');
|
|
531
|
-
if (ev.ctrlKey)
|
|
532
|
-
parts.push('Ctrl');
|
|
533
|
-
let keyPart = ev.key;
|
|
534
|
-
if (ev.key.length === 1) {
|
|
535
|
-
keyPart = ev.key.toUpperCase();
|
|
536
|
-
}
|
|
537
|
-
parts.push(keyPart);
|
|
538
|
-
const combo = parts.join('+');
|
|
539
|
-
if (combo === devtoolsShortcut.replace(/\s+/g, '')) {
|
|
540
|
-
if (host.style.display === 'none') {
|
|
541
|
-
host.style.display = 'block';
|
|
542
|
-
}
|
|
543
|
-
else {
|
|
544
|
-
host.style.display = 'none';
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
catch {
|
|
549
|
-
}
|
|
550
|
-
});
|
|
551
618
|
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
}
|
|
619
|
+
catch {
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
};
|
|
623
|
+
if ((devtoolsGlobal || devtoolsPanel) && typeof window !== 'undefined') {
|
|
624
|
+
(async () => {
|
|
625
|
+
try {
|
|
626
|
+
const mod = await import('./devtools.js');
|
|
627
|
+
if (mod != null && typeof mod.initRouterDevtools === 'function') {
|
|
628
|
+
devtoolsOnNavEvent = mod.initRouterDevtools({
|
|
629
|
+
context,
|
|
630
|
+
options: {
|
|
631
|
+
global: devtoolsGlobal,
|
|
632
|
+
panel: devtoolsPanel,
|
|
633
|
+
shortcut: devtoolsShortcut,
|
|
634
|
+
verbose: devtoolsVerbose,
|
|
635
|
+
},
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
catch {
|
|
640
|
+
}
|
|
641
|
+
})();
|
|
555
642
|
}
|
|
556
643
|
return { cleanup, context };
|
|
557
644
|
}
|
|
558
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FJSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFDckQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMs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Q0FBQzs0QkFDOUIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7b0JBQUMsTUFBTSxDQUFDO29CQUVULENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztRQUVULENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlVHlwZWRRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LWRzbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2ggfSBmcm9tICcuLi90b29scy9idWlsZFNlYXJjaC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlLFxuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55Pjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihcbiAgcm91dGVzOiBSb3V0ZTxhbnksIGFueT5bXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7IGdsb2JhbD86IGJvb2xlYW47IHBhbmVsPzogYm9vbGVhbjsgc2hvcnRjdXQ/OiBzdHJpbmcgfTtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgaWYgKHJvdXRlICE9IG51bGwpIHtcbiAgICBjb25zdCBjb2xsZWN0ZWQ6IGFueVtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHJvdXRlLnJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgaWYgKG1heWJlICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkLnB1c2gobWF5YmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgIGluaXRpYWxTY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgIH1cbiAgfVxuICBjb25zdCBpbml0aWFsVHlwZWRRdWVyeSA9IHBhcnNlVHlwZWRRdWVyeShpbml0aWFsU2NoZW1hLCBpbml0aWFsUmF3UXVlcnkpO1xuICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKHJvdXRlLCBpbml0aWFsVHlwZWRRdWVyeSk7XG4gIC8vIEhlbHBlciB0byBidWlsZCB0aGUgcmF3IHF1ZXJ5IG9iamVjdCBmcm9tIGEgc2VhcmNoIHN0cmluZ1xuICBsZXQgY3VycmVudEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsUmF3UXVlcnksXG4gICAgdHlwZWRRdWVyeTogaW5pdGlhbFR5cGVkUXVlcnksXG4gIH07XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGNvbnN0IGluaXRUeXBlZCA9IGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5IGFzIHVua25vd24gYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCB1bmRlZmluZWQ7XG4gIGxldCBpbml0UGFnZTogdW5rbm93bjtcbiAgaWYgKGluaXRUeXBlZCAhPSBudWxsKSB7XG4gICAgaW5pdFBhZ2UgPSBpbml0VHlwZWQucGFnZTtcbiAgfVxuICBpZiAoXG4gICAgdHlwZW9mIGluaXRQYWdlID09PSAnbnVtYmVyJyAmJlxuICAgIGluaXRQYWdlIDwgMSAmJlxuICAgIGluaXRpYWxTY2hlbWEgIT0gbnVsbCAmJlxuICAgIGluaXRUeXBlZCAhPSBudWxsXG4gICkge1xuICAgIGNvbnN0IG5vcm0gPSB7IC4uLmluaXRUeXBlZCwgcGFnZTogMSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaChub3JtLCBpbml0aWFsU2NoZW1hKTtcbiAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBNYWludGFpbiBhIHNldCBvZiBzdWJzY3JpYmVycyB0byB0aGUgYWN0aXZlIHJvdXRlIGVudHJ5XG4gIGxldCBuZXh0SWQgPSAwO1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXA8bnVtYmVyLCBTdWJzY3JpYmVDYWxsYmFjazxhbnk+PigpO1xuXG4gIC8vIExpc3RlbiBmb3IgbG9jYXRpb24gY2hhbmdlcywgbWF0Y2ggdG8gdGhlIHJvdXRlIGVudHJ5LCBwcmVwYXJlIHRoZSBlbnRyeSxcbiAgLy8gYW5kIG5vdGlmeSBzdWJzY3JpYmVycy4gVGhpcyBwYXR0ZXJuIGVuc3VyZXMgdGhhdCBkYXRhLWxvYWRpbmdcbiAgLy8gb2NjdXJzICpvdXRzaWRlKiBvZiAtIGFuZCAqYmVmb3JlKiAtIHJlbmRlcmluZy5cbiAgY29uc3QgY2xlYW51cCA9IGhpc3Rvcnkuc3Vic2NyaWJlKChsb2NhdGlvbiwgZm9yY2VSZXJlbmRlcikgPT4ge1xuICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgY29uc3Qgc2FtZVNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCA9PT0gY3VycmVudEVudHJ5LnJhd1NlYXJjaDtcblxuICAgIGlmICghZm9yY2VSZXJlbmRlciAmJiBzYW1lUGF0aG5hbWUgJiYgc2FtZVNlYXJjaCkge1xuICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIHdlIHN0aWxsIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UuXG4gICAgLy8gS2VlcCB0aGUgZXhpc3RpbmcgcHJlcGFyZWRNYXRjaCB3aGVuIHBhdGhuYW1lIGlzIGlkZW50aWNhbCB0byBhdm9pZCByZWR1bmRhbnQgd29yay5cbiAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuXG4gICAgaWYgKCFzYW1lUGF0aG5hbWUpIHtcbiAgICAgIC8vIFBhdGggY2hhbmdlZDogcmVjb21wdXRlIG1hdGNoICsgcHJlcGFyZWQgZGF0YSBpbmNsdWRpbmcgcXVlcnlcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgICAgIC8vIHdlIHdpbGwgc2V0IGJlbG93IGFmdGVyIGNvbXB1dGluZyB0eXBlZCBxdWVyeVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyc2VSYXdRdWVyeShsb2NhdGlvbi5zZWFyY2gpO1xuICAgIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IG1hdGNoZWQgcm91dGVcbiAgICBsZXQgc2NoZW1hOiBhbnk7XG4gICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjb2xsZWN0ZWQ6IGFueVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgbmV4dFJvdXRlLnJvdXRlLnJvdXRlcykge1xuICAgICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICAgIGlmIChtYXliZSAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkLnB1c2gobWF5YmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IHR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoc2NoZW1hLCBxdWVyeSk7XG4gICAgLy8gTm9ybWFsaXphdGlvbjogY2xhbXAgcGFnZSA+PSAxIGlmIG51bWVyaWMgcGFnZSBwcmVzZW50XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBwZyA9ICh0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiBwZyA9PT0gJ251bWJlcicgJiYgcGcgPCAxKSB7XG4gICAgICBjb25zdCBjbG9uZSA9IHsgLi4uKHR5cGVkUXVlcnkgYXMgUmVjb3JkPHN0cmluZywgYW55PiksIHBhZ2U6IDEgfTtcbiAgICAgIHR5cGVkUXVlcnkgPSBjbG9uZTtcbiAgICAgIG5vcm1hbGl6ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIChzYW1lIHBhdGhuYW1lKSB3ZSBzdGlsbCBuZWVkIHRvIHJlLXJ1biBwcmVwYXJlXG4gICAgaWYgKCFzYW1lUGF0aG5hbWUpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfSBlbHNlIGlmICghc2FtZVNlYXJjaCkge1xuICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gobmV4dFJvdXRlLCB0eXBlZFF1ZXJ5KTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZvcmNlUmVyZW5kZXIgfHwgKHNhbWVQYXRobmFtZSAmJiAhc2FtZVNlYXJjaCksXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICBwcmVwYXJlZE1hdGNoOiBuZXh0UHJlcGFyZWRNYXRjaCxcbiAgICAgIHJhd1NlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgcXVlcnksXG4gICAgICB0eXBlZFF1ZXJ5LFxuICAgIH07XG5cbiAgICAvLyBJZiBub3JtYWxpemF0aW9uIGNoYW5nZWQgdGhlIHR5cGVkIHF1ZXJ5IHdlIHRyaWdnZXIgYSByZXBsYWNlIHdpdGggbm9ybWFsaXplZCBzZWFyY2hcbiAgICBpZiAobm9ybWFsaXplZCAmJiBzY2hlbWEgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkU2VhcmNoKHR5cGVkUXVlcnkgYXMgYW55LCBzY2hlbWEpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjsgLy8gZWFybHk6IHN1YnNlcXVlbnQgc2V0IHdpbGwgdHJpZ2dlciByZXJ1blxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGVudHJ5IGFuZCBub3RpZnkgYWxsIHN1YnNjcmliZXJzXG4gICAgY3VycmVudEVudHJ5ID0gbmV4dEVudHJ5O1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhuZXh0RW50cnkpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUaGUgcm91dGVyIGNvbnRleHQgb2JqZWN0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gUmVhY3QgQ29udGV4dFxuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICBwcmVsb2FkQ29kZShwYXRobmFtZSkge1xuICAgICAgLy8gUHJlbG9hZCBqdXN0IHRoZSBjb21wb25lbnQgY29kZSBmb3IgYSByb3V0ZSB3aXRob3V0IHN0b3JpbmcgdGhlIHJlc3VsdFxuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIExvYWQgYWxsIHJlc291cmNlIHBhZ2VzIGZvciB0aGUgbWF0Y2hlZCByb3V0ZVxuICAgICAgbWF0Y2hlcy5yb3V0ZS5yb3V0ZXMuZm9yRWFjaCgoeyByZXNvdXJjZVBhZ2UgfSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2VQYWdlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICByZXNvdXJjZVBhZ2UubG9hZCgpO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwcmVsb2FkKHBhdGhuYW1lKSB7XG4gICAgICAvLyBQcmVsb2FkIGJvdGggdGhlIGNvbXBvbmVudCBjb2RlIGFuZCBwcmVwYXJlZCBkYXRhIGZvciBhIHJvdXRlXG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICAvLyBBZGQgYSBuZXcgc3Vic2NyaWJlciBhbmQgcmV0dXJuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtc3R5bGVcbiAgICAgIGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9O1xuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZTtcbiAgICB9LFxuICAgIG5hdmlnYXRlKHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcXVlcnksXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgfSkge1xuICAgICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGNvbnN0IHRhcmdldFBhdGhuYW1lID0gcGF0aG5hbWUgPz8gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIC8vIERldGVybWluZSBzY2hlbWEgb2YgZGVzdGluYXRpb24gKGlmIHNhbWUgcGF0aCBhbmQgd2UgaGF2ZSByb3V0ZSB3ZSBjYW4gcmV1c2UsIGVsc2UgcmVtYXRjaClcbiAgICAgIGxldCBzY2hlbWE6IGFueTtcbiAgICAgIC8qKiBDb2xsZWN0IGRlZXBlc3QgcXVlcnkgc2NoZW1hIGZyb20gcm91dGUgY2hhaW4gKi9cbiAgICAgIGZ1bmN0aW9uIGNvbGxlY3RTY2hlbWEocm91dGVzQXJyOiBhbnlbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAocm91dGVzQXJyID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGVzQXJyKSB7XG4gICAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICAgIGlmIChtYXliZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNjaGVtYSA9IGNvbGxlY3RlZC5hdCgtMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwYXRobmFtZSA9PSBudWxsIHx8IHBhdGhuYW1lID09PSBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICAgIGNvbGxlY3RTY2hlbWEoY3VycmVudC5yb3V0ZT8ucm91dGUucm91dGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRlc3RSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbGxlY3RTY2hlbWEoZGVzdFJvdXRlPy5yb3V0ZS5yb3V0ZXMpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VhcmNoID0gYnVpbGRTZWFyY2gocXVlcnksIHNjaGVtYSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICBoaXN0b3J5LnNldChsb2NhdGlvbk9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLy8gUmV0dXJuIGJvdGggdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhIGNsZWFudXAgZnVuY3Rpb25cbiAgLy8gRGV2dG9vbHMgZXhwb3N1cmUgKGRldmVsb3BtZW50IG9ubHkpXG4gIGlmIChkZXZ0b29sc0dsb2JhbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgX19QTFVNSUxFX1JPVVRFUl9fPzogYW55IH0pLl9fUExVTUlMRV9ST1VURVJfXyA9XG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0OiBjb250ZXh0LmdldCxcbiAgICAgICAgICAgIHN1YnNjcmliZTogY29udGV4dC5zdWJzY3JpYmUsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuICAvLyBPcHRpb25hbCBpbi1wYWdlIGRldnRvb2xzIHBhbmVsIChsaWdodHdlaWdodCBvdmVybGF5KVxuICBpZiAoZGV2dG9vbHNQYW5lbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWxdJykgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWwnLCAnJyk7XG4gICAgICAgIGhvc3Quc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBob3N0LnN0eWxlLnpJbmRleCA9ICcyMTQ3NDgzNjQ2JztcbiAgICAgICAgaG9zdC5zdHlsZS5ib3R0b20gPSAnOHB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgICAgICBob3N0LnN0eWxlLmZvbnRGYW1pbHkgPVxuICAgICAgICAgICd1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgbW9ub3NwYWNlJztcbiAgICAgICAgaG9zdC5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5saW5lSGVpZ2h0ID0gJzEuMyc7XG4gICAgICAgIGhvc3Quc3R5bGUuY29sb3IgPSAnIzExMSc7XG4gICAgICAgIGhvc3Quc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIGhvc3Quc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBhbmVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm1pbldpZHRoID0gJzI2MHB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4V2lkdGggPSAnNDIwcHgnO1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnNTB2aCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICBwYW5lbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC45NSknO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNjY2MnO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNnB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUuYm94U2hhZG93ID0gJzAgMnB4IDhweCByZ2JhKDAsMCwwLDAuMTUpJztcbiAgICAgICAgcGFuZWwuc3R5bGUucGFkZGluZyA9ICc2cHggOHB4IDhweCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJhY2tkcm9wRmlsdGVyID0gJ2JsdXIoNHB4KSc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgcGFuZWwuc3R5bGUucm93R2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ3NwYWNlLWJldHdlZW4nO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZ2FwID0gJzhweCc7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aXRsZS50ZXh0Q29udGVudCA9ICdQbHVtaWxlIFJvdXRlcic7XG4gICAgICAgIHRpdGxlLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBidXR0b25zLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIGJ1dHRvbnMuc3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNvbGxhcHNlQnRuLnRleHRDb250ZW50ID0gJ+KIkic7XG4gICAgICAgIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNsb3NlQnRuLnRleHRDb250ZW50ID0gJ8OXJztcbiAgICAgICAgY29uc3QgYnRuczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IFtjb2xsYXBzZUJ0biwgY2xvc2VCdG5dO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnRucykge1xuICAgICAgICAgIGIuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgIGIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWVlJztcbiAgICAgICAgICBiLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgICAgICAgYi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICBiLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICAgIGIuc3R5bGUubGluZUhlaWdodCA9ICcxJztcbiAgICAgICAgICBiLnN0eWxlLnBhZGRpbmcgPSAnMnB4IDVweCc7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICAgICAgYnV0dG9ucy5hcHBlbmRDaGlsZChjb2xsYXBzZUJ0bik7XG4gICAgICAgIGJ1dHRvbnMuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYnV0dG9ucyk7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwYXRoRWwuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgICAgICBjb25zdCB2YXJzRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgY29uc3QgcXVlcnlFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCB0eXBlZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgIC8vIFRpbWVsaW5lIGNvbnRhaW5lclxuICAgICAgICBjb25zdCB0aW1lbGluZVdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRpbWVsaW5lV3JhcC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgICAgIHRpbWVsaW5lV3JhcC5zdHlsZS5nYXAgPSAnMnB4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLm1hcmdpblRvcCA9ICc0cHgnO1xuICAgICAgICBjb25zdCB0aW1lbGluZUhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZUhlYWRlci50ZXh0Q29udGVudCA9ICdUaW1lbGluZSAocXVlcnkgY2hhbmdlcyknO1xuICAgICAgICB0aW1lbGluZUhlYWRlci5zdHlsZS5mb250V2VpZ2h0ID0gJzYwMCc7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbi1yZXZlcnNlJzsgLy8gbmV3ZXN0IG9uIHRvcCB2aXN1YWxseSB3aGlsZSBhcHBlbmRpbmcgYXQgZW5kIGZvciBjaGVhcGVyIG9wc1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5tYXhIZWlnaHQgPSAnMTQwcHgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2UyZTJlMic7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmYWZiZmMnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mb250RmFtaWx5ID0gJ2luaGVyaXQnO1xuICAgICAgICB0aW1lbGluZS5zdHlsZS5mb250U2l6ZSA9ICcxMXB4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLmFwcGVuZENoaWxkKHRpbWVsaW5lSGVhZGVyKTtcbiAgICAgICAgdGltZWxpbmVXcmFwLmFwcGVuZENoaWxkKHRpbWVsaW5lKTtcbiAgICAgICAgY29uc3QgcHJlczogSFRNTFByZUVsZW1lbnRbXSA9IFt2YXJzRWwsIHF1ZXJ5RWwsIHR5cGVkRWxdO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJlcykge1xuICAgICAgICAgIHAuc3R5bGUubWFyZ2luID0gJzAnO1xuICAgICAgICAgIHAuc3R5bGUucGFkZGluZyA9ICc0cHgnO1xuICAgICAgICAgIHAuc3R5bGUuYmFja2dyb3VuZCA9ICcjZjZmOGZhJztcbiAgICAgICAgICBwLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2UyZTJlMic7XG4gICAgICAgICAgcC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICBwLnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvJztcbiAgICAgICAgICBwLnN0eWxlLm1heEhlaWdodCA9ICcxNjBweCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc21hbGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc21hbGwuc3R5bGUuZm9udFNpemUgPSAnMTBweCc7XG4gICAgICAgIHNtYWxsLnN0eWxlLm9wYWNpdHkgPSAnMC43JztcbiAgICAgICAgc21hbGwudGV4dENvbnRlbnQgPSBgU2hvcnRjdXQ6ICR7ZGV2dG9vbHNTaG9ydGN1dH1gO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChwYXRoRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZCh2YXJzRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChxdWVyeUVsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQodHlwZWRFbCk7XG4gICAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHRpbWVsaW5lV3JhcCk7XG4gICAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHNtYWxsKTtcbiAgICAgICAgc2hhZG93LmFwcGVuZENoaWxkKHBhbmVsKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgICAgICAgbGV0IGNvbGxhcHNlZCA9IGZhbHNlO1xuICAgICAgICBjb2xsYXBzZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBjb2xsYXBzZWQgPSAhY29sbGFwc2VkO1xuICAgICAgICAgIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICcyNHB4JztcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICBjb2xsYXBzZUJ0bi50ZXh0Q29udGVudCA9ICcrJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFuZWwuc3R5bGUubWF4SGVpZ2h0ID0gJzUwdmgnO1xuICAgICAgICAgICAgcGFuZWwuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7XG4gICAgICAgICAgICBjb2xsYXBzZUJ0bi50ZXh0Q29udGVudCA9ICfiiJInO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCB1bnN1YjogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgICAgICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBob3N0LnJlbW92ZSgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgdW5zdWIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHVuc3ViKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIFVwZGF0ZSBwYW5lbCBjb250ZW50IGZyb20gY3VycmVudCByb3V0ZSBlbnRyeSAqL1xuICAgICAgICAvLyBLZWVwIGxhc3QgcXVlcnkgc25hcHNob3QgZm9yIGRpZmZcbiAgICAgICAgbGV0IGxhc3RRdWVyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBsYXN0U2VhcmNoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wdXRlIGRpZmYgY2xhc3NpZmljYXRpb24gYmV0d2VlbiB0d28gcXVlcnkgb2JqZWN0cy5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRpZmZRdWVyaWVzKFxuICAgICAgICAgIHByZXY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG5leHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICApOiB7XG4gICAgICAgICAgYWRkZWQ6IHN0cmluZ1tdO1xuICAgICAgICAgIHJlbW92ZWQ6IHN0cmluZ1tdO1xuICAgICAgICAgIGNoYW5nZWQ6IHN0cmluZ1tdO1xuICAgICAgICAgIHVuY2hhbmdlZDogc3RyaW5nW107XG4gICAgICAgIH0ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHJlbW92ZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgY2hhbmdlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCB1bmNoYW5nZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgcHJldktleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHByZXYgPz8ge30pKTtcbiAgICAgICAgICBjb25zdCBuZXh0S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMobmV4dCkpO1xuICAgICAgICAgIG5leHRLZXlzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgIGlmICghcHJldktleXMuaGFzKGspKSB7XG4gICAgICAgICAgICAgIGFkZGVkLnB1c2goayk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwdjogdW5rbm93bjtcbiAgICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gcHJldiBpcyBhIHBsYWluIHJlY29yZDsgZGlyZWN0IGluZGV4IChydW50aW1lIHNhZmUpXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgcHYgPSAocHJldiBhcyBhbnkpW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbnYgPSBuZXh0W2tdO1xuICAgICAgICAgICAgbGV0IHNhbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHB2KSAmJiBBcnJheS5pc0FycmF5KG52KSkge1xuICAgICAgICAgICAgICBpZiAocHYubGVuZ3RoID09PSAobnYgYXMgdW5rbm93bltdKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzYW1lID0gcHYuZXZlcnkoKHYsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB2ID09PSAobnYgYXMgdW5rbm93bltdKVtpXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2FtZSA9IHB2ID09PSBudjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzYW1lKSB7XG4gICAgICAgICAgICAgIHVuY2hhbmdlZC5wdXNoKGspO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY2hhbmdlZC5wdXNoKGspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldktleXMuZGVsZXRlKGspO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHByZXZLZXlzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChrKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBhZGRlZCwgcmVtb3ZlZCwgY2hhbmdlZCwgdW5jaGFuZ2VkIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFVwZGF0ZSBwYW5lbCBjb250ZW50IGFuZCBtYXliZSBwdXNoIHRpbWVsaW5lIGVudHJ5ICovXG4gICAgICAgIGZ1bmN0aW9uIHJlbmRlcigpOiB2b2lkIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjb250ZXh0LmdldCgpO1xuICAgICAgICAgICAgcGF0aEVsLnRleHRDb250ZW50ID0gYCR7ZW50cnkubG9jYXRpb24ucGF0aG5hbWV9JHtlbnRyeS5sb2NhdGlvbi5zZWFyY2h9YDtcbiAgICAgICAgICAgIGNvbnN0IHZhcnNKc29uID0gSlNPTi5zdHJpbmdpZnkoZW50cnkucm91dGU/LnBhcmFtcyA/PyB7fSwgbnVsbCwgMik7XG4gICAgICAgICAgICB2YXJzRWwudGV4dENvbnRlbnQgPSBgdmFyczogJHt2YXJzSnNvbn1gO1xuICAgICAgICAgICAgY29uc3QgcmF3SnNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5LnF1ZXJ5LCBudWxsLCAyKTtcbiAgICAgICAgICAgIHF1ZXJ5RWwudGV4dENvbnRlbnQgPSBgcmF3OiAgJHtyYXdKc29ufWA7XG4gICAgICAgICAgICBjb25zdCB0eXBlZEpzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeS50eXBlZFF1ZXJ5LCBudWxsLCAyKTtcbiAgICAgICAgICAgIHR5cGVkRWwudGV4dENvbnRlbnQgPSBgdHlwZWQ6JHt0eXBlZEpzb259YDtcbiAgICAgICAgICAgIC8vIFRpbWVsaW5lIGxvZyBpZiBxdWVyeSBzZWFyY2ggY2hhbmdlZFxuICAgICAgICAgICAgaWYgKGVudHJ5LnJhd1NlYXJjaCAhPT0gbGFzdFNlYXJjaCkge1xuICAgICAgICAgICAgICBjb25zdCBub3dRdWVyeSA9IGVudHJ5LnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgICAgICBjb25zdCBkaWZmID0gZGlmZlF1ZXJpZXMobGFzdFF1ZXJ5LCBub3dRdWVyeSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmJvcmRlckJvdHRvbSA9ICcxcHggc29saWQgI2U5ZTllOSc7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5wYWRkaW5nID0gJzNweCA0cHgnO1xuICAgICAgICAgICAgICBjb25zdCBoZWFkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgIGhlYWQuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgICAgICAgaGVhZC5zdHlsZS5qdXN0aWZ5Q29udGVudCA9ICdzcGFjZS1iZXR3ZWVuJztcbiAgICAgICAgICAgICAgY29uc3QgdHMgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpO1xuICAgICAgICAgICAgICBsZXQgc2VhcmNoRGlzcGxheSA9ICcoZW1wdHkpJztcbiAgICAgICAgICAgICAgaWYgKGVudHJ5LmxvY2F0aW9uLnNlYXJjaCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hEaXNwbGF5ID0gZW50cnkubG9jYXRpb24uc2VhcmNoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGhlYWQuaW5uZXJIVE1MID0gYDxzdHJvbmc+JHt0c308L3N0cm9uZz4gPGNvZGUgc3R5bGU9XCJiYWNrZ3JvdW5kOiNlZWU7cGFkZGluZzoxcHggM3B4O2JvcmRlci1yYWRpdXM6M3B4O1wiPiR7c2VhcmNoRGlzcGxheX08L2NvZGU+YDtcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIGJvZHkuc3R5bGUuZmxleFdyYXAgPSAnd3JhcCc7XG4gICAgICAgICAgICAgIGJvZHkuc3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgICAgICAgIC8qKiBDcmVhdGUgYSBjb2xvcmVkIHBpbGwgZWxlbWVudCAqL1xuICAgICAgICAgICAgICBmdW5jdGlvbiBwaWxsKFxuICAgICAgICAgICAgICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAga2luZDogJ2FkZGVkJyB8ICdyZW1vdmVkJyB8ICdjaGFuZ2VkJyB8ICd1bmNoYW5nZWQnLFxuICAgICAgICAgICAgICApOiBIVE1MU3BhbkVsZW1lbnQge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUucGFkZGluZyA9ICcxcHggNHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlclJhZGl1cyA9ICcxMHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gJzEwcHgnO1xuICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCc7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlICdhZGRlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZTZmZmVkJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjMmNiZTRlJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMjI4NjNhJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlICdyZW1vdmVkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmVlZjAnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNkNzNhNDknO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyNjYjI0MzEnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ2NoYW5nZWQnOlxuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZjViMSc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2ZmZDMzZCc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnIzczNWMwZic7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAndW5jaGFuZ2VkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmMWY4ZmYnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyM3OWI4ZmYnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyMwMzY2ZDYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBleGhhdXN0aXZlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzcGFuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkaWZmLmFkZGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgIC4uLmRpZmYuYWRkZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGArJHtrfWAsICdhZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGlmZi5jaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgIC4uLmRpZmYuY2hhbmdlZC5tYXAoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpbGwoYH4ke2t9YCwgJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRpZmYucmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLnJlbW92ZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGAtJHtrfWAsICdyZW1vdmVkJyk7XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG5vQWRkcyA9IGRpZmYuYWRkZWQubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICBjb25zdCBub0NoYW5nZXMgPSBkaWZmLmNoYW5nZWQubGVuZ3RoID09PSAwO1xuICAgICAgICAgICAgICBjb25zdCBub1JlbW92YWxzID0gZGlmZi5yZW1vdmVkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgaWYgKG5vQWRkcyAmJiBub0NoYW5nZXMgJiYgbm9SZW1vdmFscykge1xuICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKHBpbGwoJ25vLWNoYW5nZScsICd1bmNoYW5nZWQnKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGhlYWQpO1xuICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYm9keSk7XG4gICAgICAgICAgICAgIHRpbWVsaW5lLmFwcGVuZENoaWxkKHJvdyk7XG4gICAgICAgICAgICAgIGlmICh0aW1lbGluZS5jaGlsZEVsZW1lbnRDb3VudCA+IDUwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSB0aW1lbGluZS5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdGltZWxpbmUucmVtb3ZlQ2hpbGQoZmlyc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsYXN0UXVlcnkgPSBub3dRdWVyeTtcbiAgICAgICAgICAgICAgbGFzdFNlYXJjaCA9IGVudHJ5LnJhd1NlYXJjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIGlnbm9yZSAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZW5kZXIoKTtcbiAgICAgICAgdW5zdWIgPSBjb250ZXh0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgcmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChldi5hbHRLZXkpIHBhcnRzLnB1c2goJ0FsdCcpO1xuICAgICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSBwYXJ0cy5wdXNoKCdTaGlmdCcpO1xuICAgICAgICAgICAgaWYgKGV2LmN0cmxLZXkpIHBhcnRzLnB1c2goJ0N0cmwnKTtcbiAgICAgICAgICAgIGxldCBrZXlQYXJ0ID0gZXYua2V5O1xuICAgICAgICAgICAgaWYgKGV2LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAga2V5UGFydCA9IGV2LmtleS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHMucHVzaChrZXlQYXJ0KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJvID0gcGFydHMuam9pbignKycpO1xuICAgICAgICAgICAgaWYgKGNvbWJvID09PSBkZXZ0b29sc1Nob3J0Y3V0LnJlcGxhY2UoL1xccysvZywgJycpKSB7XG4gICAgICAgICAgICAgIGlmIChob3N0LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGhvc3Quc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaG9zdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlICovXG4gICAgfVxuICB9XG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
|
|
645
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDNUIsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FDTCxPQUFPLE9BQU8sS0FBSyxXQUFXO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQ3RDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDO1FBQ3JE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RUFBRSxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVR5cGVkUXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS1kc2wuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCB7IGJ1aWxkU2VhcmNoIH0gZnJvbSAnLi4vdG9vbHMvYnVpbGRTZWFyY2guanMnO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZSxcbiAgUm91dGVFbnRyeSxcbiAgUm91dGluZ0NvbnRleHRUeXBlLFxuICBTdWJzY3JpYmVDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoXG4gIHJvdXRlczogUm91dGU8YW55LCBhbnk+W10sXG4gIG9wdHM6IHtcbiAgICBkZXZ0b29scz86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgeyBnbG9iYWw/OiBib29sZWFuOyBwYW5lbD86IGJvb2xlYW47IHNob3J0Y3V0Pzogc3RyaW5nIH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgY29uc2VjdXRpdmUgbmF2aWdhdGUoKSBjYWxscyBpbiBzYW1lIG1pY3JvdGFzayBhdXRv4oCRY29hbGVzY2UgKHVubGVzcyBpbW1lZGlhdGU6IHRydWUpLiAqL1xuICAgIGF1dG9CYXRjaD86IGJvb2xlYW47XG4gIH0gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybiB7XG4gIC8vIE5vcm1hbGl6ZSBkZXZ0b29scyBvcHRpb25zIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGxldCBkZXZ0b29sc0dsb2JhbDogYm9vbGVhbjtcbiAgbGV0IGRldnRvb2xzUGFuZWwgPSBmYWxzZTtcbiAgbGV0IGRldnRvb2xzU2hvcnRjdXQgPSAnQWx0K1NoaWZ0K1InO1xuICBsZXQgZGV2dG9vbHNWZXJib3NlID0gZmFsc2U7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF5YmVWZXJib3NlOiB1bmtub3duID0gKG9wdHMuZGV2dG9vbHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIC52ZXJib3NlO1xuICAgICAgaWYgKHR5cGVvZiBtYXliZVZlcmJvc2UgPT09ICdib29sZWFuJykgZGV2dG9vbHNWZXJib3NlID0gbWF5YmVWZXJib3NlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogaWdub3JlIHZlcmJvc2UgZXh0cmFjdGlvbiAqL1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZQYXRoID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHByZXZTZWFyY2ggPSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgY29uc3Qgc2FtZUFzQmVmb3JlID0gcHJldlBhdGggPT09IHBhdGhuYW1lICYmIHByZXZTZWFyY2ggPT09IHNlYXJjaDtcbiAgICBpZiAoc2FtZUFzQmVmb3JlICYmIGRldnRvb2xzVmVyYm9zZSkge1xuICAgICAgLy8gU3RpbGwgZmlyZSBkZXZ0b29scyArIHN1YnNjcmliZXJzIGV2ZW4gdGhvdWdoIGhpc3RvcnkgcHVzaCB3b3VsZCBiZSBpZ25vcmVkIGJ5IGxpc3RlbmVyXG4gICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICBjYihjdXJyZW50RW50cnkpO1xuICAgICAgfSk7XG4gICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgIGtpbmQ6ICdiYXRjaC1mbHVzaCcsXG4gICAgICAgIG1vZGU6IGJhdGNoTW9kZSA/PyAnbWFudWFsJyxcbiAgICAgICAgY291bnQ6IGxpc3QubGVuZ3RoLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jKTtcbiAgICB9XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBpZiAoIShzYW1lQXNCZWZvcmUgJiYgZGV2dG9vbHNWZXJib3NlKSkge1xuICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50Py4oe1xuICAgICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjb3VudDogbGlzdC5sZW5ndGgsXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgICBzZWFyY2gsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBiYXRjaE1vZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQWZ0ZXIgcmVzb2x2ZUZpbHRlclNjaGVtYSBpcyBkZWZpbmVkIHdlIGNhbiBhcHBseSBpbXBsaWNpdCBzY2hlbWEgZm9yIGFueSBxdWV1ZWQgYmF0Y2ggKGlmIHN0aWxsIHBlbmRpbmcpXG4gIC8qKiBBcHBseSBwcm92aXNpb25hbCBtZXJnZWQgcXVlcnkrZmlsdGVycyB1cGRhdGUgKGR1cmluZyBiYXRjaGluZylcbiAgICogdG8gY3VycmVudEVudHJ5IGZvciBzeW5jaHJvbm91cyByZWFkcy5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5UHJvdmlzaW9uYWxCYXRjaFVwZGF0ZShwYXRobmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEoYmFzZVBhdGgpO1xuICAgICAgY29uc3QgbWVyZ2VkUSA9IGJhdGNoZWRNZXJnZWRRdWVyeSA/PyBsYXN0QmF0Y2hRdWVyeSA/PyB7fTtcbiAgICAgIGxldCBidWlsZE9wdHM6XG4gICAgICAgIHwge1xuICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYmF0Y2hlZEZpbHRlcnMgIT0gbnVsbCAmJiBiYXRjaGVkRmlsdGVyU2NoZW1hICE9IG51bGwpIHtcbiAgICAgICAgYnVpbGRPcHRzID0ge1xuICAgICAgICAgIGZpbHRlcnM6IGJhdGNoZWRGaWx0ZXJzLFxuICAgICAgICAgIGZpbHRlclNjaGVtYTogYmF0Y2hlZEZpbHRlclNjaGVtYSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoYmF0Y2hlZEZpbHRlcnMgIT0gbnVsbCAmJiBiYXRjaGVkRmlsdGVyU2NoZW1hID09IG51bGwpIHtcbiAgICAgICAgLy8gSW1wbGljaXQgcmVzb2x1dGlvbiBmb3IgcHJvdmlzaW9uYWwgdmlld1xuICAgICAgICBsZXQgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcm91dGVDaGFpbjpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgfVtdXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChiYXNlUGF0aCA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZUNoYWluID0gY3VycmVudEVudHJ5LnJvdXRlLnJvdXRlLnJvdXRlcyBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRlc3RSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogYmFzZVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGRlc3RSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByb3V0ZUNoYWluID0gZGVzdFJvdXRlLnJvdXRlLnJvdXRlcyBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyb3V0ZUNoYWluICE9IG51bGwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygcm91dGVDaGFpbikge1xuICAgICAgICAgICAgY29uc3QgZnMgPSAoXG4gICAgICAgICAgICAgIG5vZGUgYXMge1xuICAgICAgICAgICAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBtZXJnZWQgPz89IHt9O1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgZnMuc2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lcmdlZCAhPSBudWxsKSB7XG4gICAgICAgICAgYnVpbGRPcHRzID0ge1xuICAgICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgICBmaWx0ZXJTY2hlbWE6IHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3Zpc2lvbmFsU2VhcmNoID0gYnVpbGRTZWFyY2gobWVyZ2VkUSwgc2NoZW1hLCBidWlsZE9wdHMpO1xuICAgICAgY29uc3QgcGF0aENoYW5nZWQgPSBiYXNlUGF0aCAhPT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgaWYgKHByb3Zpc2lvbmFsU2VhcmNoICE9PSBjdXJyZW50RW50cnkucmF3U2VhcmNoIHx8IHBhdGhDaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHR5cGVkID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgbWVyZ2VkUSk7XG4gICAgICAgIGNvbnN0IHJhd1F1ZXJ5T2JqID0gcGFyc2VSYXdRdWVyeShwcm92aXNpb25hbFNlYXJjaCk7XG4gICAgICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICAgIHNlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByYXdTZWFyY2g6IHByb3Zpc2lvbmFsU2VhcmNoLFxuICAgICAgICAgIHF1ZXJ5OiByYXdRdWVyeU9iaixcbiAgICAgICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICAgICAgfSBhcyBSb3V0ZUVudHJ5PGFueT47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiBpZ25vcmUgKi9cbiAgICB9XG4gIH1cblxuICBjb25zdCBhdXRvQmF0Y2ggPSBvcHRzLmF1dG9CYXRjaCA9PT0gdHJ1ZTtcbiAgY29uc3QgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT4gPSB7XG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcmVzb2x2ZUZpbHRlclNjaGVtYShwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShwYXRobmFtZSk7XG4gICAgfSxcbiAgICBjdXJyZW50TWVyZ2VkRmlsdGVyU2NoZW1hKCkge1xuICAgICAgcmV0dXJuIHJlc29sdmVGaWx0ZXJTY2hlbWEoY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSByZXR1cm47XG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIHByZXBhcmVNYXRjaChtYXRjaGVzKTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjazogU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pikge1xuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG4gICAgICBmdW5jdGlvbiBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZTtcbiAgICB9LFxuICAgIG5hdmlnYXRlKHtcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcXVlcnksXG4gICAgICByZXBsYWNlLFxuICAgICAgZmlsdGVycyxcbiAgICAgIGZpbHRlclNjaGVtYSxcbiAgICAgIGJhdGNoLFxuICAgICAgaW1tZWRpYXRlLFxuICAgICAgaW5oZXJpdCxcbiAgICB9OiB7XG4gICAgICBwYXRobmFtZT86IHN0cmluZztcbiAgICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICBiYXRjaD86IGJvb2xlYW47XG4gICAgICBpbW1lZGlhdGU/OiBib29sZWFuO1xuICAgICAgaW5oZXJpdD86IGJvb2xlYW47XG4gICAgfSk6IHZvaWQge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlSW5oZXJpdCA9IGluaGVyaXQgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IHdhbnRzQmF0Y2ggPVxuICAgICAgICAgIGJhdGNoID09PSB0cnVlIHx8XG4gICAgICAgICAgKGF1dG9CYXRjaCAmJiBpbW1lZGlhdGUgIT09IHRydWUgJiYgYmF0Y2ggIT09IGZhbHNlKTtcbiAgICAgICAgaWYgKHdhbnRzQmF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBuYXY6IFBlbmRpbmdOYXYgPSB7fTtcbiAgICAgICAgICBpZiAocGF0aG5hbWUgIT09IHVuZGVmaW5lZCkgbmF2LnBhdGhuYW1lID0gcGF0aG5hbWU7XG4gICAgICAgICAgaWYgKHF1ZXJ5ICE9PSB1bmRlZmluZWQpIG5hdi5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICAgIGlmIChyZXBsYWNlICE9PSB1bmRlZmluZWQpIG5hdi5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAgICAgICBpZiAoZmlsdGVycyAhPT0gdW5kZWZpbmVkKSBuYXYuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgaWYgKGZpbHRlclNjaGVtYSAhPT0gdW5kZWZpbmVkKSBuYXYuZmlsdGVyU2NoZW1hID0gZmlsdGVyU2NoZW1hO1xuICAgICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSBuYXYuaW5oZXJpdCA9IHRydWU7XG4gICAgICAgICAgcGVuZGluZ05hdnMgPz89IFtdO1xuICAgICAgICAgIHBlbmRpbmdOYXZzLnB1c2gobmF2KTtcbiAgICAgICAgICBsZXQgdGhpc01vZGU6ICdtYW51YWwnIHwgJ2F1dG8nO1xuICAgICAgICAgIGlmIChiYXRjaCA9PT0gdHJ1ZSkgdGhpc01vZGUgPSAnbWFudWFsJztcbiAgICAgICAgICBlbHNlIHRoaXNNb2RlID0gJ2F1dG8nO1xuICAgICAgICAgIGlmIChiYXRjaE1vZGUgPT0gbnVsbCkgYmF0Y2hNb2RlID0gdGhpc01vZGU7XG4gICAgICAgICAgZWxzZSBpZiAoYmF0Y2hNb2RlICE9PSB0aGlzTW9kZSkgYmF0Y2hNb2RlID0gJ21peGVkJztcbiAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZSA9XG4gICAgICAgICAgICAgICAgYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgbGFzdEJhdGNoUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5xdWVyeSA/P1xuICAgICAgICAgICAgICAgIHt9O1xuICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPSB7IC4uLmJhc2UsIC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPSB7IC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA9IHF1ZXJ5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBiYXRjaGVkRmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9IG51bGwpIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZmx1c2hTY2hlZHVsZWQpIHtcbiAgICAgICAgICAgIGZsdXNoU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZmx1c2hOYXZpZ2F0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFwcGx5UHJvdmlzaW9uYWxCYXRjaFVwZGF0ZShwYXRobmFtZSk7XG4gICAgICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgICAgICAgIGNiKGN1cnJlbnRFbnRyeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltbWVkaWF0ZSBuYXZpZ2F0aW9uXG4gICAgICAgIGxldCBiYXNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgIGJhc2UgPSB7IC4uLihjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/PyBjdXJyZW50RW50cnkucXVlcnkgPz8ge30pIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoYmFzZSAhPSBudWxsKSBPYmplY3QuYXNzaWduKGJhc2UsIHF1ZXJ5KTtcbiAgICAgICAgICBlbHNlIGJhc2UgPSBxdWVyeTtcbiAgICAgICAgfVxuICAgICAgICBiYXNlID8/PSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSA/PyBjdXJyZW50RW50cnkucXVlcnkgPz8ge307XG4gICAgICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRobmFtZSA/PyBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aCk7XG4gICAgICAgIGxldCBidWlsZE9wdHM6XG4gICAgICAgICAgfCB7XG4gICAgICAgICAgICAgIGZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmlsdGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBmaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgYnVpbGRPcHRzID0geyBmaWx0ZXJzLCBmaWx0ZXJTY2hlbWE6IGZzIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gYnVpbGRTZWFyY2goYmFzZSwgc2NoZW1hLCBidWlsZE9wdHMpO1xuICAgICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSB0YXJnZXRQYXRoO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgPT09ICcnKSB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcbiAgICAgICAgaWYgKHRhcmdldFBhdGhuYW1lICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKHRhcmdldFBhdGhuYW1lKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHNlYXJjaCk7XG4gICAgICAgIGNvbnN0IHR5cGVkID0gcGFyc2VUeXBlZFF1ZXJ5KGVmZmVjdGl2ZVNjaGVtYSwgcmF3UXVlcnlPYmopO1xuICAgICAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgICAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgICAgIHJhd1NlYXJjaDogc2VhcmNoLFxuICAgICAgICAgIHF1ZXJ5OiByYXdRdWVyeU9iaixcbiAgICAgICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICAgICAgfSBhcyBSb3V0ZUVudHJ5PGFueT47XG4gICAgICAgIGxldCBub3JtSW1tZWRpYXRlID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgICAgIGlmIChub3JtSW1tZWRpYXRlID09PSAnJykgbm9ybUltbWVkaWF0ZSA9ICcvJztcbiAgICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiBub3JtSW1tZWRpYXRlLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICAgIGNvbnN0IHNhbWVBc0JlZm9yZSA9XG4gICAgICAgICAgY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lID09PSBub3JtSW1tZWRpYXRlICYmXG4gICAgICAgICAgY3VycmVudEVudHJ5LnJhd1NlYXJjaCA9PT0gc2VhcmNoO1xuICAgICAgICBpZiAoc2FtZUFzQmVmb3JlICYmIGRldnRvb2xzVmVyYm9zZSAmJiAhcmVwbGFjZSkge1xuICAgICAgICAgIC8vIEZvcmNlIG5vdGlmeSBzdWJzY3JpYmVycyArIGRldnRvb2xzIGV2ZW4gaWYgbGlzdGVuZXIgd291bGQgaWdub3JlXG4gICAgICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgICAgICAgIGNiKGN1cnJlbnRFbnRyeSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50Py4oe1xuICAgICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICAgIG1vZGU6ICdpbW1lZGlhdGUnLFxuICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVwbGFjZSkgaGlzdG9yeS5zZXQobG9jYXRpb25PYmopO1xuICAgICAgICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvY2F0aW9uT2JqKTtcbiAgICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAgICBraW5kOiAnbmF2aWdhdGUnLFxuICAgICAgICAgICAgbW9kZTogJ2ltbWVkaWF0ZScsXG4gICAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICAgIHBhdGhuYW1lOiBub3JtSW1tZWRpYXRlLFxuICAgICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICAvLyBEeW5hbWljIGRldnRvb2xzIGxvYWQgKGRldiBvbmx5KSAtIHNlcGFyYXRlIGNodW5rIGZvciB0cmVlLXNoYWtpbmdcbiAgaWYgKChkZXZ0b29sc0dsb2JhbCB8fCBkZXZ0b29sc1BhbmVsKSAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW9kOiBhbnkgPSBhd2FpdCBpbXBvcnQoJy4vZGV2dG9vbHMuanMnKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBpZiAobW9kICE9IG51bGwgJiYgdHlwZW9mIG1vZC5pbml0Um91dGVyRGV2dG9vbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy1lc2xpbnQvbWF4LWxlblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgIGRldnRvb2xzT25OYXZFdmVudCA9IG1vZC5pbml0Um91dGVyRGV2dG9vbHMoe1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZ2xvYmFsOiBkZXZ0b29sc0dsb2JhbCxcbiAgICAgICAgICAgICAgcGFuZWw6IGRldnRvb2xzUGFuZWwsXG4gICAgICAgICAgICAgIHNob3J0Y3V0OiBkZXZ0b29sc1Nob3J0Y3V0LFxuICAgICAgICAgICAgICB2ZXJib3NlOiBkZXZ0b29sc1ZlcmJvc2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
|