@plumile/router 0.1.13 → 0.1.17
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 +43 -422
- package/lib/esm/builder.d.ts +5 -5
- package/lib/esm/builder.d.ts.map +1 -1
- package/lib/esm/builder.js +1 -1
- package/lib/esm/index.d.ts +0 -4
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +1 -5
- package/lib/esm/routing/Link.d.ts +3 -3
- package/lib/esm/routing/Link.d.ts.map +1 -1
- package/lib/esm/routing/Link.js +3 -8
- package/lib/esm/routing/RouteComponentWrapper.d.ts +6 -5
- package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/esm/routing/RouteComponentWrapper.js +1 -1
- package/lib/esm/routing/RouterRenderer.d.ts.map +1 -1
- package/lib/esm/routing/RouterRenderer.js +1 -1
- package/lib/esm/routing/createRouter.d.ts +0 -1
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +434 -399
- package/lib/esm/routing/index.d.ts +2 -6
- package/lib/esm/routing/index.d.ts.map +1 -1
- package/lib/esm/routing/index.js +3 -7
- package/lib/esm/routing/useAllQuery.d.ts +7 -0
- package/lib/esm/routing/useAllQuery.d.ts.map +1 -0
- package/lib/esm/routing/useAllQuery.js +31 -0
- package/lib/esm/routing/useFilterDiagnostics.d.ts +2 -0
- package/lib/esm/routing/useFilterDiagnostics.d.ts.map +1 -0
- package/lib/esm/routing/useFilterDiagnostics.js +11 -0
- package/lib/esm/routing/useFilters.d.ts +16 -0
- package/lib/esm/routing/useFilters.d.ts.map +1 -0
- package/lib/esm/routing/useFilters.js +83 -0
- package/lib/esm/routing/useNavigate.d.ts +2 -9
- package/lib/esm/routing/useNavigate.d.ts.map +1 -1
- package/lib/esm/routing/useNavigate.js +1 -1
- package/lib/esm/routing/useQueryState.d.ts +1 -1
- package/lib/esm/routing/useQueryState.d.ts.map +1 -1
- package/lib/esm/routing/useQueryState.js +2 -2
- package/lib/esm/routing/useTypedQuery.js +1 -1
- package/lib/esm/tools/buildCombinedSearch.d.ts +11 -0
- package/lib/esm/tools/buildCombinedSearch.d.ts.map +1 -0
- package/lib/esm/tools/buildCombinedSearch.js +28 -0
- package/lib/esm/tools/buildSearch.d.ts +2 -8
- package/lib/esm/tools/buildSearch.d.ts.map +1 -1
- package/lib/esm/tools/buildSearch.js +12 -216
- package/lib/esm/tools.d.ts +1 -1
- package/lib/esm/tools.d.ts.map +1 -1
- package/lib/esm/tools.js +1 -1
- package/lib/esm/types.d.ts +25 -37
- 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/builder.d.ts +5 -5
- package/lib/types/builder.d.ts.map +1 -1
- package/lib/types/index.d.ts +0 -4
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/routing/Link.d.ts +3 -3
- package/lib/types/routing/Link.d.ts.map +1 -1
- package/lib/types/routing/RouteComponentWrapper.d.ts +6 -5
- package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/types/routing/RouterRenderer.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts +0 -1
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/routing/index.d.ts +2 -6
- package/lib/types/routing/index.d.ts.map +1 -1
- package/lib/types/routing/useAllQuery.d.ts +7 -0
- package/lib/types/routing/useAllQuery.d.ts.map +1 -0
- package/lib/types/routing/useFilterDiagnostics.d.ts +2 -0
- package/lib/types/routing/useFilterDiagnostics.d.ts.map +1 -0
- package/lib/types/routing/useFilters.d.ts +16 -0
- package/lib/types/routing/useFilters.d.ts.map +1 -0
- package/lib/types/routing/useNavigate.d.ts +2 -9
- package/lib/types/routing/useNavigate.d.ts.map +1 -1
- package/lib/types/routing/useQueryState.d.ts +1 -1
- package/lib/types/routing/useQueryState.d.ts.map +1 -1
- package/lib/types/tools/buildCombinedSearch.d.ts +11 -0
- package/lib/types/tools/buildCombinedSearch.d.ts.map +1 -0
- package/lib/types/tools/buildSearch.d.ts +2 -8
- package/lib/types/tools/buildSearch.d.ts.map +1 -1
- package/lib/types/tools.d.ts +1 -1
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/types.d.ts +25 -37
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/lib/esm/routing/devtools.d.ts +0 -20
- package/lib/esm/routing/devtools.d.ts.map +0 -1
- package/lib/esm/routing/devtools.js +0 -678
- package/lib/esm/routing/filters.d.ts +0 -97
- package/lib/esm/routing/filters.d.ts.map +0 -1
- package/lib/esm/routing/filters.js +0 -557
- package/lib/esm/routing/useActiveFilters.d.ts +0 -9
- package/lib/esm/routing/useActiveFilters.d.ts.map +0 -1
- package/lib/esm/routing/useActiveFilters.js +0 -38
- package/lib/esm/routing/useFilterState.d.ts +0 -10
- package/lib/esm/routing/useFilterState.d.ts.map +0 -1
- package/lib/esm/routing/useFilterState.js +0 -14
- package/lib/esm/routing/useNavigateWithQuery.d.ts +0 -15
- package/lib/esm/routing/useNavigateWithQuery.d.ts.map +0 -1
- package/lib/esm/routing/useNavigateWithQuery.js +0 -95
- package/lib/esm/routing/useQueryObject.d.ts +0 -18
- package/lib/esm/routing/useQueryObject.d.ts.map +0 -1
- package/lib/esm/routing/useQueryObject.js +0 -107
- package/lib/esm/routing/useStableRefEquality.d.ts +0 -5
- package/lib/esm/routing/useStableRefEquality.d.ts.map +0 -1
- package/lib/esm/routing/useStableRefEquality.js +0 -47
- package/lib/types/routing/devtools.d.ts +0 -20
- package/lib/types/routing/devtools.d.ts.map +0 -1
- package/lib/types/routing/filters.d.ts +0 -97
- package/lib/types/routing/filters.d.ts.map +0 -1
- package/lib/types/routing/useActiveFilters.d.ts +0 -9
- package/lib/types/routing/useActiveFilters.d.ts.map +0 -1
- package/lib/types/routing/useFilterState.d.ts +0 -10
- package/lib/types/routing/useFilterState.d.ts.map +0 -1
- package/lib/types/routing/useNavigateWithQuery.d.ts +0 -15
- package/lib/types/routing/useNavigateWithQuery.d.ts.map +0 -1
- package/lib/types/routing/useQueryObject.d.ts +0 -18
- package/lib/types/routing/useQueryObject.d.ts.map +0 -1
- package/lib/types/routing/useStableRefEquality.d.ts +0 -5
- package/lib/types/routing/useStableRefEquality.d.ts.map +0 -1
|
@@ -4,6 +4,8 @@ import { getMatchedRoute, prepareMatch } from '../tools.js';
|
|
|
4
4
|
import { parseTypedQuery } from '../tools/query-dsl.js';
|
|
5
5
|
import { parseRawQuery } from '../tools/query.js';
|
|
6
6
|
import { buildSearch } from '../tools/buildSearch.js';
|
|
7
|
+
import buildCombinedSearch from '../tools/buildCombinedSearch.js';
|
|
8
|
+
import { parse as parseFilters } from '@plumile/filter-query';
|
|
7
9
|
export default function createRouter(routes, opts = {}) {
|
|
8
10
|
let devtoolsGlobal;
|
|
9
11
|
let devtoolsPanel = false;
|
|
@@ -46,22 +48,36 @@ export default function createRouter(routes, opts = {}) {
|
|
|
46
48
|
let initialSchema;
|
|
47
49
|
if (route != null) {
|
|
48
50
|
const collected = [];
|
|
49
|
-
const collectedFilters = [];
|
|
50
51
|
for (const r of route.route.routes) {
|
|
51
52
|
const maybe = r.query;
|
|
52
53
|
if (maybe != null) {
|
|
53
54
|
collected.push(maybe);
|
|
54
55
|
}
|
|
55
|
-
const maybeFilter = r.filterSchema;
|
|
56
|
-
if (maybeFilter != null) {
|
|
57
|
-
collectedFilters.push(maybeFilter);
|
|
58
|
-
}
|
|
59
56
|
}
|
|
60
57
|
if (collected.length > 0) {
|
|
61
58
|
initialSchema = collected.at(-1);
|
|
62
59
|
}
|
|
63
60
|
}
|
|
64
61
|
const initialTypedQuery = parseTypedQuery(initialSchema, initialRawQuery);
|
|
62
|
+
let initialFilterSchema;
|
|
63
|
+
if (route != null) {
|
|
64
|
+
const collected = [];
|
|
65
|
+
for (const r of route.route.routes) {
|
|
66
|
+
const maybe = r
|
|
67
|
+
.filterSchema;
|
|
68
|
+
if (maybe != null)
|
|
69
|
+
collected.push(maybe);
|
|
70
|
+
}
|
|
71
|
+
if (collected.length > 0)
|
|
72
|
+
initialFilterSchema = collected.at(-1);
|
|
73
|
+
}
|
|
74
|
+
let initialFilters;
|
|
75
|
+
let initialFilterDiagnostics;
|
|
76
|
+
if (initialFilterSchema != null) {
|
|
77
|
+
const parsed = parseFilters(history.location.search, initialFilterSchema);
|
|
78
|
+
initialFilters = parsed.filters;
|
|
79
|
+
initialFilterDiagnostics = parsed.diagnostics;
|
|
80
|
+
}
|
|
65
81
|
const preparedMatch = prepareMatch(route, initialTypedQuery);
|
|
66
82
|
let currentEntry = {
|
|
67
83
|
forceRerender: false,
|
|
@@ -71,6 +87,8 @@ export default function createRouter(routes, opts = {}) {
|
|
|
71
87
|
rawSearch: history.location.search,
|
|
72
88
|
query: initialRawQuery,
|
|
73
89
|
typedQuery: initialTypedQuery,
|
|
90
|
+
filters: initialFilters,
|
|
91
|
+
filterDiagnostics: initialFilterDiagnostics,
|
|
74
92
|
};
|
|
75
93
|
const initTyped = currentEntry.typedQuery;
|
|
76
94
|
let initPage;
|
|
@@ -106,24 +124,35 @@ export default function createRouter(routes, opts = {}) {
|
|
|
106
124
|
}
|
|
107
125
|
const query = parseRawQuery(location.search);
|
|
108
126
|
let schema;
|
|
127
|
+
let filterSchema;
|
|
109
128
|
if (nextRoute != null) {
|
|
110
129
|
const collected = [];
|
|
111
|
-
const
|
|
130
|
+
const filterCollected = [];
|
|
112
131
|
for (const r of nextRoute.route.routes) {
|
|
113
132
|
const maybe = r.query;
|
|
114
133
|
if (maybe != null) {
|
|
115
134
|
collected.push(maybe);
|
|
116
135
|
}
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
136
|
+
const maybeF = r
|
|
137
|
+
.filterSchema;
|
|
138
|
+
if (maybeF != null)
|
|
139
|
+
filterCollected.push(maybeF);
|
|
121
140
|
}
|
|
122
141
|
if (collected.length > 0) {
|
|
123
142
|
schema = collected.at(-1);
|
|
124
143
|
}
|
|
144
|
+
if (filterCollected.length > 0) {
|
|
145
|
+
filterSchema = filterCollected.at(-1);
|
|
146
|
+
}
|
|
125
147
|
}
|
|
126
148
|
let typedQuery = parseTypedQuery(schema, query);
|
|
149
|
+
let filters;
|
|
150
|
+
let filterDiagnostics;
|
|
151
|
+
if (filterSchema != null) {
|
|
152
|
+
const parsedF = parseFilters(location.search, filterSchema);
|
|
153
|
+
filters = parsedF.filters;
|
|
154
|
+
filterDiagnostics = parsedF.diagnostics;
|
|
155
|
+
}
|
|
127
156
|
let normalized = false;
|
|
128
157
|
const pg = typedQuery.page;
|
|
129
158
|
if (typeof pg === 'number' && pg < 1) {
|
|
@@ -145,9 +174,16 @@ export default function createRouter(routes, opts = {}) {
|
|
|
145
174
|
rawSearch: location.search,
|
|
146
175
|
query,
|
|
147
176
|
typedQuery,
|
|
177
|
+
filters,
|
|
178
|
+
filterDiagnostics,
|
|
148
179
|
};
|
|
149
180
|
if (normalized && schema != null) {
|
|
150
|
-
const normalizedSearch =
|
|
181
|
+
const normalizedSearch = buildCombinedSearch({
|
|
182
|
+
query: typedQuery,
|
|
183
|
+
querySchema: schema,
|
|
184
|
+
filters,
|
|
185
|
+
filterSchema,
|
|
186
|
+
});
|
|
151
187
|
if (normalizedSearch !== location.search) {
|
|
152
188
|
history.set({
|
|
153
189
|
pathname: location.pathname,
|
|
@@ -162,272 +198,23 @@ export default function createRouter(routes, opts = {}) {
|
|
|
162
198
|
callback(nextEntry);
|
|
163
199
|
});
|
|
164
200
|
});
|
|
165
|
-
let pendingNavs;
|
|
166
|
-
let flushScheduled = false;
|
|
167
|
-
let batchedMergedQuery;
|
|
168
|
-
let lastBatchQuery;
|
|
169
|
-
let batchedFilters;
|
|
170
|
-
let batchedFilterSchema;
|
|
171
|
-
let devtoolsOnNavEvent;
|
|
172
|
-
let batchMode;
|
|
173
|
-
function collectRouteChain(pathname) {
|
|
174
|
-
if (pathname === currentEntry.location.pathname) {
|
|
175
|
-
if (currentEntry.route != null) {
|
|
176
|
-
return currentEntry.route.route.routes;
|
|
177
|
-
}
|
|
178
|
-
return undefined;
|
|
179
|
-
}
|
|
180
|
-
const destRoute = getMatchedRoute(flatRoutes, {
|
|
181
|
-
...window.location,
|
|
182
|
-
pathname,
|
|
183
|
-
});
|
|
184
|
-
if (destRoute != null)
|
|
185
|
-
return destRoute.route.routes;
|
|
186
|
-
return undefined;
|
|
187
|
-
}
|
|
188
|
-
function mergeQuerySchemaFromChain(chain) {
|
|
189
|
-
if (chain == null)
|
|
190
|
-
return undefined;
|
|
191
|
-
const merged = {};
|
|
192
|
-
for (const node of chain) {
|
|
193
|
-
const qobj = node.query;
|
|
194
|
-
if (qobj != null) {
|
|
195
|
-
for (const [k, v] of Object.entries(qobj)) {
|
|
196
|
-
merged[k] = v;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
if (Object.keys(merged).length === 0)
|
|
201
|
-
return undefined;
|
|
202
|
-
return merged;
|
|
203
|
-
}
|
|
204
|
-
function mergeFilterSchemaFromChain(chain) {
|
|
205
|
-
if (chain == null)
|
|
206
|
-
return undefined;
|
|
207
|
-
let merged;
|
|
208
|
-
for (const node of chain) {
|
|
209
|
-
const fs = node.filterSchema;
|
|
210
|
-
if (fs != null) {
|
|
211
|
-
merged ??= {};
|
|
212
|
-
Object.assign(merged, fs.schema);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
if (merged != null)
|
|
216
|
-
return { __defined: true, schema: merged };
|
|
217
|
-
return undefined;
|
|
218
|
-
}
|
|
219
|
-
function resolveSchema(pathname) {
|
|
220
|
-
return mergeQuerySchemaFromChain(collectRouteChain(pathname));
|
|
221
|
-
}
|
|
222
|
-
function resolveFilterSchema(pathname) {
|
|
223
|
-
return mergeFilterSchemaFromChain(collectRouteChain(pathname));
|
|
224
|
-
}
|
|
225
|
-
function coalesceNavigations(list) {
|
|
226
|
-
let targetPathname = currentEntry.location.pathname;
|
|
227
|
-
if (targetPathname === '') {
|
|
228
|
-
targetPathname = '/';
|
|
229
|
-
}
|
|
230
|
-
for (const nav of list) {
|
|
231
|
-
if (nav.pathname !== undefined) {
|
|
232
|
-
const pn = nav.pathname;
|
|
233
|
-
if (pn === '') {
|
|
234
|
-
targetPathname = '/';
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
targetPathname = pn;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
let replaceFlag;
|
|
242
|
-
for (const nav of list) {
|
|
243
|
-
if (nav.replace !== undefined) {
|
|
244
|
-
replaceFlag = nav.replace;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
let baseQuery = currentEntry.typedQuery ?? currentEntry.query ?? {};
|
|
248
|
-
if (batchedMergedQuery != null) {
|
|
249
|
-
baseQuery = batchedMergedQuery;
|
|
250
|
-
}
|
|
251
|
-
else if (lastBatchQuery != null) {
|
|
252
|
-
baseQuery = lastBatchQuery;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
for (let i = list.length - 1; i >= 0; i -= 1) {
|
|
256
|
-
const item = list[i];
|
|
257
|
-
if (item != null) {
|
|
258
|
-
const q = item.query;
|
|
259
|
-
if (q != null && Object.keys(q).length > 0) {
|
|
260
|
-
baseQuery = q;
|
|
261
|
-
break;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
const batchFilters = batchedFilters;
|
|
267
|
-
const batchFilterSchema = batchedFilterSchema;
|
|
268
|
-
const schema = resolveSchema(targetPathname);
|
|
269
|
-
let buildOpts;
|
|
270
|
-
if (batchFilters !== undefined) {
|
|
271
|
-
const fs = batchFilterSchema ?? resolveFilterSchema(targetPathname);
|
|
272
|
-
if (fs != null) {
|
|
273
|
-
buildOpts = { filters: batchFilters, filterSchema: fs };
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
const search = buildSearch(baseQuery, schema, buildOpts);
|
|
277
|
-
let normalizedPath = targetPathname;
|
|
278
|
-
if (normalizedPath === '') {
|
|
279
|
-
normalizedPath = '/';
|
|
280
|
-
}
|
|
281
|
-
let nextRoute = currentEntry.route;
|
|
282
|
-
if (normalizedPath !== currentEntry.location.pathname) {
|
|
283
|
-
nextRoute = getMatchedRoute(flatRoutes, {
|
|
284
|
-
...window.location,
|
|
285
|
-
pathname: normalizedPath,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
const effectiveSchema = schema ?? resolveSchema(normalizedPath);
|
|
289
|
-
const rawQueryObj = parseRawQuery(search);
|
|
290
|
-
const typed = parseTypedQuery(effectiveSchema, rawQueryObj);
|
|
291
|
-
const prepared = prepareMatch(nextRoute, typed);
|
|
292
|
-
const nextEntry = {
|
|
293
|
-
forceRerender: false,
|
|
294
|
-
location: { ...currentEntry.location, pathname: normalizedPath, search },
|
|
295
|
-
route: nextRoute,
|
|
296
|
-
preparedMatch: prepared,
|
|
297
|
-
rawSearch: search,
|
|
298
|
-
query: rawQueryObj,
|
|
299
|
-
typedQuery: typed,
|
|
300
|
-
};
|
|
301
|
-
return {
|
|
302
|
-
search,
|
|
303
|
-
pathname: normalizedPath,
|
|
304
|
-
replace: replaceFlag,
|
|
305
|
-
nextEntry,
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
function flushNavigations() {
|
|
309
|
-
flushScheduled = false;
|
|
310
|
-
const list = pendingNavs;
|
|
311
|
-
pendingNavs = undefined;
|
|
312
|
-
if (list == null || list.length === 0) {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
const { search, pathname, replace: replaceFlag, nextEntry, } = coalesceNavigations(list);
|
|
316
|
-
batchedMergedQuery = undefined;
|
|
317
|
-
lastBatchQuery = undefined;
|
|
318
|
-
batchedFilters = undefined;
|
|
319
|
-
batchedFilterSchema = undefined;
|
|
320
|
-
currentEntry = nextEntry;
|
|
321
|
-
const loc = { pathname, search, hash: '' };
|
|
322
|
-
if (replaceFlag)
|
|
323
|
-
history.set(loc);
|
|
324
|
-
else
|
|
325
|
-
history.push(loc);
|
|
326
|
-
let mode = 'manual';
|
|
327
|
-
if (batchMode === 'auto') {
|
|
328
|
-
mode = 'auto';
|
|
329
|
-
}
|
|
330
|
-
else if (batchMode === 'mixed') {
|
|
331
|
-
mode = 'mixed';
|
|
332
|
-
}
|
|
333
|
-
devtoolsOnNavEvent?.({
|
|
334
|
-
kind: 'batch-flush',
|
|
335
|
-
mode,
|
|
336
|
-
count: list.length,
|
|
337
|
-
pathname,
|
|
338
|
-
search,
|
|
339
|
-
timestamp: Date.now(),
|
|
340
|
-
});
|
|
341
|
-
batchMode = undefined;
|
|
342
|
-
}
|
|
343
|
-
function applyProvisionalBatchUpdate(pathname) {
|
|
344
|
-
try {
|
|
345
|
-
const basePath = pathname ?? currentEntry.location.pathname;
|
|
346
|
-
const schema = resolveSchema(basePath);
|
|
347
|
-
const mergedQ = batchedMergedQuery ?? lastBatchQuery ?? {};
|
|
348
|
-
let buildOpts;
|
|
349
|
-
if (batchedFilters != null && batchedFilterSchema != null) {
|
|
350
|
-
buildOpts = {
|
|
351
|
-
filters: batchedFilters,
|
|
352
|
-
filterSchema: batchedFilterSchema,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
else if (batchedFilters != null && batchedFilterSchema == null) {
|
|
356
|
-
let merged;
|
|
357
|
-
let routeChain;
|
|
358
|
-
if (basePath === currentEntry.location.pathname) {
|
|
359
|
-
if (currentEntry.route != null) {
|
|
360
|
-
routeChain = currentEntry.route.route.routes;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
const destRoute = getMatchedRoute(flatRoutes, {
|
|
365
|
-
...window.location,
|
|
366
|
-
pathname: basePath,
|
|
367
|
-
});
|
|
368
|
-
if (destRoute != null) {
|
|
369
|
-
routeChain = destRoute.route.routes;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
if (routeChain != null) {
|
|
373
|
-
for (const node of routeChain) {
|
|
374
|
-
const fs = node.filterSchema;
|
|
375
|
-
if (fs != null) {
|
|
376
|
-
merged ??= {};
|
|
377
|
-
Object.assign(merged, fs.schema);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
if (merged != null) {
|
|
382
|
-
buildOpts = {
|
|
383
|
-
filters: batchedFilters,
|
|
384
|
-
filterSchema: { __defined: true, schema: merged },
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
const provisionalSearch = buildSearch(mergedQ, schema, buildOpts);
|
|
389
|
-
const pathChanged = basePath !== currentEntry.location.pathname;
|
|
390
|
-
if (provisionalSearch !== currentEntry.rawSearch || pathChanged) {
|
|
391
|
-
const typed = parseTypedQuery(schema, mergedQ);
|
|
392
|
-
const rawQueryObj = parseRawQuery(provisionalSearch);
|
|
393
|
-
currentEntry = {
|
|
394
|
-
...currentEntry,
|
|
395
|
-
location: {
|
|
396
|
-
...currentEntry.location,
|
|
397
|
-
pathname: basePath,
|
|
398
|
-
search: provisionalSearch,
|
|
399
|
-
},
|
|
400
|
-
rawSearch: provisionalSearch,
|
|
401
|
-
query: rawQueryObj,
|
|
402
|
-
typedQuery: typed,
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
catch {
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
const autoBatch = opts.autoBatch === true;
|
|
410
201
|
const context = {
|
|
411
202
|
history,
|
|
412
203
|
get() {
|
|
413
204
|
return currentEntry;
|
|
414
205
|
},
|
|
415
|
-
resolveFilterSchema(pathname) {
|
|
416
|
-
return resolveFilterSchema(pathname);
|
|
417
|
-
},
|
|
418
|
-
currentMergedFilterSchema() {
|
|
419
|
-
return resolveFilterSchema(currentEntry.location.pathname);
|
|
420
|
-
},
|
|
421
206
|
preloadCode(pathname) {
|
|
422
207
|
const matches = getMatchedRoute(flatRoutes, {
|
|
423
208
|
...window.location,
|
|
424
209
|
pathname,
|
|
425
210
|
});
|
|
426
|
-
if (matches == null)
|
|
211
|
+
if (matches == null) {
|
|
427
212
|
return;
|
|
213
|
+
}
|
|
428
214
|
matches.route.routes.forEach(({ resourcePage }) => {
|
|
429
|
-
if (resourcePage == null)
|
|
215
|
+
if (resourcePage == null) {
|
|
430
216
|
return;
|
|
217
|
+
}
|
|
431
218
|
resourcePage.load();
|
|
432
219
|
});
|
|
433
220
|
},
|
|
@@ -441,158 +228,406 @@ export default function createRouter(routes, opts = {}) {
|
|
|
441
228
|
subscribe(callback) {
|
|
442
229
|
nextId += 1;
|
|
443
230
|
const id = nextId;
|
|
444
|
-
|
|
231
|
+
const dispose = () => {
|
|
445
232
|
subscribers.delete(id);
|
|
446
|
-
}
|
|
233
|
+
};
|
|
447
234
|
subscribers.set(id, callback);
|
|
448
235
|
return dispose;
|
|
449
236
|
},
|
|
450
|
-
navigate({ pathname, query,
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
if (pathname !== undefined)
|
|
458
|
-
nav.pathname = pathname;
|
|
459
|
-
if (query !== undefined)
|
|
460
|
-
nav.query = query;
|
|
461
|
-
if (replace !== undefined)
|
|
462
|
-
nav.replace = replace;
|
|
463
|
-
if (filters !== undefined)
|
|
464
|
-
nav.filters = filters;
|
|
465
|
-
if (filterSchema !== undefined)
|
|
466
|
-
nav.filterSchema = filterSchema;
|
|
467
|
-
if (effectiveInherit)
|
|
468
|
-
nav.inherit = true;
|
|
469
|
-
pendingNavs ??= [];
|
|
470
|
-
pendingNavs.push(nav);
|
|
471
|
-
let thisMode;
|
|
472
|
-
if (batch === true)
|
|
473
|
-
thisMode = 'manual';
|
|
474
|
-
else
|
|
475
|
-
thisMode = 'auto';
|
|
476
|
-
if (batchMode == null)
|
|
477
|
-
batchMode = thisMode;
|
|
478
|
-
else if (batchMode !== thisMode)
|
|
479
|
-
batchMode = 'mixed';
|
|
480
|
-
if (query != null) {
|
|
481
|
-
if (effectiveInherit) {
|
|
482
|
-
const base = batchedMergedQuery ??
|
|
483
|
-
lastBatchQuery ??
|
|
484
|
-
currentEntry.typedQuery ??
|
|
485
|
-
currentEntry.query ??
|
|
486
|
-
{};
|
|
487
|
-
batchedMergedQuery = { ...base, ...query };
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
batchedMergedQuery = { ...query };
|
|
491
|
-
}
|
|
492
|
-
lastBatchQuery = query;
|
|
493
|
-
}
|
|
494
|
-
if (filters != null) {
|
|
495
|
-
batchedFilters = filters;
|
|
496
|
-
if (filterSchema != null)
|
|
497
|
-
batchedFilterSchema = filterSchema;
|
|
498
|
-
}
|
|
499
|
-
if (!flushScheduled) {
|
|
500
|
-
flushScheduled = true;
|
|
501
|
-
Promise.resolve().then(flushNavigations);
|
|
502
|
-
}
|
|
503
|
-
applyProvisionalBatchUpdate(pathname);
|
|
504
|
-
subscribers.forEach((cb) => {
|
|
505
|
-
cb(currentEntry);
|
|
506
|
-
});
|
|
237
|
+
navigate({ pathname, query, filters: navFilters, replace, }) {
|
|
238
|
+
const current = currentEntry;
|
|
239
|
+
const targetPathname = pathname ?? current.location.pathname;
|
|
240
|
+
let schema;
|
|
241
|
+
let filterSchema;
|
|
242
|
+
function collectSchema(routesArr) {
|
|
243
|
+
if (routesArr == null) {
|
|
507
244
|
return;
|
|
508
245
|
}
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
246
|
+
const collected = [];
|
|
247
|
+
const filterCollected = [];
|
|
248
|
+
for (const r of routesArr) {
|
|
249
|
+
const maybe = r.query;
|
|
250
|
+
if (maybe != null) {
|
|
251
|
+
collected.push(maybe);
|
|
252
|
+
}
|
|
253
|
+
const maybeF = r
|
|
254
|
+
.filterSchema;
|
|
255
|
+
if (maybeF != null)
|
|
256
|
+
filterCollected.push(maybeF);
|
|
518
257
|
}
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
const schema = resolveSchema(targetPath);
|
|
522
|
-
let buildOpts;
|
|
523
|
-
if (filters != null) {
|
|
524
|
-
const fs = filterSchema ?? resolveFilterSchema(targetPath);
|
|
525
|
-
if (fs != null)
|
|
526
|
-
buildOpts = { filters, filterSchema: fs };
|
|
258
|
+
if (collected.length > 0) {
|
|
259
|
+
schema = collected.at(-1);
|
|
527
260
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
if (targetPathname === '')
|
|
531
|
-
targetPathname = '/';
|
|
532
|
-
let nextRoute = currentEntry.route;
|
|
533
|
-
if (targetPathname !== currentEntry.location.pathname) {
|
|
534
|
-
nextRoute = getMatchedRoute(flatRoutes, {
|
|
535
|
-
...window.location,
|
|
536
|
-
pathname: targetPathname,
|
|
537
|
-
});
|
|
261
|
+
if (filterCollected.length > 0) {
|
|
262
|
+
filterSchema = filterCollected.at(-1);
|
|
538
263
|
}
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
location
|
|
546
|
-
|
|
547
|
-
pathname: targetPathname,
|
|
548
|
-
search,
|
|
549
|
-
},
|
|
550
|
-
route: nextRoute,
|
|
551
|
-
preparedMatch: prepared,
|
|
552
|
-
rawSearch: search,
|
|
553
|
-
query: rawQueryObj,
|
|
554
|
-
typedQuery: typed,
|
|
555
|
-
};
|
|
556
|
-
let normImmediate = targetPathname;
|
|
557
|
-
if (normImmediate === '')
|
|
558
|
-
normImmediate = '/';
|
|
559
|
-
const locationObj = { pathname: normImmediate, search, hash: '' };
|
|
560
|
-
if (replace)
|
|
561
|
-
history.set(locationObj);
|
|
562
|
-
else
|
|
563
|
-
history.push(locationObj);
|
|
564
|
-
devtoolsOnNavEvent?.({
|
|
565
|
-
kind: 'navigate',
|
|
566
|
-
mode: 'immediate',
|
|
567
|
-
count: 1,
|
|
568
|
-
pathname: normImmediate,
|
|
569
|
-
search,
|
|
570
|
-
timestamp: Date.now(),
|
|
264
|
+
}
|
|
265
|
+
if (pathname == null || pathname === current.location.pathname) {
|
|
266
|
+
collectSchema(current.route?.route.routes);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const destRoute = getMatchedRoute(flatRoutes, {
|
|
270
|
+
...window.location,
|
|
271
|
+
pathname: targetPathname,
|
|
571
272
|
});
|
|
273
|
+
collectSchema(destRoute?.route.routes);
|
|
572
274
|
}
|
|
573
|
-
|
|
275
|
+
const effectiveFilters = navFilters ?? current.filters;
|
|
276
|
+
const search = buildCombinedSearch({
|
|
277
|
+
query,
|
|
278
|
+
querySchema: schema,
|
|
279
|
+
filters: effectiveFilters,
|
|
280
|
+
filterSchema,
|
|
281
|
+
});
|
|
282
|
+
const locationObj = { pathname: targetPathname, search, hash: '' };
|
|
283
|
+
if (replace) {
|
|
284
|
+
history.set(locationObj);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
history.push(locationObj);
|
|
574
288
|
}
|
|
575
289
|
},
|
|
576
290
|
};
|
|
577
|
-
if (
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
context,
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
291
|
+
if (devtoolsGlobal) {
|
|
292
|
+
try {
|
|
293
|
+
if (typeof window !== 'undefined') {
|
|
294
|
+
window.__PLUMILE_ROUTER__ =
|
|
295
|
+
{
|
|
296
|
+
get: context.get,
|
|
297
|
+
subscribe: context.subscribe,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (devtoolsPanel) {
|
|
305
|
+
try {
|
|
306
|
+
if (typeof window !== 'undefined' &&
|
|
307
|
+
typeof document !== 'undefined' &&
|
|
308
|
+
document.querySelector('[data-plumile-router-devtools-panel]') == null) {
|
|
309
|
+
const host = document.createElement('div');
|
|
310
|
+
host.setAttribute('data-plumile-router-devtools-panel', '');
|
|
311
|
+
host.style.position = 'fixed';
|
|
312
|
+
host.style.zIndex = '2147483646';
|
|
313
|
+
host.style.bottom = '8px';
|
|
314
|
+
host.style.right = '8px';
|
|
315
|
+
host.style.fontFamily =
|
|
316
|
+
'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace';
|
|
317
|
+
host.style.fontSize = '12px';
|
|
318
|
+
host.style.lineHeight = '1.3';
|
|
319
|
+
host.style.color = '#111';
|
|
320
|
+
host.style.background = 'transparent';
|
|
321
|
+
host.style.pointerEvents = 'none';
|
|
322
|
+
const shadow = host.attachShadow({ mode: 'open' });
|
|
323
|
+
const panel = document.createElement('div');
|
|
324
|
+
panel.style.pointerEvents = 'auto';
|
|
325
|
+
panel.style.minWidth = '260px';
|
|
326
|
+
panel.style.maxWidth = '420px';
|
|
327
|
+
panel.style.maxHeight = '50vh';
|
|
328
|
+
panel.style.overflow = 'auto';
|
|
329
|
+
panel.style.background = 'rgba(255,255,255,0.95)';
|
|
330
|
+
panel.style.border = '1px solid #ccc';
|
|
331
|
+
panel.style.borderRadius = '6px';
|
|
332
|
+
panel.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
|
|
333
|
+
panel.style.padding = '6px 8px 8px';
|
|
334
|
+
panel.style.backdropFilter = 'blur(4px)';
|
|
335
|
+
panel.style.display = 'flex';
|
|
336
|
+
panel.style.flexDirection = 'column';
|
|
337
|
+
panel.style.rowGap = '4px';
|
|
338
|
+
const header = document.createElement('div');
|
|
339
|
+
header.style.display = 'flex';
|
|
340
|
+
header.style.alignItems = 'center';
|
|
341
|
+
header.style.justifyContent = 'space-between';
|
|
342
|
+
header.style.gap = '8px';
|
|
343
|
+
const title = document.createElement('span');
|
|
344
|
+
title.textContent = 'Plumile Router';
|
|
345
|
+
title.style.fontWeight = '600';
|
|
346
|
+
const buttons = document.createElement('div');
|
|
347
|
+
buttons.style.display = 'flex';
|
|
348
|
+
buttons.style.gap = '4px';
|
|
349
|
+
const collapseBtn = document.createElement('button');
|
|
350
|
+
collapseBtn.textContent = '−';
|
|
351
|
+
const closeBtn = document.createElement('button');
|
|
352
|
+
closeBtn.textContent = '×';
|
|
353
|
+
const btns = [collapseBtn, closeBtn];
|
|
354
|
+
for (const b of btns) {
|
|
355
|
+
b.style.cursor = 'pointer';
|
|
356
|
+
b.style.background = '#eee';
|
|
357
|
+
b.style.border = '1px solid #ccc';
|
|
358
|
+
b.style.borderRadius = '4px';
|
|
359
|
+
b.style.fontSize = '11px';
|
|
360
|
+
b.style.lineHeight = '1';
|
|
361
|
+
b.style.padding = '2px 5px';
|
|
362
|
+
}
|
|
363
|
+
header.appendChild(title);
|
|
364
|
+
buttons.appendChild(collapseBtn);
|
|
365
|
+
buttons.appendChild(closeBtn);
|
|
366
|
+
header.appendChild(buttons);
|
|
367
|
+
const pathEl = document.createElement('div');
|
|
368
|
+
pathEl.style.whiteSpace = 'nowrap';
|
|
369
|
+
const varsEl = document.createElement('pre');
|
|
370
|
+
const queryEl = document.createElement('pre');
|
|
371
|
+
const typedEl = document.createElement('pre');
|
|
372
|
+
const filtersEl = document.createElement('pre');
|
|
373
|
+
const filterDiagEl = document.createElement('pre');
|
|
374
|
+
const timelineWrap = document.createElement('div');
|
|
375
|
+
timelineWrap.style.display = 'flex';
|
|
376
|
+
timelineWrap.style.flexDirection = 'column';
|
|
377
|
+
timelineWrap.style.gap = '2px';
|
|
378
|
+
timelineWrap.style.marginTop = '4px';
|
|
379
|
+
const timelineHeader = document.createElement('div');
|
|
380
|
+
timelineHeader.textContent = 'Timeline (query changes)';
|
|
381
|
+
timelineHeader.style.fontWeight = '600';
|
|
382
|
+
timelineHeader.style.fontSize = '11px';
|
|
383
|
+
const timeline = document.createElement('div');
|
|
384
|
+
timeline.style.display = 'flex';
|
|
385
|
+
timeline.style.flexDirection = 'column-reverse';
|
|
386
|
+
timeline.style.maxHeight = '140px';
|
|
387
|
+
timeline.style.overflowY = 'auto';
|
|
388
|
+
timeline.style.border = '1px solid #e2e2e2';
|
|
389
|
+
timeline.style.borderRadius = '4px';
|
|
390
|
+
timeline.style.background = '#fafbfc';
|
|
391
|
+
timeline.style.fontFamily = 'inherit';
|
|
392
|
+
timeline.style.fontSize = '11px';
|
|
393
|
+
timelineWrap.appendChild(timelineHeader);
|
|
394
|
+
timelineWrap.appendChild(timeline);
|
|
395
|
+
const pres = [
|
|
396
|
+
varsEl,
|
|
397
|
+
queryEl,
|
|
398
|
+
typedEl,
|
|
399
|
+
filtersEl,
|
|
400
|
+
filterDiagEl,
|
|
401
|
+
];
|
|
402
|
+
for (const p of pres) {
|
|
403
|
+
p.style.margin = '0';
|
|
404
|
+
p.style.padding = '4px';
|
|
405
|
+
p.style.background = '#f6f8fa';
|
|
406
|
+
p.style.border = '1px solid #e2e2e2';
|
|
407
|
+
p.style.borderRadius = '4px';
|
|
408
|
+
p.style.overflowX = 'auto';
|
|
409
|
+
p.style.maxHeight = '160px';
|
|
410
|
+
}
|
|
411
|
+
const small = document.createElement('div');
|
|
412
|
+
small.style.fontSize = '10px';
|
|
413
|
+
small.style.opacity = '0.7';
|
|
414
|
+
small.textContent = `Shortcut: ${devtoolsShortcut}`;
|
|
415
|
+
panel.appendChild(header);
|
|
416
|
+
panel.appendChild(pathEl);
|
|
417
|
+
panel.appendChild(varsEl);
|
|
418
|
+
panel.appendChild(queryEl);
|
|
419
|
+
panel.appendChild(typedEl);
|
|
420
|
+
panel.appendChild(timelineWrap);
|
|
421
|
+
panel.appendChild(filtersEl);
|
|
422
|
+
panel.appendChild(filterDiagEl);
|
|
423
|
+
panel.appendChild(small);
|
|
424
|
+
shadow.appendChild(panel);
|
|
425
|
+
document.body.appendChild(host);
|
|
426
|
+
let collapsed = false;
|
|
427
|
+
collapseBtn.addEventListener('click', () => {
|
|
428
|
+
collapsed = !collapsed;
|
|
429
|
+
if (collapsed) {
|
|
430
|
+
panel.style.maxHeight = '24px';
|
|
431
|
+
panel.style.overflow = 'hidden';
|
|
432
|
+
collapseBtn.textContent = '+';
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
panel.style.maxHeight = '50vh';
|
|
436
|
+
panel.style.overflow = 'auto';
|
|
437
|
+
collapseBtn.textContent = '−';
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
let unsub;
|
|
441
|
+
closeBtn.addEventListener('click', () => {
|
|
442
|
+
host.remove();
|
|
443
|
+
if (typeof unsub === 'function') {
|
|
444
|
+
unsub();
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
let lastQuery;
|
|
448
|
+
let lastSearch;
|
|
449
|
+
function diffQueries(prev, next) {
|
|
450
|
+
const added = [];
|
|
451
|
+
const removed = [];
|
|
452
|
+
const changed = [];
|
|
453
|
+
const unchanged = [];
|
|
454
|
+
const prevKeys = new Set(Object.keys(prev ?? {}));
|
|
455
|
+
const nextKeys = new Set(Object.keys(next));
|
|
456
|
+
nextKeys.forEach((k) => {
|
|
457
|
+
if (!prevKeys.has(k)) {
|
|
458
|
+
added.push(k);
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
let pv;
|
|
462
|
+
if (prev != null) {
|
|
463
|
+
pv = prev[k];
|
|
464
|
+
}
|
|
465
|
+
const nv = next[k];
|
|
466
|
+
let same = false;
|
|
467
|
+
if (Array.isArray(pv) && Array.isArray(nv)) {
|
|
468
|
+
if (pv.length === nv.length) {
|
|
469
|
+
same = pv.every((v, i) => {
|
|
470
|
+
return v === nv[i];
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
same = pv === nv;
|
|
476
|
+
}
|
|
477
|
+
if (same) {
|
|
478
|
+
unchanged.push(k);
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
changed.push(k);
|
|
482
|
+
}
|
|
483
|
+
prevKeys.delete(k);
|
|
589
484
|
});
|
|
485
|
+
prevKeys.forEach((k) => {
|
|
486
|
+
removed.push(k);
|
|
487
|
+
});
|
|
488
|
+
return { added, removed, changed, unchanged };
|
|
590
489
|
}
|
|
490
|
+
function render() {
|
|
491
|
+
try {
|
|
492
|
+
const entry = context.get();
|
|
493
|
+
pathEl.textContent = `${entry.location.pathname}${entry.location.search}`;
|
|
494
|
+
const varsJson = JSON.stringify(entry.route?.params ?? {}, null, 2);
|
|
495
|
+
varsEl.textContent = `vars: ${varsJson}`;
|
|
496
|
+
const rawJson = JSON.stringify(entry.query, null, 2);
|
|
497
|
+
queryEl.textContent = `raw: ${rawJson}`;
|
|
498
|
+
const typedJson = JSON.stringify(entry.typedQuery, null, 2);
|
|
499
|
+
typedEl.textContent = `typed:${typedJson}`;
|
|
500
|
+
const filtersJson = JSON.stringify(entry.filters, null, 2);
|
|
501
|
+
filtersEl.textContent = `filters:${filtersJson}`;
|
|
502
|
+
const diag = entry.filterDiagnostics ?? [];
|
|
503
|
+
filterDiagEl.textContent = `filterDiagnostics: ${diag.length}`;
|
|
504
|
+
if (entry.rawSearch !== lastSearch) {
|
|
505
|
+
const nowQuery = entry.query;
|
|
506
|
+
const diff = diffQueries(lastQuery, nowQuery);
|
|
507
|
+
const row = document.createElement('div');
|
|
508
|
+
row.style.display = 'flex';
|
|
509
|
+
row.style.flexDirection = 'column';
|
|
510
|
+
row.style.borderBottom = '1px solid #e9e9e9';
|
|
511
|
+
row.style.padding = '3px 4px';
|
|
512
|
+
const head = document.createElement('div');
|
|
513
|
+
head.style.display = 'flex';
|
|
514
|
+
head.style.justifyContent = 'space-between';
|
|
515
|
+
const ts = new Date().toLocaleTimeString();
|
|
516
|
+
let searchDisplay = '(empty)';
|
|
517
|
+
if (entry.location.search !== '') {
|
|
518
|
+
searchDisplay = entry.location.search;
|
|
519
|
+
}
|
|
520
|
+
head.innerHTML = `<strong>${ts}</strong> <code style="background:#eee;padding:1px 3px;border-radius:3px;">${searchDisplay}</code>`;
|
|
521
|
+
const body = document.createElement('div');
|
|
522
|
+
body.style.display = 'flex';
|
|
523
|
+
body.style.flexWrap = 'wrap';
|
|
524
|
+
body.style.gap = '4px';
|
|
525
|
+
function pill(label, kind) {
|
|
526
|
+
const span = document.createElement('span');
|
|
527
|
+
span.textContent = label;
|
|
528
|
+
span.style.padding = '1px 4px';
|
|
529
|
+
span.style.borderRadius = '10px';
|
|
530
|
+
span.style.fontSize = '10px';
|
|
531
|
+
span.style.border = '1px solid';
|
|
532
|
+
switch (kind) {
|
|
533
|
+
case 'added':
|
|
534
|
+
span.style.background = '#e6ffed';
|
|
535
|
+
span.style.borderColor = '#2cbe4e';
|
|
536
|
+
span.style.color = '#22863a';
|
|
537
|
+
break;
|
|
538
|
+
case 'removed':
|
|
539
|
+
span.style.background = '#ffeef0';
|
|
540
|
+
span.style.borderColor = '#d73a49';
|
|
541
|
+
span.style.color = '#cb2431';
|
|
542
|
+
break;
|
|
543
|
+
case 'changed':
|
|
544
|
+
span.style.background = '#fff5b1';
|
|
545
|
+
span.style.borderColor = '#ffd33d';
|
|
546
|
+
span.style.color = '#735c0f';
|
|
547
|
+
break;
|
|
548
|
+
case 'unchanged':
|
|
549
|
+
span.style.background = '#f1f8ff';
|
|
550
|
+
span.style.borderColor = '#79b8ff';
|
|
551
|
+
span.style.color = '#0366d6';
|
|
552
|
+
break;
|
|
553
|
+
default:
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
return span;
|
|
557
|
+
}
|
|
558
|
+
if (diff.added.length > 0) {
|
|
559
|
+
body.append(...diff.added.map((k) => {
|
|
560
|
+
return pill(`+${k}`, 'added');
|
|
561
|
+
}));
|
|
562
|
+
}
|
|
563
|
+
if (diff.changed.length > 0) {
|
|
564
|
+
body.append(...diff.changed.map((k) => {
|
|
565
|
+
return pill(`~${k}`, 'changed');
|
|
566
|
+
}));
|
|
567
|
+
}
|
|
568
|
+
if (diff.removed.length > 0) {
|
|
569
|
+
body.append(...diff.removed.map((k) => {
|
|
570
|
+
return pill(`-${k}`, 'removed');
|
|
571
|
+
}));
|
|
572
|
+
}
|
|
573
|
+
const noAdds = diff.added.length === 0;
|
|
574
|
+
const noChanges = diff.changed.length === 0;
|
|
575
|
+
const noRemovals = diff.removed.length === 0;
|
|
576
|
+
if (noAdds && noChanges && noRemovals) {
|
|
577
|
+
body.append(pill('no-change', 'unchanged'));
|
|
578
|
+
}
|
|
579
|
+
row.appendChild(head);
|
|
580
|
+
row.appendChild(body);
|
|
581
|
+
timeline.appendChild(row);
|
|
582
|
+
if (timeline.childElementCount > 50) {
|
|
583
|
+
const first = timeline.firstElementChild;
|
|
584
|
+
if (first != null) {
|
|
585
|
+
timeline.removeChild(first);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
lastQuery = nowQuery;
|
|
589
|
+
lastSearch = entry.rawSearch;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
catch {
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
render();
|
|
596
|
+
unsub = context.subscribe(() => {
|
|
597
|
+
render();
|
|
598
|
+
});
|
|
599
|
+
window.addEventListener('keydown', (ev) => {
|
|
600
|
+
try {
|
|
601
|
+
const parts = [];
|
|
602
|
+
if (ev.altKey)
|
|
603
|
+
parts.push('Alt');
|
|
604
|
+
if (ev.shiftKey)
|
|
605
|
+
parts.push('Shift');
|
|
606
|
+
if (ev.ctrlKey)
|
|
607
|
+
parts.push('Ctrl');
|
|
608
|
+
let keyPart = ev.key;
|
|
609
|
+
if (ev.key.length === 1) {
|
|
610
|
+
keyPart = ev.key.toUpperCase();
|
|
611
|
+
}
|
|
612
|
+
parts.push(keyPart);
|
|
613
|
+
const combo = parts.join('+');
|
|
614
|
+
if (combo === devtoolsShortcut.replace(/\s+/g, '')) {
|
|
615
|
+
if (host.style.display === 'none') {
|
|
616
|
+
host.style.display = 'block';
|
|
617
|
+
}
|
|
618
|
+
else {
|
|
619
|
+
host.style.display = 'none';
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
catch {
|
|
624
|
+
}
|
|
625
|
+
});
|
|
591
626
|
}
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
}
|
|
627
|
+
}
|
|
628
|
+
catch {
|
|
629
|
+
}
|
|
595
630
|
}
|
|
596
631
|
return { cleanup, context };
|
|
597
632
|
}
|
|
598
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBa0R0RCxNQUFNLENBQUMsT0FBTyxVQUFVLFlBQVksQ0FDbEMsTUFBeUIsRUFDekIsT0FNSSxFQUFFO0lBR04sSUFBSSxjQUF1QixDQUFDO0lBQzVCLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQixJQUFJLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztJQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUN4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxDQUNMLE9BQU8sT0FBTyxLQUFLLFdBQVc7b0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FDdEMsQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNMLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7UUFDckQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMs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QkFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE1BQU0sQ0FBQztZQUVULENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUdGLElBQUksQ0FBQyxjQUFjLElBQUksYUFBYSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFFdkUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBUSxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLGtCQUFrQixLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUdoRSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7d0JBQzFDLE9BQU87d0JBQ1AsT0FBTyxFQUFFOzRCQUNQLE1BQU0sRUFBRSxjQUFjOzRCQUN0QixLQUFLLEVBQUUsYUFBYTs0QkFDcEIsUUFBUSxFQUFFLGdCQUFnQjt5QkFDM0I7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO1lBRVQsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnVpbGRSb3V0ZXMgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJIaXN0b3J5IH0gZnJvbSAnLi4vaGlzdG9yeS9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNYXRjaGVkUm91dGUsIHByZXBhcmVNYXRjaCB9IGZyb20gJy4uL3Rvb2xzLmpzJztcbmltcG9ydCB7IHBhcnNlVHlwZWRRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LWRzbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IHsgYnVpbGRTZWFyY2ggfSBmcm9tICcuLi90b29scy9idWlsZFNlYXJjaC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlLFxuICBSb3V0ZUVudHJ5LFxuICBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIFN1YnNjcmliZUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55Pjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlcihcbiAgcm91dGVzOiBSb3V0ZTxhbnksIGFueT5bXSxcbiAgb3B0czoge1xuICAgIGRldnRvb2xzPzpcbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCB7IGdsb2JhbD86IGJvb2xlYW47IHBhbmVsPzogYm9vbGVhbjsgc2hvcnRjdXQ/OiBzdHJpbmcgfTtcbiAgICAvKiogV2hlbiB0cnVlLCBjb25zZWN1dGl2ZSBuYXZpZ2F0ZSgpIGNhbGxzIGluIHNhbWUgbWljcm90YXNrIGF1dG/igJFjb2FsZXNjZSAodW5sZXNzIGltbWVkaWF0ZTogdHJ1ZSkuICovXG4gICAgYXV0b0JhdGNoPzogYm9vbGVhbjtcbiAgfSA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuIHtcbiAgLy8gTm9ybWFsaXplIGRldnRvb2xzIG9wdGlvbnMgbWFpbnRhaW5pbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRldnRvb2xzR2xvYmFsOiBib29sZWFuO1xuICBsZXQgZGV2dG9vbHNQYW5lbCA9IGZhbHNlO1xuICBsZXQgZGV2dG9vbHNTaG9ydGN1dCA9ICdBbHQrU2hpZnQrUic7XG4gIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBiYXNlRW5hYmxlZCA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICBkZXZ0b29sc0dsb2JhbCA9IG9wdHMuZGV2dG9vbHMuZ2xvYmFsID8/IGJhc2VFbmFibGVkO1xuICAgIGRldnRvb2xzUGFuZWwgPSAhIW9wdHMuZGV2dG9vbHMucGFuZWw7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdHMuZGV2dG9vbHMuc2hvcnRjdXQgPT09ICdzdHJpbmcnICYmXG4gICAgICBvcHRzLmRldnRvb2xzLnNob3J0Y3V0LnRyaW0oKSAhPT0gJydcbiAgICApIHtcbiAgICAgIGRldnRvb2xzU2hvcnRjdXQgPSBvcHRzLmRldnRvb2xzLnNob3J0Y3V0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBib29sZWFuIG9yIHVuZGVmaW5lZFxuICAgIGNvbnN0IGVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLmRldnRvb2xzID09PSAnYm9vbGVhbicpIHJldHVybiBvcHRzLmRldnRvb2xzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBlbmFibGVkO1xuICB9XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIC8vIEJ1aWxkIGEgZmxhdCBsaXN0IG9mIHJvdXRlcyBmb3IgZWZmaWNpZW50IG1hdGNoaW5nXG4gIGNvbnN0IGZsYXRSb3V0ZXMgPSBidWlsZFJvdXRlcyhyb3V0ZXMpO1xuXG4gIC8vIEZpbmQgdGhlIGluaXRpYWwgcm91dGUgbWF0Y2ggYW5kIHByZXBhcmUgaXQgZm9yIHJlbmRlcmluZ1xuICBjb25zdCByb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBoaXN0b3J5LmxvY2F0aW9uKTtcbiAgY29uc3QgaW5pdGlhbFJhd1F1ZXJ5ID0gcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCk7XG4gIC8vIERldGVybWluZSBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlIGZvciBpbml0aWFsIGxvYWRcbiAgbGV0IGluaXRpYWxTY2hlbWE6IGFueTtcbiAgLy8gRGV0ZXJtaW5lIG1lcmdlZCBmaWx0ZXIgc2NoZW1hIGZyb20gcm9vdC0+ZGVlcGVzdCAoZGVlcGVzdCBvdmVycmlkZXMgcGVyIGZpZWxkKVxuICAvLyAoRnV0dXJlKSBtZXJnZWQgcm91dGUtbGV2ZWwgZmlsdGVyIHNjaGVtYSBmb3IgaW5pdGlhbCBsb2FkIChub3QgeWV0IGNvbnN1bWVkIGluIGluaXRpYWwgcGFyc2luZylcbiAgLy8gY29uc3QgaW5pdGlhbEZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICBjb25zdCBjb2xsZWN0ZWRGaWx0ZXJzOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1bXSA9XG4gICAgICBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm91dGUucm91dGUucm91dGVzKSB7XG4gICAgICBjb25zdCBtYXliZTogdW5rbm93biA9IChyIGFzIHVua25vd24gYXMgeyBxdWVyeT86IHVua25vd24gfSkucXVlcnk7XG4gICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgciBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKG1heWJlRmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgIG1heWJlRmlsdGVyIGFzIHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGluaXRpYWwgcm91dGUgd291bGQgYmUgYnVpbHQgaGVyZSBpZiBuZWVkZWQgbGF0ZXIuXG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChyb3V0ZSwgaW5pdGlhbFR5cGVkUXVlcnkpO1xuICAvLyBIZWxwZXIgdG8gYnVpbGQgdGhlIHJhdyBxdWVyeSBvYmplY3QgZnJvbSBhIHNlYXJjaCBzdHJpbmdcbiAgbGV0IGN1cnJlbnRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFJhd1F1ZXJ5LFxuICAgIHR5cGVkUXVlcnk6IGluaXRpYWxUeXBlZFF1ZXJ5LFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGlmIChuZXh0Um91dGUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgY29sbGVjdGVkRmlsdGVyczoge1xuICAgICAgICBfX2RlZmluZWQ6IHRydWU7XG4gICAgICAgIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByIG9mIG5leHRSb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWF5YmU6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgcXVlcnk/OiB1bmtub3duIH0pLnF1ZXJ5O1xuICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXliZUZpbHRlcjogdW5rbm93biA9IChcbiAgICAgICAgICByIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgKS5maWx0ZXJTY2hlbWE7XG4gICAgICAgIGlmIChtYXliZUZpbHRlciAhPSBudWxsKSB7XG4gICAgICAgICAgY29sbGVjdGVkRmlsdGVycy5wdXNoKFxuICAgICAgICAgICAgbWF5YmVGaWx0ZXIgYXMgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgPSBjb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgICAgLy8gTWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIG5leHQgcm91dGUgd291bGQgYmUgY29tcHV0ZWQgaGVyZSB3aGVuIGludGVncmF0ZWQuXG4gICAgfVxuICAgIGxldCB0eXBlZFF1ZXJ5ID0gcGFyc2VUeXBlZFF1ZXJ5KHNjaGVtYSwgcXVlcnkpO1xuICAgIC8vIE5vcm1hbGl6YXRpb246IGNsYW1wIHBhZ2UgPj0gMSBpZiBudW1lcmljIHBhZ2UgcHJlc2VudFxuICAgIGxldCBub3JtYWxpemVkID0gZmFsc2U7XG4gICAgY29uc3QgcGcgPSAodHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KS5wYWdlO1xuICAgIGlmICh0eXBlb2YgcGcgPT09ICdudW1iZXInICYmIHBnIDwgMSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB7IC4uLih0eXBlZFF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLCBwYWdlOiAxIH07XG4gICAgICB0eXBlZFF1ZXJ5ID0gY2xvbmU7XG4gICAgICBub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCAoc2FtZSBwYXRobmFtZSkgd2Ugc3RpbGwgbmVlZCB0byByZS1ydW4gcHJlcGFyZVxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH0gZWxzZSBpZiAoIXNhbWVTZWFyY2gpIHtcbiAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWRRdWVyeSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVudHJ5OiBSb3V0ZUVudHJ5PGFueT4gPSB7XG4gICAgICBmb3JjZVJlcmVuZGVyOiBmb3JjZVJlcmVuZGVyIHx8IChzYW1lUGF0aG5hbWUgJiYgIXNhbWVTZWFyY2gpLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgcHJlcGFyZWRNYXRjaDogbmV4dFByZXBhcmVkTWF0Y2gsXG4gICAgICByYXdTZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgIHF1ZXJ5LFxuICAgICAgdHlwZWRRdWVyeSxcbiAgICB9O1xuXG4gICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgaWYgKG5vcm1hbGl6ZWQgJiYgc2NoZW1hICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZFNlYXJjaCh0eXBlZFF1ZXJ5IGFzIGFueSwgc2NoZW1hKTtcbiAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgICAgaGFzaDogJycsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47IC8vIGVhcmx5OiBzdWJzZXF1ZW50IHNldCB3aWxsIHRyaWdnZXIgcmVydW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBlbnRyeSBhbmQgbm90aWZ5IGFsbCBzdWJzY3JpYmVyc1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2sobmV4dEVudHJ5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgLy8gLS0tIE9wdGlvbmFsIGJhdGNoaW5nIHN1cHBvcnQgKG9wdC1pbiB2aWEgbmF2aWdhdGUoeyBiYXRjaDogdHJ1ZSB9KSkgLS0tLS1cbiAgdHlwZSBQZW5kaW5nTmF2ID0ge1xuICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBuYXZpZ2F0aW9uIGV4cGxpY2l0bHkga2VlcHMgcHJpb3IgcXVlcnkgc3RhdGUgKG5vIHJlc2V0KSAqL1xuICAgIGluaGVyaXQ/OiBib29sZWFuO1xuICB9O1xuICBsZXQgcGVuZGluZ05hdnM6IFBlbmRpbmdOYXZbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIC8vIFJvbGxpbmcgbWVyZ2VkIHF1ZXJ5IGZvciBjdXJyZW50IGJhdGNoIChsYXN0IHZhbHVlIHBlciBrZXkgd2lucylcbiAgbGV0IGJhdGNoZWRNZXJnZWRRdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgLy8gS2VlcCByZWZlcmVuY2Ugb2YgbGFzdCBwcm92aWRlZCBxdWVyeSBvYmplY3QgKGZvciBkaWFnbm9zdGljcyAvIGZhbGxiYWNrKVxuICBsZXQgbGFzdEJhdGNoUXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIC8vIExhc3QgcHJvdmlkZWQgZmlsdGVycyArIHNjaGVtYSBpbiBiYXRjaFxuICBsZXQgYmF0Y2hlZEZpbHRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gIGxldCBiYXRjaGVkRmlsdGVyU2NoZW1hOlxuICAgIHwgeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIC8vIC0tLS0gRGV2dG9vbHMgbmF2aWdhdGlvbiBldmVudCBjYWxsYmFjayAoc2V0IGJ5IGR5bmFtaWMgaW1wb3J0KSAtLS0tXG4gIGxldCBkZXZ0b29sc09uTmF2RXZlbnQ6XG4gICAgfCAoKG1ldGE6IHtcbiAgICAgICAga2luZDogc3RyaW5nOyAvLyBuYXZpZ2F0ZSB8IGJhdGNoLWZsdXNoXG4gICAgICAgIG1vZGU6IHN0cmluZzsgLy8gaW1tZWRpYXRlIHwgbWFudWFsIHwgYXV0byB8IG1peGVkXG4gICAgICAgIGNvdW50OiBudW1iZXI7IC8vIG51bWJlciBvZiBtZXJnZWQgbmF2cyAoMSBmb3IgaW1tZWRpYXRlKVxuICAgICAgICBwYXRobmFtZTogc3RyaW5nO1xuICAgICAgICBzZWFyY2g6IHN0cmluZztcbiAgICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICB9KSA9PiB2b2lkKVxuICAgIHwgdW5kZWZpbmVkO1xuICAvLyBUcmFjayBjdXJyZW50IGJhdGNoIG1vZGUgdG8gcmVwb3J0IGluIHRpbWVsaW5lXG4gIGxldCBiYXRjaE1vZGU6ICdtYW51YWwnIHwgJ2F1dG8nIHwgJ21peGVkJyB8IHVuZGVmaW5lZDtcbiAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgaW5jbHVkaW5nIHRoZSBjdXJyZW50IHJvdXRlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyAqL1xuICAvKiogQ29sbGVjdCByb3V0ZSBjaGFpbiAocm9vdC0+ZGVlcGVzdCkgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gY29sbGVjdFJvdXRlQ2hhaW4ocGF0aG5hbWU6IHN0cmluZyk6IGFueVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocGF0aG5hbWUgPT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgaWYgKGN1cnJlbnRFbnRyeS5yb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueVtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgIHBhdGhuYW1lLFxuICAgIH0pO1xuICAgIGlmIChkZXN0Um91dGUgIT0gbnVsbCkgcmV0dXJuIGRlc3RSb3V0ZS5yb3V0ZS5yb3V0ZXMgYXMgYW55W107XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvKiogTWVyZ2UgcXVlcnkgZGVzY3JpcHRvcnMgZnJvbSBhIHJvdXRlIGNoYWluIChkZWVwZXIgb3ZlcnJpZGVzKSAqL1xuICBmdW5jdGlvbiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNoYWluOiBhbnlbXSB8IHVuZGVmaW5lZCk6IGFueSB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgZm9yIChjb25zdCBub2RlIG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBxb2JqID0gKG5vZGUgYXMgeyBxdWVyeT86IFJlY29yZDxzdHJpbmcsIGFueT4gfSkucXVlcnk7XG4gICAgICBpZiAocW9iaiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHFvYmopKSB7XG4gICAgICAgICAgbWVyZ2VkW2tdID0gdjsgLy8gZGVlcGVyIG92ZXJyaWRlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhtZXJnZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG4gIC8qKiBNZXJnZSBmaWx0ZXIgc2NoZW1hIG9iamVjdHMgKHNoYWxsb3cgZmllbGQgb3ZlcnJpZGUpIGZyb20gYSByb3V0ZSBjaGFpbiAqL1xuICBmdW5jdGlvbiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihcbiAgICBjaGFpbjogYW55W10gfCB1bmRlZmluZWQsXG4gICk6IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNoYWluID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGZzID0gKFxuICAgICAgICBub2RlIGFzIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgIH1cbiAgICAgICkuZmlsdGVyU2NoZW1hO1xuICAgICAgaWYgKGZzICE9IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkID8/PSB7fTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWQsIGZzLnNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWQgIT0gbnVsbCkgcmV0dXJuIHsgX19kZWZpbmVkOiB0cnVlLCBzY2hlbWE6IG1lcmdlZCB9O1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIHF1ZXJ5IHNjaGVtYSBmb3IgYSBwYXRobmFtZSAqL1xuICBmdW5jdGlvbiByZXNvbHZlU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiBtZXJnZVF1ZXJ5U2NoZW1hRnJvbUNoYWluKGNvbGxlY3RSb3V0ZUNoYWluKHBhdGhuYW1lKSk7XG4gIH1cbiAgLyoqIFJlc29sdmUgbWVyZ2VkIGZpbHRlciBzY2hlbWEgZm9yIGEgcGF0aG5hbWUgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUZpbHRlclNjaGVtYShcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICApOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtZXJnZUZpbHRlclNjaGVtYUZyb21DaGFpbihjb2xsZWN0Um91dGVDaGFpbihwYXRobmFtZSkpO1xuICB9XG4gIC8qKiBJbnRlcm5hbDogYnVpbGQgZmluYWwgc2VhcmNoICYgbmV4dCBlbnRyeSBmcm9tIHBlbmRpbmcgYmF0Y2ggd2l0aG91dCBzaWRlLWVmZmVjdHMgKi9cbiAgZnVuY3Rpb24gY29hbGVzY2VOYXZpZ2F0aW9ucyhsaXN0OiBQZW5kaW5nTmF2W10pOiB7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PjtcbiAgfSB7XG4gICAgLy8gRGV0ZXJtaW5lIGZpbmFsIHBhdGhuYW1lICYgcmVwbGFjZSBmbGFnXG4gICAgbGV0IHRhcmdldFBhdGhuYW1lID0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHtcbiAgICAgIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnBhdGhuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgcG4gPSBuYXYucGF0aG5hbWU7XG4gICAgICAgIGlmIChwbiA9PT0gJycpIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9ICcvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXRQYXRobmFtZSA9IHBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCByZXBsYWNlRmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IG5hdiBvZiBsaXN0KSB7XG4gICAgICBpZiAobmF2LnJlcGxhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXBsYWNlRmxhZyA9IG5hdi5yZXBsYWNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYXNlIHF1ZXJ5OiBwcmVmZXIgYWNjdW11bGF0ZWQgbWVyZ2VkOyBlbHNlIGxhc3QgZXhwbGljaXQ7IGVsc2Ugc2NhbiBsaXN0OyBlbHNlIGN1cnJlbnQgdHlwZWRcbiAgICBsZXQgYmFzZVF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICBpZiAoYmF0Y2hlZE1lcmdlZFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGJhdGNoZWRNZXJnZWRRdWVyeTtcbiAgICB9IGVsc2UgaWYgKGxhc3RCYXRjaFF1ZXJ5ICE9IG51bGwpIHtcbiAgICAgIGJhc2VRdWVyeSA9IGxhc3RCYXRjaFF1ZXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBjb25zdCBpdGVtID0gbGlzdFtpXTtcbiAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHEgPSBpdGVtLnF1ZXJ5O1xuICAgICAgICAgIGlmIChxICE9IG51bGwgJiYgT2JqZWN0LmtleXMocSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYmFzZVF1ZXJ5ID0gcTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXJzXG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJzID0gYmF0Y2hlZEZpbHRlcnM7XG4gICAgY29uc3QgYmF0Y2hGaWx0ZXJTY2hlbWEgPSBiYXRjaGVkRmlsdGVyU2NoZW1hO1xuICAgIGNvbnN0IHNjaGVtYSA9IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgIGxldCBidWlsZE9wdHM6XG4gICAgICB8IHtcbiAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICB9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYmF0Y2hGaWx0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGZzID0gYmF0Y2hGaWx0ZXJTY2hlbWEgPz8gcmVzb2x2ZUZpbHRlclNjaGVtYSh0YXJnZXRQYXRobmFtZSk7XG4gICAgICBpZiAoZnMgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7IGZpbHRlcnM6IGJhdGNoRmlsdGVycywgZmlsdGVyU2NoZW1hOiBmcyB9O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlUXVlcnksIHNjaGVtYSwgYnVpbGRPcHRzKTtcbiAgICAvLyBDb21wdXRlIG5leHQgZW50cnkgKG9wdGltaXN0aWMpXG4gICAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gdGFyZ2V0UGF0aG5hbWU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoID09PSAnJykge1xuICAgICAgbm9ybWFsaXplZFBhdGggPSAnLyc7XG4gICAgfVxuICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGVmZmVjdGl2ZVNjaGVtYSA9IHNjaGVtYSA/PyByZXNvbHZlU2NoZW1hKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBjb25zdCB0eXBlZCA9IHBhcnNlVHlwZWRRdWVyeShlZmZlY3RpdmVTY2hlbWEsIHJhd1F1ZXJ5T2JqKTtcbiAgICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkKTtcbiAgICBjb25zdCBuZXh0RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgICAgbG9jYXRpb246IHsgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLCBwYXRobmFtZTogbm9ybWFsaXplZFBhdGgsIHNlYXJjaCB9LFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVkLFxuICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICBxdWVyeTogcmF3UXVlcnlPYmosXG4gICAgICB0eXBlZFF1ZXJ5OiB0eXBlZCxcbiAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICByZXR1cm4ge1xuICAgICAgc2VhcmNoLFxuICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfTtcbiAgfVxuICAvKiogQ29hbGVzY2UgcXVldWVkIG5hdmlnYXRpb25zIGludG8gYSBzaW5nbGUgaGlzdG9yeSB1cGRhdGUgKi9cbiAgZnVuY3Rpb24gZmx1c2hOYXZpZ2F0aW9ucygpOiB2b2lkIHtcbiAgICBmbHVzaFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGxpc3QgPSBwZW5kaW5nTmF2cztcbiAgICBwZW5kaW5nTmF2cyA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgcmVwbGFjZTogcmVwbGFjZUZsYWcsXG4gICAgICBuZXh0RW50cnksXG4gICAgfSA9IGNvYWxlc2NlTmF2aWdhdGlvbnMobGlzdCk7XG4gICAgLy8gUmVzZXQgYmF0Y2ggYWNjdW11bGF0b3JzIEFGVEVSIGRlcml2aW5nIHJlc3VsdFxuICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBsYXN0QmF0Y2hRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVycyA9IHVuZGVmaW5lZDtcbiAgICBiYXRjaGVkRmlsdGVyU2NoZW1hID0gdW5kZWZpbmVkO1xuICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTtcbiAgICBjb25zdCBsb2MgPSB7IHBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgaWYgKHJlcGxhY2VGbGFnKSBoaXN0b3J5LnNldChsb2MpO1xuICAgIGVsc2UgaGlzdG9yeS5wdXNoKGxvYyk7XG4gICAgLy8gVGltZWxpbmUgZXZlbnQgZm9yIGJhdGNoIGZsdXNoXG4gICAgbGV0IG1vZGUgPSAnbWFudWFsJztcbiAgICBpZiAoYmF0Y2hNb2RlID09PSAnYXV0bycpIHtcbiAgICAgIG1vZGUgPSAnYXV0byc7XG4gICAgfSBlbHNlIGlmIChiYXRjaE1vZGUgPT09ICdtaXhlZCcpIHtcbiAgICAgIG1vZGUgPSAnbWl4ZWQnO1xuICAgIH1cbiAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICBraW5kOiAnYmF0Y2gtZmx1c2gnLFxuICAgICAgbW9kZSxcbiAgICAgIGNvdW50OiBsaXN0Lmxlbmd0aCxcbiAgICAgIHBhdGhuYW1lLFxuICAgICAgc2VhcmNoLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICAgIGJhdGNoTW9kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBBZnRlciByZXNvbHZlRmlsdGVyU2NoZW1hIGlzIGRlZmluZWQgd2UgY2FuIGFwcGx5IGltcGxpY2l0IHNjaGVtYSBmb3IgYW55IHF1ZXVlZCBiYXRjaCAoaWYgc3RpbGwgcGVuZGluZylcbiAgLyoqIEFwcGx5IHByb3Zpc2lvbmFsIG1lcmdlZCBxdWVyeStmaWx0ZXJzIHVwZGF0ZSAoZHVyaW5nIGJhdGNoaW5nKVxuICAgKiB0byBjdXJyZW50RW50cnkgZm9yIHN5bmNocm9ub3VzIHJlYWRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYShiYXNlUGF0aCk7XG4gICAgICBjb25zdCBtZXJnZWRRID0gYmF0Y2hlZE1lcmdlZFF1ZXJ5ID8/IGxhc3RCYXRjaFF1ZXJ5ID8/IHt9O1xuICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgZmlsdGVyczogYmF0Y2hlZEZpbHRlcnMsXG4gICAgICAgICAgZmlsdGVyU2NoZW1hOiBiYXRjaGVkRmlsdGVyU2NoZW1hLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChiYXRjaGVkRmlsdGVycyAhPSBudWxsICYmIGJhdGNoZWRGaWx0ZXJTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgICAvLyBJbXBsaWNpdCByZXNvbHV0aW9uIGZvciBwcm92aXNpb25hbCB2aWV3XG4gICAgICAgIGxldCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCByb3V0ZUNoYWluOlxuICAgICAgICAgIHwge1xuICAgICAgICAgICAgICBmaWx0ZXJTY2hlbWE/OiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9W11cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGJhc2VQYXRoID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICAgICAgICBpZiAoY3VycmVudEVudHJ5LnJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBjdXJyZW50RW50cnkucm91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVzdFJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiBiYXNlUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZGVzdFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJvdXRlQ2hhaW4gPSBkZXN0Um91dGUucm91dGUucm91dGVzIGFzIGFueTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdXRlQ2hhaW4gIT0gbnVsbCkge1xuICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiByb3V0ZUNoYWluKSB7XG4gICAgICAgICAgICBjb25zdCBmcyA9IChcbiAgICAgICAgICAgICAgbm9kZSBhcyB7XG4gICAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hPzogeyBfX2RlZmluZWQ6IHRydWU7IHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIG1lcmdlZCA/Pz0ge307XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBmcy5zY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWVyZ2VkICE9IG51bGwpIHtcbiAgICAgICAgICBidWlsZE9wdHMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJzOiBiYXRjaGVkRmlsdGVycyxcbiAgICAgICAgICAgIGZpbHRlclNjaGVtYTogeyBfX2RlZmluZWQ6IHRydWUsIHNjaGVtYTogbWVyZ2VkIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcHJvdmlzaW9uYWxTZWFyY2ggPSBidWlsZFNlYXJjaChtZXJnZWRRLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICBjb25zdCBwYXRoQ2hhbmdlZCA9IGJhc2VQYXRoICE9PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBpZiAocHJvdmlzaW9uYWxTZWFyY2ggIT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2ggfHwgcGF0aENoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoc2NoZW1hLCBtZXJnZWRRKTtcbiAgICAgICAgY29uc3QgcmF3UXVlcnlPYmogPSBwYXJzZVJhd1F1ZXJ5KHByb3Zpc2lvbmFsU2VhcmNoKTtcbiAgICAgICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgICAgICBsb2NhdGlvbjoge1xuICAgICAgICAgICAgLi4uY3VycmVudEVudHJ5LmxvY2F0aW9uLFxuICAgICAgICAgICAgcGF0aG5hbWU6IGJhc2VQYXRoLFxuICAgICAgICAgICAgc2VhcmNoOiBwcm92aXNpb25hbFNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhd1NlYXJjaDogcHJvdmlzaW9uYWxTZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF1dG9CYXRjaCA9IG9wdHMuYXV0b0JhdGNoID09PSB0cnVlO1xuICBjb25zdCBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8YW55PiA9IHtcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRmlsdGVyU2NoZW1hKHBhdGhuYW1lKTtcbiAgICB9LFxuICAgIGN1cnJlbnRNZXJnZWRGaWx0ZXJTY2hlbWEoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbHRlclNjaGVtYShjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUocGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHJldHVybjtcbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZChwYXRobmFtZTogc3RyaW5nKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuICAgICAgcHJlcGFyZU1hdGNoKG1hdGNoZXMpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrOiBTdWJzY3JpYmVDYWxsYmFjazxhbnk+KSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICAgIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlcGxhY2UsXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgYmF0Y2gsXG4gICAgICBpbW1lZGlhdGUsXG4gICAgICBpbmhlcml0LFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgcmVwbGFjZT86IGJvb2xlYW47XG4gICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIGZpbHRlclNjaGVtYT86IHsgX19kZWZpbmVkOiB0cnVlOyBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIGFueT4gfTtcbiAgICAgIGJhdGNoPzogYm9vbGVhbjtcbiAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW47XG4gICAgICBpbmhlcml0PzogYm9vbGVhbjtcbiAgICB9KTogdm9pZCB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVJbmhlcml0ID0gaW5oZXJpdCA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgd2FudHNCYXRjaCA9XG4gICAgICAgICAgYmF0Y2ggPT09IHRydWUgfHxcbiAgICAgICAgICAoYXV0b0JhdGNoICYmIGltbWVkaWF0ZSAhPT0gdHJ1ZSAmJiBiYXRjaCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAod2FudHNCYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG5hdjogUGVuZGluZ05hdiA9IHt9O1xuICAgICAgICAgIGlmIChwYXRobmFtZSAhPT0gdW5kZWZpbmVkKSBuYXYucGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgICAgICBpZiAocXVlcnkgIT09IHVuZGVmaW5lZCkgbmF2LnF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgaWYgKHJlcGxhY2UgIT09IHVuZGVmaW5lZCkgbmF2LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgICAgICAgIGlmIChmaWx0ZXJzICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICBpZiAoZmlsdGVyU2NoZW1hICE9PSB1bmRlZmluZWQpIG5hdi5maWx0ZXJTY2hlbWEgPSBmaWx0ZXJTY2hlbWE7XG4gICAgICAgICAgaWYgKGVmZmVjdGl2ZUluaGVyaXQpIG5hdi5pbmhlcml0ID0gdHJ1ZTtcbiAgICAgICAgICBwZW5kaW5nTmF2cyA/Pz0gW107XG4gICAgICAgICAgcGVuZGluZ05hdnMucHVzaChuYXYpO1xuICAgICAgICAgIGxldCB0aGlzTW9kZTogJ21hbnVhbCcgfCAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoID09PSB0cnVlKSB0aGlzTW9kZSA9ICdtYW51YWwnO1xuICAgICAgICAgIGVsc2UgdGhpc01vZGUgPSAnYXV0byc7XG4gICAgICAgICAgaWYgKGJhdGNoTW9kZSA9PSBudWxsKSBiYXRjaE1vZGUgPSB0aGlzTW9kZTtcbiAgICAgICAgICBlbHNlIGlmIChiYXRjaE1vZGUgIT09IHRoaXNNb2RlKSBiYXRjaE1vZGUgPSAnbWl4ZWQnO1xuICAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5oZXJpdCkge1xuICAgICAgICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgICAgICBiYXRjaGVkTWVyZ2VkUXVlcnkgPz9cbiAgICAgICAgICAgICAgICBsYXN0QmF0Y2hRdWVyeSA/P1xuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAgY3VycmVudEVudHJ5LnF1ZXJ5ID8/XG4gICAgICAgICAgICAgICAge307XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4uYmFzZSwgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJhdGNoZWRNZXJnZWRRdWVyeSA9IHsgLi4ucXVlcnkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RCYXRjaFF1ZXJ5ID0gcXVlcnk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGJhdGNoZWRGaWx0ZXJzID0gZmlsdGVycztcbiAgICAgICAgICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkgYmF0Y2hlZEZpbHRlclNjaGVtYSA9IGZpbHRlclNjaGVtYTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmbHVzaFNjaGVkdWxlZCkge1xuICAgICAgICAgICAgZmx1c2hTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbHVzaE5hdmlnYXRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXBwbHlQcm92aXNpb25hbEJhdGNoVXBkYXRlKHBhdGhuYW1lKTtcbiAgICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgICAgICAgY2IoY3VycmVudEVudHJ5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW1tZWRpYXRlIG5hdmlnYXRpb25cbiAgICAgICAgbGV0IGJhc2U6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlZmZlY3RpdmVJbmhlcml0KSB7XG4gICAgICAgICAgYmFzZSA9IHsgLi4uKGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fSkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkge1xuICAgICAgICAgIGlmIChiYXNlICE9IG51bGwpIE9iamVjdC5hc3NpZ24oYmFzZSwgcXVlcnkpO1xuICAgICAgICAgIGVsc2UgYmFzZSA9IHF1ZXJ5O1xuICAgICAgICB9XG4gICAgICAgIGJhc2UgPz89IGN1cnJlbnRFbnRyeS50eXBlZFF1ZXJ5ID8/IGN1cnJlbnRFbnRyeS5xdWVyeSA/PyB7fTtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGhuYW1lID8/IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYSh0YXJnZXRQYXRoKTtcbiAgICAgICAgbGV0IGJ1aWxkT3B0czpcbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgZmlsdGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgZmlsdGVyU2NoZW1hOiB7IF9fZGVmaW5lZDogdHJ1ZTsgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmcyA9IGZpbHRlclNjaGVtYSA/PyByZXNvbHZlRmlsdGVyU2NoZW1hKHRhcmdldFBhdGgpO1xuICAgICAgICAgIGlmIChmcyAhPSBudWxsKSBidWlsZE9wdHMgPSB7IGZpbHRlcnMsIGZpbHRlclNjaGVtYTogZnMgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWFyY2ggPSBidWlsZFNlYXJjaChiYXNlLCBzY2hlbWEsIGJ1aWxkT3B0cyk7XG4gICAgICAgIGxldCB0YXJnZXRQYXRobmFtZSA9IHRhcmdldFBhdGg7XG4gICAgICAgIGlmICh0YXJnZXRQYXRobmFtZSA9PT0gJycpIHRhcmdldFBhdGhuYW1lID0gJy8nO1xuICAgICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuICAgICAgICBpZiAodGFyZ2V0UGF0aG5hbWUgIT09IGN1cnJlbnRFbnRyeS5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU2NoZW1hID0gc2NoZW1hID8/IHJlc29sdmVTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuICAgICAgICBjb25zdCByYXdRdWVyeU9iaiA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICAgICAgY29uc3QgdHlwZWQgPSBwYXJzZVR5cGVkUXVlcnkoZWZmZWN0aXZlU2NoZW1hLCByYXdRdWVyeU9iaik7XG4gICAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZU1hdGNoKG5leHRSb3V0ZSwgdHlwZWQpO1xuICAgICAgICBjdXJyZW50RW50cnkgPSB7XG4gICAgICAgICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICAgIC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbixcbiAgICAgICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZWQsXG4gICAgICAgICAgcmF3U2VhcmNoOiBzZWFyY2gsXG4gICAgICAgICAgcXVlcnk6IHJhd1F1ZXJ5T2JqLFxuICAgICAgICAgIHR5cGVkUXVlcnk6IHR5cGVkLFxuICAgICAgICB9IGFzIFJvdXRlRW50cnk8YW55PjtcbiAgICAgICAgbGV0IG5vcm1JbW1lZGlhdGUgPSB0YXJnZXRQYXRobmFtZTtcbiAgICAgICAgaWYgKG5vcm1JbW1lZGlhdGUgPT09ICcnKSBub3JtSW1tZWRpYXRlID0gJy8nO1xuICAgICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IG5vcm1JbW1lZGlhdGUsIHNlYXJjaCwgaGFzaDogJycgfTtcbiAgICAgICAgaWYgKHJlcGxhY2UpIGhpc3Rvcnkuc2V0KGxvY2F0aW9uT2JqKTtcbiAgICAgICAgZWxzZSBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgICBkZXZ0b29sc09uTmF2RXZlbnQ/Lih7XG4gICAgICAgICAga2luZDogJ25hdmlnYXRlJyxcbiAgICAgICAgICBtb2RlOiAnaW1tZWRpYXRlJyxcbiAgICAgICAgICBjb3VudDogMSxcbiAgICAgICAgICBwYXRobmFtZTogbm9ybUltbWVkaWF0ZSxcbiAgICAgICAgICBzZWFyY2gsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIC8vIER5bmFtaWMgZGV2dG9vbHMgbG9hZCAoZGV2IG9ubHkpIC0gc2VwYXJhdGUgY2h1bmsgZm9yIHRyZWUtc2hha2luZ1xuICBpZiAoKGRldnRvb2xzR2xvYmFsIHx8IGRldnRvb2xzUGFuZWwpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtb2Q6IGFueSA9IGF3YWl0IGltcG9ydCgnLi9kZXZ0b29scy5qcycpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCAmJiB0eXBlb2YgbW9kLmluaXRSb3V0ZXJEZXZ0b29scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljLWVzbGludC9tYXgtbGVuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgZGV2dG9vbHNPbk5hdkV2ZW50ID0gbW9kLmluaXRSb3V0ZXJEZXZ0b29scyh7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICBnbG9iYWw6IGRldnRvb2xzR2xvYmFsLFxuICAgICAgICAgICAgICBwYW5lbDogZGV2dG9vbHNQYW5lbCxcbiAgICAgICAgICAgICAgc2hvcnRjdXQ6IGRldnRvb2xzU2hvcnRjdXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiB7IGNsZWFudXAsIGNvbnRleHQgfTtcbn1cbiJdfQ==
|
|
633
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sbUJBQW1CLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWtEOUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxZQUFZLENBQ2xDLE1BQXlCLEVBQ3pCLE9BSUksRUFBRTtJQUdOLElBQUksY0FBdUIsQ0FBQztJQUM1QixJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDckMsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FDTCxPQUFPLE9BQU8sS0FBSyxXQUFXO29CQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQ3RDLENBQUM7WUFDSixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFD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RyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDeEIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2pDLENBQUM7d0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUIsSUFBSSxLQUFLLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzRCQUNuRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dDQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7NEJBQy9CLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7NEJBQzlCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO29CQUFDLE1BQU0sQ0FBQztvQkFFVCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7UUFFVCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVR5cGVkUXVlcnkgfSBmcm9tICcuLi90b29scy9xdWVyeS1kc2wuanMnO1xuaW1wb3J0IHsgcGFyc2VSYXdRdWVyeSB9IGZyb20gJy4uL3Rvb2xzL3F1ZXJ5LmpzJztcbmltcG9ydCB7IGJ1aWxkU2VhcmNoIH0gZnJvbSAnLi4vdG9vbHMvYnVpbGRTZWFyY2guanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZUZpbHRlcnMgfSBmcm9tICdAcGx1bWlsZS9maWx0ZXItcXVlcnknO1xuaW1wb3J0IHR5cGUge1xuICBSb3V0ZSxcbiAgUm91dGVFbnRyeSxcbiAgUm91dGluZ0NvbnRleHRUeXBlLFxuICBTdWJzY3JpYmVDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm4gPSB7XG4gIC8qKiBGdW5jdGlvbiB0byBjbGVhbiB1cCByb3V0ZXIgbGlzdGVuZXJzIGFuZCByZXNvdXJjZXMgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIFJvdXRlciBjb250ZXh0IG9iamVjdCBmb3IgdGhlIFJlYWN0IENvbnRleHQgUHJvdmlkZXIgKi9cbiAgY29udGV4dDogUm91dGluZ0NvbnRleHRUeXBlPGFueT47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoXG4gIHJvdXRlczogUm91dGU8YW55LCBhbnk+W10sXG4gIG9wdHM6IHtcbiAgICBkZXZ0b29scz86XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgeyBnbG9iYWw/OiBib29sZWFuOyBwYW5lbD86IGJvb2xlYW47IHNob3J0Y3V0Pzogc3RyaW5nIH07XG4gIH0gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybiB7XG4gIC8vIE5vcm1hbGl6ZSBkZXZ0b29scyBvcHRpb25zIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGxldCBkZXZ0b29sc0dsb2JhbDogYm9vbGVhbjtcbiAgbGV0IGRldnRvb2xzUGFuZWwgPSBmYWxzZTtcbiAgbGV0IGRldnRvb2xzU2hvcnRjdXQgPSAnQWx0K1NoaWZ0K1InO1xuICBpZiAodHlwZW9mIG9wdHMuZGV2dG9vbHMgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYmFzZUVuYWJsZWQgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgZGV2dG9vbHNHbG9iYWwgPSBvcHRzLmRldnRvb2xzLmdsb2JhbCA/PyBiYXNlRW5hYmxlZDtcbiAgICBkZXZ0b29sc1BhbmVsID0gISFvcHRzLmRldnRvb2xzLnBhbmVsO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBvcHRzLmRldnRvb2xzLnNob3J0Y3V0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgb3B0cy5kZXZ0b29scy5zaG9ydGN1dC50cmltKCkgIT09ICcnXG4gICAgKSB7XG4gICAgICBkZXZ0b29sc1Nob3J0Y3V0ID0gb3B0cy5kZXZ0b29scy5zaG9ydGN1dDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gYm9vbGVhbiBvciB1bmRlZmluZWRcbiAgICBjb25zdCBlbmFibGVkID0gKCgpID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0cy5kZXZ0b29scyA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gb3B0cy5kZXZ0b29scztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGRldnRvb2xzR2xvYmFsID0gZW5hYmxlZDtcbiAgfVxuICAvLyBJbml0aWFsaXplIGJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VyXG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgQnJvd3Nlckhpc3RvcnkoKTtcblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxSYXdRdWVyeSA9IHBhcnNlUmF3UXVlcnkoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpO1xuICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCByb3V0ZSBmb3IgaW5pdGlhbCBsb2FkXG4gIGxldCBpbml0aWFsU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiByb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgIGlmIChtYXliZSAhPSBudWxsKSB7XG4gICAgICAgIGNvbGxlY3RlZC5wdXNoKG1heWJlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICBpbml0aWFsU2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW5pdGlhbFR5cGVkUXVlcnkgPSBwYXJzZVR5cGVkUXVlcnkoaW5pdGlhbFNjaGVtYSwgaW5pdGlhbFJhd1F1ZXJ5KTtcbiAgLy8gRGV0ZXJtaW5lIGZpbHRlciBzY2hlbWEgZnJvbSBkZWVwZXN0IHJvdXRlXG4gIGxldCBpbml0aWFsRmlsdGVyU2NoZW1hOiBhbnk7XG4gIGlmIChyb3V0ZSAhPSBudWxsKSB7XG4gICAgY29uc3QgY29sbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiByb3V0ZS5yb3V0ZS5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IGZpbHRlclNjaGVtYT86IHVua25vd24gfSlcbiAgICAgICAgLmZpbHRlclNjaGVtYTtcbiAgICAgIGlmIChtYXliZSAhPSBudWxsKSBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgfVxuICAgIGlmIChjb2xsZWN0ZWQubGVuZ3RoID4gMCkgaW5pdGlhbEZpbHRlclNjaGVtYSA9IGNvbGxlY3RlZC5hdCgtMSk7XG4gIH1cbiAgbGV0IGluaXRpYWxGaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGluaXRpYWxGaWx0ZXJEaWFnbm9zdGljczogYW55W10gfCB1bmRlZmluZWQ7XG4gIGlmIChpbml0aWFsRmlsdGVyU2NoZW1hICE9IG51bGwpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsIGluaXRpYWxGaWx0ZXJTY2hlbWEpO1xuICAgIGluaXRpYWxGaWx0ZXJzID0gcGFyc2VkLmZpbHRlcnMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpbml0aWFsRmlsdGVyRGlhZ25vc3RpY3MgPSBwYXJzZWQuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICB9XG4gIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gocm91dGUsIGluaXRpYWxUeXBlZFF1ZXJ5KTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlRW50cnk8YW55PiA9IHtcbiAgICBmb3JjZVJlcmVuZGVyOiBmYWxzZSxcbiAgICBsb2NhdGlvbjogaGlzdG9yeS5sb2NhdGlvbixcbiAgICByb3V0ZSxcbiAgICBwcmVwYXJlZE1hdGNoLFxuICAgIHJhd1NlYXJjaDogaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gsXG4gICAgcXVlcnk6IGluaXRpYWxSYXdRdWVyeSxcbiAgICB0eXBlZFF1ZXJ5OiBpbml0aWFsVHlwZWRRdWVyeSxcbiAgICBmaWx0ZXJzOiBpbml0aWFsRmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbEZpbHRlckRpYWdub3N0aWNzLFxuICB9O1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBjb25zdCBpbml0VHlwZWQgPSBjdXJyZW50RW50cnkudHlwZWRRdWVyeSBhcyB1bmtub3duIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgdW5kZWZpbmVkO1xuICBsZXQgaW5pdFBhZ2U6IHVua25vd247XG4gIGlmIChpbml0VHlwZWQgIT0gbnVsbCkge1xuICAgIGluaXRQYWdlID0gaW5pdFR5cGVkLnBhZ2U7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBpbml0UGFnZSA9PT0gJ251bWJlcicgJiZcbiAgICBpbml0UGFnZSA8IDEgJiZcbiAgICBpbml0aWFsU2NoZW1hICE9IG51bGwgJiZcbiAgICBpbml0VHlwZWQgIT0gbnVsbFxuICApIHtcbiAgICBjb25zdCBub3JtID0geyAuLi5pbml0VHlwZWQsIHBhZ2U6IDEgfSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRTZWFyY2gobm9ybSwgaW5pdGlhbFNjaGVtYSk7XG4gICAgaWYgKG5vcm1hbGl6ZWRTZWFyY2ggIT09IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFpbnRhaW4gYSBzZXQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIGFjdGl2ZSByb3V0ZSBlbnRyeVxuICBsZXQgbmV4dElkID0gMDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPG51bWJlciwgU3Vic2NyaWJlQ2FsbGJhY2s8YW55Pj4oKTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGNsZWFudXAgPSBoaXN0b3J5LnN1YnNjcmliZSgobG9jYXRpb24sIGZvcmNlUmVyZW5kZXIpID0+IHtcbiAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGNvbnN0IHNhbWVTZWFyY2ggPSBsb2NhdGlvbi5zZWFyY2ggPT09IGN1cnJlbnRFbnRyeS5yYXdTZWFyY2g7XG5cbiAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBzZWFyY2ggY2hhbmdlZCB3ZSBzdGlsbCB3YW50IHRvIHByb3BhZ2F0ZSB0aGUgY2hhbmdlLlxuICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgbGV0IG5leHRSb3V0ZSA9IGN1cnJlbnRFbnRyeS5yb3V0ZTtcblxuICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAvLyBQYXRoIGNoYW5nZWQ6IHJlY29tcHV0ZSBtYXRjaCArIHByZXBhcmVkIGRhdGEgaW5jbHVkaW5nIHF1ZXJ5XG4gICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gICAgICAvLyB3ZSB3aWxsIHNldCBiZWxvdyBhZnRlciBjb21wdXRpbmcgdHlwZWQgcXVlcnlcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkobG9jYXRpb24uc2VhcmNoKTtcbiAgICAvLyBEZXRlcm1pbmUgc2NoZW1hIGZyb20gZGVlcGVzdCBtYXRjaGVkIHJvdXRlXG4gICAgbGV0IHNjaGVtYTogYW55O1xuICAgIGxldCBmaWx0ZXJTY2hlbWE6IGFueTtcbiAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IGZpbHRlckNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgciBvZiBuZXh0Um91dGUucm91dGUucm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgICAgaWYgKG1heWJlICE9IG51bGwpIHtcbiAgICAgICAgICBjb2xsZWN0ZWQucHVzaChtYXliZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF5YmVGOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IGZpbHRlclNjaGVtYT86IHVua25vd24gfSlcbiAgICAgICAgICAuZmlsdGVyU2NoZW1hO1xuICAgICAgICBpZiAobWF5YmVGICE9IG51bGwpIGZpbHRlckNvbGxlY3RlZC5wdXNoKG1heWJlRik7XG4gICAgICB9XG4gICAgICBpZiAoY29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJDb2xsZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWx0ZXJTY2hlbWEgPSBmaWx0ZXJDb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgdHlwZWRRdWVyeSA9IHBhcnNlVHlwZWRRdWVyeShzY2hlbWEsIHF1ZXJ5KTtcbiAgICAvLyBQYXJzZSBmaWx0ZXJzIHVzaW5nIGZpbHRlciBzY2hlbWEgaWYgcHJlc2VudFxuICAgIGxldCBmaWx0ZXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmlsdGVyRGlhZ25vc3RpY3M6IGFueVtdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChmaWx0ZXJTY2hlbWEgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyc2VkRiA9IHBhcnNlRmlsdGVycyhsb2NhdGlvbi5zZWFyY2gsIGZpbHRlclNjaGVtYSk7XG4gICAgICBmaWx0ZXJzID0gcGFyc2VkRi5maWx0ZXJzIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBmaWx0ZXJEaWFnbm9zdGljcyA9IHBhcnNlZEYuZGlhZ25vc3RpY3MgYXMgdW5rbm93bltdO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemF0aW9uOiBjbGFtcCBwYWdlID49IDEgaWYgbnVtZXJpYyBwYWdlIHByZXNlbnRcbiAgICBsZXQgbm9ybWFsaXplZCA9IGZhbHNlO1xuICAgIGNvbnN0IHBnID0gKHR5cGVkUXVlcnkgYXMgUmVjb3JkPHN0cmluZywgYW55PikucGFnZTtcbiAgICBpZiAodHlwZW9mIHBnID09PSAnbnVtYmVyJyAmJiBwZyA8IDEpIHtcbiAgICAgIGNvbnN0IGNsb25lID0geyAuLi4odHlwZWRRdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSwgcGFnZTogMSB9O1xuICAgICAgdHlwZWRRdWVyeSA9IGNsb25lO1xuICAgICAgbm9ybWFsaXplZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgKHNhbWUgcGF0aG5hbWUpIHdlIHN0aWxsIG5lZWQgdG8gcmUtcnVuIHByZXBhcmVcbiAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgbmV4dFByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2gobmV4dFJvdXRlLCB0eXBlZFF1ZXJ5KTtcbiAgICB9IGVsc2UgaWYgKCFzYW1lU2VhcmNoKSB7XG4gICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChuZXh0Um91dGUsIHR5cGVkUXVlcnkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVFbnRyeTxhbnk+ID0ge1xuICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcm91dGU6IG5leHRSb3V0ZSxcbiAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICBxdWVyeSxcbiAgICAgIHR5cGVkUXVlcnksXG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3MsXG4gICAgfTtcblxuICAgIC8vIElmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgdHlwZWQgcXVlcnkgd2UgdHJpZ2dlciBhIHJlcGxhY2Ugd2l0aCBub3JtYWxpemVkIHNlYXJjaFxuICAgIGlmIChub3JtYWxpemVkICYmIHNjaGVtYSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoID0gYnVpbGRDb21iaW5lZFNlYXJjaCh7XG4gICAgICAgIHF1ZXJ5OiB0eXBlZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gbG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZW50cnkgYW5kIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnNcbiAgICBjdXJyZW50RW50cnkgPSBuZXh0RW50cnk7XG4gICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgIGNhbGxiYWNrKG5leHRFbnRyeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxhbnk+ID0ge1xuICAgIGhpc3RvcnksXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeTtcbiAgICB9LFxuICAgIHByZWxvYWRDb2RlKHBhdGhuYW1lKSB7XG4gICAgICAvLyBQcmVsb2FkIGp1c3QgdGhlIGNvbXBvbmVudCBjb2RlIGZvciBhIHJvdXRlIHdpdGhvdXQgc3RvcmluZyB0aGUgcmVzdWx0XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4ud2luZG93LmxvY2F0aW9uLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCBhbGwgcmVzb3VyY2UgcGFnZXMgZm9yIHRoZSBtYXRjaGVkIHJvdXRlXG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQocGF0aG5hbWUpIHtcbiAgICAgIC8vIFByZWxvYWQgYm90aCB0aGUgY29tcG9uZW50IGNvZGUgYW5kIHByZXBhcmVkIGRhdGEgZm9yIGEgcm91dGVcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAuLi53aW5kb3cubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBwcmVwYXJlTWF0Y2gobWF0Y2hlcyk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUoY2FsbGJhY2spIHtcbiAgICAgIC8vIEFkZCBhIG5ldyBzdWJzY3JpYmVyIGFuZCByZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIG5leHRJZCArPSAxO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SWQ7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1zdHlsZVxuICAgICAgY29uc3QgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH07XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IG5hdkZpbHRlcnMsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZSA/PyBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgLy8gRGV0ZXJtaW5lIHNjaGVtYSBvZiBkZXN0aW5hdGlvbiAoaWYgc2FtZSBwYXRoIGFuZCB3ZSBoYXZlIHJvdXRlIHdlIGNhbiByZXVzZSwgZWxzZSByZW1hdGNoKVxuICAgICAgbGV0IHNjaGVtYTogYW55O1xuICAgICAgbGV0IGZpbHRlclNjaGVtYTogYW55O1xuICAgICAgLyoqIENvbGxlY3QgZGVlcGVzdCBxdWVyeSBzY2hlbWEgZnJvbSByb3V0ZSBjaGFpbiAqL1xuICAgICAgZnVuY3Rpb24gY29sbGVjdFNjaGVtYShyb3V0ZXNBcnI6IGFueVtdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmIChyb3V0ZXNBcnIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xsZWN0ZWQ6IGFueVtdID0gW107XG4gICAgICAgIGNvbnN0IGZpbHRlckNvbGxlY3RlZDogYW55W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIHJvdXRlc0Fycikge1xuICAgICAgICAgIGNvbnN0IG1heWJlOiB1bmtub3duID0gKHIgYXMgdW5rbm93biBhcyB7IHF1ZXJ5PzogdW5rbm93biB9KS5xdWVyeTtcbiAgICAgICAgICBpZiAobWF5YmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29sbGVjdGVkLnB1c2gobWF5YmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBtYXliZUY6IHVua25vd24gPSAociBhcyB1bmtub3duIGFzIHsgZmlsdGVyU2NoZW1hPzogdW5rbm93biB9KVxuICAgICAgICAgICAgLmZpbHRlclNjaGVtYTtcbiAgICAgICAgICBpZiAobWF5YmVGICE9IG51bGwpIGZpbHRlckNvbGxlY3RlZC5wdXNoKG1heWJlRik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbGxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2NoZW1hID0gY29sbGVjdGVkLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyQ29sbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmaWx0ZXJTY2hlbWEgPSBmaWx0ZXJDb2xsZWN0ZWQuYXQoLTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocGF0aG5hbWUgPT0gbnVsbCB8fCBwYXRobmFtZSA9PT0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZSkge1xuICAgICAgICBjb2xsZWN0U2NoZW1hKGN1cnJlbnQucm91dGU/LnJvdXRlLnJvdXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZXN0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywge1xuICAgICAgICAgIC4uLndpbmRvdy5sb2NhdGlvbixcbiAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb2xsZWN0U2NoZW1hKGRlc3RSb3V0ZT8ucm91dGUucm91dGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcnMgPSBuYXZGaWx0ZXJzID8/IGN1cnJlbnQuZmlsdGVycztcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHNjaGVtYSxcbiAgICAgICAgZmlsdGVyczogZWZmZWN0aXZlRmlsdGVycyxcbiAgICAgICAgZmlsdGVyU2NoZW1hLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvbk9iaiA9IHsgcGF0aG5hbWU6IHRhcmdldFBhdGhuYW1lLCBzZWFyY2gsIGhhc2g6ICcnIH07XG4gICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICBoaXN0b3J5LnNldChsb2NhdGlvbk9iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaXN0b3J5LnB1c2gobG9jYXRpb25PYmopO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgLy8gUmV0dXJuIGJvdGggdGhlIGNvbnRleHQgb2JqZWN0IGFuZCBhIGNsZWFudXAgZnVuY3Rpb25cbiAgLy8gRGV2dG9vbHMgZXhwb3N1cmUgKGRldmVsb3BtZW50IG9ubHkpXG4gIGlmIChkZXZ0b29sc0dsb2JhbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyB1bmtub3duIGFzIHsgX19QTFVNSUxFX1JPVVRFUl9fPzogYW55IH0pLl9fUExVTUlMRV9ST1VURVJfXyA9XG4gICAgICAgICAge1xuICAgICAgICAgICAgZ2V0OiBjb250ZXh0LmdldCxcbiAgICAgICAgICAgIHN1YnNjcmliZTogY29udGV4dC5zdWJzY3JpYmUsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuICAvLyBPcHRpb25hbCBpbi1wYWdlIGRldnRvb2xzIHBhbmVsIChsaWdodHdlaWdodCBvdmVybGF5KVxuICBpZiAoZGV2dG9vbHNQYW5lbCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWxdJykgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaG9zdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGx1bWlsZS1yb3V0ZXItZGV2dG9vbHMtcGFuZWwnLCAnJyk7XG4gICAgICAgIGhvc3Quc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICBob3N0LnN0eWxlLnpJbmRleCA9ICcyMTQ3NDgzNjQ2JztcbiAgICAgICAgaG9zdC5zdHlsZS5ib3R0b20gPSAnOHB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgICAgICBob3N0LnN0eWxlLmZvbnRGYW1pbHkgPVxuICAgICAgICAgICd1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgXCJMaWJlcmF0aW9uIE1vbm9cIiwgbW9ub3NwYWNlJztcbiAgICAgICAgaG9zdC5zdHlsZS5mb250U2l6ZSA9ICcxMnB4JztcbiAgICAgICAgaG9zdC5zdHlsZS5saW5lSGVpZ2h0ID0gJzEuMyc7XG4gICAgICAgIGhvc3Quc3R5bGUuY29sb3IgPSAnIzExMSc7XG4gICAgICAgIGhvc3Quc3R5bGUuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIGhvc3Quc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBhbmVsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm1pbldpZHRoID0gJzI2MHB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUubWF4V2lkdGggPSAnNDIwcHgnO1xuICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnNTB2aCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICBwYW5lbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMjU1LDI1NSwyNTUsMC45NSknO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNjY2MnO1xuICAgICAgICBwYW5lbC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNnB4JztcbiAgICAgICAgcGFuZWwuc3R5bGUuYm94U2hhZG93ID0gJzAgMnB4IDhweCByZ2JhKDAsMCwwLDAuMTUpJztcbiAgICAgICAgcGFuZWwuc3R5bGUucGFkZGluZyA9ICc2cHggOHB4IDhweCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmJhY2tkcm9wRmlsdGVyID0gJ2JsdXIoNHB4KSc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHBhbmVsLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgcGFuZWwuc3R5bGUucm93R2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVyJztcbiAgICAgICAgaGVhZGVyLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gJ3NwYWNlLWJldHdlZW4nO1xuICAgICAgICBoZWFkZXIuc3R5bGUuZ2FwID0gJzhweCc7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aXRsZS50ZXh0Q29udGVudCA9ICdQbHVtaWxlIFJvdXRlcic7XG4gICAgICAgIHRpdGxlLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBidXR0b25zLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIGJ1dHRvbnMuc3R5bGUuZ2FwID0gJzRweCc7XG4gICAgICAgIGNvbnN0IGNvbGxhcHNlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNvbGxhcHNlQnRuLnRleHRDb250ZW50ID0gJ+KIkic7XG4gICAgICAgIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgIGNsb3NlQnRuLnRleHRDb250ZW50ID0gJ8OXJztcbiAgICAgICAgY29uc3QgYnRuczogSFRNTEJ1dHRvbkVsZW1lbnRbXSA9IFtjb2xsYXBzZUJ0biwgY2xvc2VCdG5dO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnRucykge1xuICAgICAgICAgIGIuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgIGIuc3R5bGUuYmFja2dyb3VuZCA9ICcjZWVlJztcbiAgICAgICAgICBiLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2NjYyc7XG4gICAgICAgICAgYi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNHB4JztcbiAgICAgICAgICBiLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICAgIGIuc3R5bGUubGluZUhlaWdodCA9ICcxJztcbiAgICAgICAgICBiLnN0eWxlLnBhZGRpbmcgPSAnMnB4IDVweCc7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRpdGxlKTtcbiAgICAgICAgYnV0dG9ucy5hcHBlbmRDaGlsZChjb2xsYXBzZUJ0bik7XG4gICAgICAgIGJ1dHRvbnMuYXBwZW5kQ2hpbGQoY2xvc2VCdG4pO1xuICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQoYnV0dG9ucyk7XG4gICAgICAgIGNvbnN0IHBhdGhFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwYXRoRWwuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xuICAgICAgICBjb25zdCB2YXJzRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgY29uc3QgcXVlcnlFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCB0eXBlZEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgICBjb25zdCBmaWx0ZXJEaWFnRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICAgICAgLy8gVGltZWxpbmUgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IHRpbWVsaW5lV3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aW1lbGluZVdyYXAuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uJztcbiAgICAgICAgdGltZWxpbmVXcmFwLnN0eWxlLmdhcCA9ICcycHgnO1xuICAgICAgICB0aW1lbGluZVdyYXAuc3R5bGUubWFyZ2luVG9wID0gJzRweCc7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnRleHRDb250ZW50ID0gJ1RpbWVsaW5lIChxdWVyeSBjaGFuZ2VzKSc7XG4gICAgICAgIHRpbWVsaW5lSGVhZGVyLnN0eWxlLmZvbnRXZWlnaHQgPSAnNjAwJztcbiAgICAgICAgdGltZWxpbmVIZWFkZXIuc3R5bGUuZm9udFNpemUgPSAnMTFweCc7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSAnY29sdW1uLXJldmVyc2UnOyAvLyBuZXdlc3Qgb24gdG9wIHZpc3VhbGx5IHdoaWxlIGFwcGVuZGluZyBhdCBlbmQgZm9yIGNoZWFwZXIgb3BzXG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLm1heEhlaWdodCA9ICcxNDBweCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLm92ZXJmbG93WSA9ICdhdXRvJztcbiAgICAgICAgdGltZWxpbmUuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZTJlMmUyJztcbiAgICAgICAgdGltZWxpbmUuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZhZmJmYyc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZvbnRGYW1pbHkgPSAnaW5oZXJpdCc7XG4gICAgICAgIHRpbWVsaW5lLnN0eWxlLmZvbnRTaXplID0gJzExcHgnO1xuICAgICAgICB0aW1lbGluZVdyYXAuYXBwZW5kQ2hpbGQodGltZWxpbmVIZWFkZXIpO1xuICAgICAgICB0aW1lbGluZVdyYXAuYXBwZW5kQ2hpbGQodGltZWxpbmUpO1xuICAgICAgICBjb25zdCBwcmVzOiBIVE1MUHJlRWxlbWVudFtdID0gW1xuICAgICAgICAgIHZhcnNFbCxcbiAgICAgICAgICBxdWVyeUVsLFxuICAgICAgICAgIHR5cGVkRWwsXG4gICAgICAgICAgZmlsdGVyc0VsLFxuICAgICAgICAgIGZpbHRlckRpYWdFbCxcbiAgICAgICAgXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHByZXMpIHtcbiAgICAgICAgICBwLnN0eWxlLm1hcmdpbiA9ICcwJztcbiAgICAgICAgICBwLnN0eWxlLnBhZGRpbmcgPSAnNHB4JztcbiAgICAgICAgICBwLnN0eWxlLmJhY2tncm91bmQgPSAnI2Y2ZjhmYSc7XG4gICAgICAgICAgcC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNlMmUyZTInO1xuICAgICAgICAgIHAuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzRweCc7XG4gICAgICAgICAgcC5zdHlsZS5vdmVyZmxvd1ggPSAnYXV0byc7XG4gICAgICAgICAgcC5zdHlsZS5tYXhIZWlnaHQgPSAnMTYwcHgnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNtYWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNtYWxsLnN0eWxlLmZvbnRTaXplID0gJzEwcHgnO1xuICAgICAgICBzbWFsbC5zdHlsZS5vcGFjaXR5ID0gJzAuNyc7XG4gICAgICAgIHNtYWxsLnRleHRDb250ZW50ID0gYFNob3J0Y3V0OiAke2RldnRvb2xzU2hvcnRjdXR9YDtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQocGF0aEVsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQodmFyc0VsKTtcbiAgICAgICAgcGFuZWwuYXBwZW5kQ2hpbGQocXVlcnlFbCk7XG4gICAgICAgIHBhbmVsLmFwcGVuZENoaWxkKHR5cGVkRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZCh0aW1lbGluZVdyYXApO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJzRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChmaWx0ZXJEaWFnRWwpO1xuICAgICAgICBwYW5lbC5hcHBlbmRDaGlsZChzbWFsbCk7XG4gICAgICAgIHNoYWRvdy5hcHBlbmRDaGlsZChwYW5lbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gICAgICAgIGxldCBjb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgICAgY29sbGFwc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29sbGFwc2VkID0gIWNvbGxhcHNlZDtcbiAgICAgICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5tYXhIZWlnaHQgPSAnMjRweCc7XG4gICAgICAgICAgICBwYW5lbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAnKyc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm1heEhlaWdodCA9ICc1MHZoJztcbiAgICAgICAgICAgIHBhbmVsLnN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nO1xuICAgICAgICAgICAgY29sbGFwc2VCdG4udGV4dENvbnRlbnQgPSAn4oiSJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdW5zdWI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgaG9zdC5yZW1vdmUoKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHVuc3ViID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB1bnN1YigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBVcGRhdGUgcGFuZWwgY29udGVudCBmcm9tIGN1cnJlbnQgcm91dGUgZW50cnkgKi9cbiAgICAgICAgLy8gS2VlcCBsYXN0IHF1ZXJ5IHNuYXBzaG90IGZvciBkaWZmXG4gICAgICAgIGxldCBsYXN0UXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbGFzdFNlYXJjaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcHV0ZSBkaWZmIGNsYXNzaWZpY2F0aW9uIGJldHdlZW4gdHdvIHF1ZXJ5IG9iamVjdHMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkaWZmUXVlcmllcyhcbiAgICAgICAgICBwcmV2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgKToge1xuICAgICAgICAgIGFkZGVkOiBzdHJpbmdbXTtcbiAgICAgICAgICByZW1vdmVkOiBzdHJpbmdbXTtcbiAgICAgICAgICBjaGFuZ2VkOiBzdHJpbmdbXTtcbiAgICAgICAgICB1bmNoYW5nZWQ6IHN0cmluZ1tdO1xuICAgICAgICB9IHtcbiAgICAgICAgICBjb25zdCBhZGRlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgdW5jaGFuZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHByZXZLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhwcmV2ID8/IHt9KSk7XG4gICAgICAgICAgY29uc3QgbmV4dEtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG5leHQpKTtcbiAgICAgICAgICBuZXh0S2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXByZXZLZXlzLmhhcyhrKSkge1xuICAgICAgICAgICAgICBhZGRlZC5wdXNoKGspO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcHY6IHVua25vd247XG4gICAgICAgICAgICBpZiAocHJldiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIHByZXYgaXMgYSBwbGFpbiByZWNvcmQ7IGRpcmVjdCBpbmRleCAocnVudGltZSBzYWZlKVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgICAgIHB2ID0gKHByZXYgYXMgYW55KVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG52ID0gbmV4dFtrXTtcbiAgICAgICAgICAgIGxldCBzYW1lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwdikgJiYgQXJyYXkuaXNBcnJheShudikpIHtcbiAgICAgICAgICAgICAgaWYgKHB2Lmxlbmd0aCA9PT0gKG52IGFzIHVua25vd25bXSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2FtZSA9IHB2LmV2ZXJ5KCh2LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdiA9PT0gKG52IGFzIHVua25vd25bXSlbaV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNhbWUgPSBwdiA9PT0gbnY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2FtZSkge1xuICAgICAgICAgICAgICB1bmNoYW5nZWQucHVzaChrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNoYW5nZWQucHVzaChrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZLZXlzLmRlbGV0ZShrKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcmV2S2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICByZW1vdmVkLnB1c2goayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgYWRkZWQsIHJlbW92ZWQsIGNoYW5nZWQsIHVuY2hhbmdlZCB9O1xuICAgICAgICB9XG4gICAgICAgIC8qKiBVcGRhdGUgcGFuZWwgY29udGVudCBhbmQgbWF5YmUgcHVzaCB0aW1lbGluZSBlbnRyeSAqL1xuICAgICAgICBmdW5jdGlvbiByZW5kZXIoKTogdm9pZCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gY29udGV4dC5nZXQoKTtcbiAgICAgICAgICAgIHBhdGhFbC50ZXh0Q29udGVudCA9IGAke2VudHJ5LmxvY2F0aW9uLnBhdGhuYW1lfSR7ZW50cnkubG9jYXRpb24uc2VhcmNofWA7XG4gICAgICAgICAgICBjb25zdCB2YXJzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5LnJvdXRlPy5wYXJhbXMgPz8ge30sIG51bGwsIDIpO1xuICAgICAgICAgICAgdmFyc0VsLnRleHRDb250ZW50ID0gYHZhcnM6ICR7dmFyc0pzb259YDtcbiAgICAgICAgICAgIGNvbnN0IHJhd0pzb24gPSBKU09OLnN0cmluZ2lmeShlbnRyeS5xdWVyeSwgbnVsbCwgMik7XG4gICAgICAgICAgICBxdWVyeUVsLnRleHRDb250ZW50ID0gYHJhdzogICR7cmF3SnNvbn1gO1xuICAgICAgICAgICAgY29uc3QgdHlwZWRKc29uID0gSlNPTi5zdHJpbmdpZnkoZW50cnkudHlwZWRRdWVyeSwgbnVsbCwgMik7XG4gICAgICAgICAgICB0eXBlZEVsLnRleHRDb250ZW50ID0gYHR5cGVkOiR7dHlwZWRKc29ufWA7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJzSnNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5LmZpbHRlcnMsIG51bGwsIDIpO1xuICAgICAgICAgICAgZmlsdGVyc0VsLnRleHRDb250ZW50ID0gYGZpbHRlcnM6JHtmaWx0ZXJzSnNvbn1gO1xuICAgICAgICAgICAgY29uc3QgZGlhZyA9IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzID8/IFtdO1xuICAgICAgICAgICAgZmlsdGVyRGlhZ0VsLnRleHRDb250ZW50ID0gYGZpbHRlckRpYWdub3N0aWNzOiAke2RpYWcubGVuZ3RofWA7XG4gICAgICAgICAgICAvLyBUaW1lbGluZSBsb2cgaWYgcXVlcnkgc2VhcmNoIGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChlbnRyeS5yYXdTZWFyY2ggIT09IGxhc3RTZWFyY2gpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm93UXVlcnkgPSBlbnRyeS5xdWVyeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IGRpZmZRdWVyaWVzKGxhc3RRdWVyeSwgbm93UXVlcnkpO1xuICAgICAgICAgICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgcm93LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5mbGV4RGlyZWN0aW9uID0gJ2NvbHVtbic7XG4gICAgICAgICAgICAgIHJvdy5zdHlsZS5ib3JkZXJCb3R0b20gPSAnMXB4IHNvbGlkICNlOWU5ZTknO1xuICAgICAgICAgICAgICByb3cuc3R5bGUucGFkZGluZyA9ICczcHggNHB4JztcbiAgICAgICAgICAgICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICBoZWFkLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgICAgICAgICAgIGhlYWQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSAnc3BhY2UtYmV0d2Vlbic7XG4gICAgICAgICAgICAgIGNvbnN0IHRzID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcbiAgICAgICAgICAgICAgbGV0IHNlYXJjaERpc3BsYXkgPSAnKGVtcHR5KSc7XG4gICAgICAgICAgICAgIGlmIChlbnRyeS5sb2NhdGlvbi5zZWFyY2ggIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoRGlzcGxheSA9IGVudHJ5LmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBoZWFkLmlubmVySFRNTCA9IGA8c3Ryb25nPiR7dHN9PC9zdHJvbmc+IDxjb2RlIHN0eWxlPVwiYmFja2dyb3VuZDojZWVlO3BhZGRpbmc6MXB4IDNweDtib3JkZXItcmFkaXVzOjNweDtcIj4ke3NlYXJjaERpc3BsYXl9PC9jb2RlPmA7XG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgYm9keS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmZsZXhXcmFwID0gJ3dyYXAnO1xuICAgICAgICAgICAgICBib2R5LnN0eWxlLmdhcCA9ICc0cHgnO1xuICAgICAgICAgICAgICAvKiogQ3JlYXRlIGEgY29sb3JlZCBwaWxsIGVsZW1lbnQgKi9cbiAgICAgICAgICAgICAgZnVuY3Rpb24gcGlsbChcbiAgICAgICAgICAgICAgICBsYWJlbDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGtpbmQ6ICdhZGRlZCcgfCAncmVtb3ZlZCcgfCAnY2hhbmdlZCcgfCAndW5jaGFuZ2VkJyxcbiAgICAgICAgICAgICAgKTogSFRNTFNwYW5FbGVtZW50IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLnBhZGRpbmcgPSAnMXB4IDRweCc7XG4gICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMTBweCc7XG4gICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9ICcxMHB4JztcbiAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQnO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJhY2tncm91bmQgPSAnI2U2ZmZlZCc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnIzJjYmU0ZSc7XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSAnIzIyODYzYSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAncmVtb3ZlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZmZlZWYwJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjZDczYTQ5JztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjY2IyNDMxJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlICdjaGFuZ2VkJzpcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmZmY1YjEnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmJvcmRlckNvbG9yID0gJyNmZmQzM2QnO1xuICAgICAgICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gJyM3MzVjMGYnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VuY2hhbmdlZCc6XG4gICAgICAgICAgICAgICAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZCA9ICcjZjFmOGZmJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5ib3JkZXJDb2xvciA9ICcjNzliOGZmJztcbiAgICAgICAgICAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9ICcjMDM2NmQ2JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZXhoYXVzdGl2ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3BhbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZGlmZi5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLmFkZGVkLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGlsbChgKyR7a31gLCAnYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGRpZmYuY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAuLi5kaWZmLmNoYW5nZWQubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwaWxsKGB+JHtrfWAsICdjaGFuZ2VkJyk7XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChkaWZmLnJlbW92ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgLi4uZGlmZi5yZW1vdmVkLm1hcCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGlsbChgLSR7a31gLCAncmVtb3ZlZCcpO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBub0FkZHMgPSBkaWZmLmFkZGVkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgY29uc3Qgbm9DaGFuZ2VzID0gZGlmZi5jaGFuZ2VkLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgICAgY29uc3Qgbm9SZW1vdmFscyA9IGRpZmYucmVtb3ZlZC5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgIGlmIChub0FkZHMgJiYgbm9DaGFuZ2VzICYmIG5vUmVtb3ZhbHMpIHtcbiAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChwaWxsKCduby1jaGFuZ2UnLCAndW5jaGFuZ2VkJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkKTtcbiAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGJvZHkpO1xuICAgICAgICAgICAgICB0aW1lbGluZS5hcHBlbmRDaGlsZChyb3cpO1xuICAgICAgICAgICAgICBpZiAodGltZWxpbmUuY2hpbGRFbGVtZW50Q291bnQgPiA1MCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gdGltZWxpbmUuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRpbWVsaW5lLnJlbW92ZUNoaWxkKGZpcnN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFF1ZXJ5ID0gbm93UXVlcnk7XG4gICAgICAgICAgICAgIGxhc3RTZWFyY2ggPSBlbnRyeS5yYXdTZWFyY2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiBpZ25vcmUgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyKCk7XG4gICAgICAgIHVuc3ViID0gY29udGV4dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXYpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBpZiAoZXYuYWx0S2V5KSBwYXJ0cy5wdXNoKCdBbHQnKTtcbiAgICAgICAgICAgIGlmIChldi5zaGlmdEtleSkgcGFydHMucHVzaCgnU2hpZnQnKTtcbiAgICAgICAgICAgIGlmIChldi5jdHJsS2V5KSBwYXJ0cy5wdXNoKCdDdHJsJyk7XG4gICAgICAgICAgICBsZXQga2V5UGFydCA9IGV2LmtleTtcbiAgICAgICAgICAgIGlmIChldi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIGtleVBhcnQgPSBldi5rZXkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnRzLnB1c2goa2V5UGFydCk7XG4gICAgICAgICAgICBjb25zdCBjb21ibyA9IHBhcnRzLmpvaW4oJysnKTtcbiAgICAgICAgICAgIGlmIChjb21ibyA9PT0gZGV2dG9vbHNTaG9ydGN1dC5yZXBsYWNlKC9cXHMrL2csICcnKSkge1xuICAgICAgICAgICAgICBpZiAoaG9zdC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBob3N0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhvc3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogaWdub3JlICovXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBjbGVhbnVwLCBjb250ZXh0IH07XG59XG4iXX0=
|