@milkio/vite-plugin-milkio 1.3.39 → 1.3.40

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/chunk-tvwsh3py.js DELETED
@@ -1,533 +0,0 @@
1
- import {
2
- require_lib
3
- } from "./chunk-grxb9rka.js";
4
- import {
5
- __commonJSMin,
6
- __require
7
- } from "./chunk-716p476m.js";
8
- import"./chunk-hnjvhpbj.js";
9
- import"./chunk-53gf2b22.js";
10
- import"./chunk-d85ypywj.js";
11
-
12
- // node_modules/vite/dist/node/chunks/postcss-import.js
13
- var require_format_import_prelude = /* @__PURE__ */ __commonJSMin((exports, module) => {
14
- module.exports = function formatImportPrelude(layer, media, supports) {
15
- const parts = [];
16
- if (typeof layer !== "undefined") {
17
- let layerParams = "layer";
18
- if (layer)
19
- layerParams = `layer(${layer})`;
20
- parts.push(layerParams);
21
- }
22
- if (typeof supports !== "undefined")
23
- parts.push(`supports(${supports})`);
24
- if (typeof media !== "undefined")
25
- parts.push(media);
26
- return parts.join(" ");
27
- };
28
- });
29
- var require_base64_encoded_import = /* @__PURE__ */ __commonJSMin((exports, module) => {
30
- const formatImportPrelude = require_format_import_prelude();
31
- module.exports = function base64EncodedConditionalImport(prelude, conditions) {
32
- if (!conditions?.length)
33
- return prelude;
34
- conditions.reverse();
35
- const first = conditions.pop();
36
- let params = `${prelude} ${formatImportPrelude(first.layer, first.media, first.supports)}`;
37
- for (const condition of conditions)
38
- params = `'data:text/css;base64,${Buffer.from(`@import ${params}`).toString("base64")}' ${formatImportPrelude(condition.layer, condition.media, condition.supports)}`;
39
- return params;
40
- };
41
- });
42
- var require_apply_conditions = /* @__PURE__ */ __commonJSMin((exports, module) => {
43
- const base64EncodedConditionalImport = require_base64_encoded_import();
44
- module.exports = function applyConditions(bundle, atRule) {
45
- const firstImportStatementIndex = bundle.findIndex((stmt) => stmt.type === "import");
46
- const lastImportStatementIndex = bundle.findLastIndex((stmt) => stmt.type === "import");
47
- bundle.forEach((stmt, index) => {
48
- if (stmt.type === "charset" || stmt.type === "warning")
49
- return;
50
- if (stmt.type === "layer" && (index < lastImportStatementIndex && stmt.conditions?.length || index > firstImportStatementIndex && index < lastImportStatementIndex)) {
51
- stmt.type = "import";
52
- stmt.node = stmt.node.clone({
53
- name: "import",
54
- params: base64EncodedConditionalImport(`'data:text/css;base64,${Buffer.from(stmt.node.toString()).toString("base64")}'`, stmt.conditions)
55
- });
56
- return;
57
- }
58
- if (!stmt.conditions?.length)
59
- return;
60
- if (stmt.type === "import") {
61
- stmt.node.params = base64EncodedConditionalImport(stmt.fullUri, stmt.conditions);
62
- return;
63
- }
64
- let nodes;
65
- let parent;
66
- if (stmt.type === "layer") {
67
- nodes = [stmt.node];
68
- parent = stmt.node.parent;
69
- } else {
70
- nodes = stmt.nodes;
71
- parent = nodes[0].parent;
72
- }
73
- const atRules = [];
74
- for (const condition of stmt.conditions) {
75
- if (typeof condition.media !== "undefined") {
76
- const mediaNode = atRule({
77
- name: "media",
78
- params: condition.media,
79
- source: parent.source
80
- });
81
- atRules.push(mediaNode);
82
- }
83
- if (typeof condition.supports !== "undefined") {
84
- const supportsNode = atRule({
85
- name: "supports",
86
- params: `(${condition.supports})`,
87
- source: parent.source
88
- });
89
- atRules.push(supportsNode);
90
- }
91
- if (typeof condition.layer !== "undefined") {
92
- const layerNode = atRule({
93
- name: "layer",
94
- params: condition.layer,
95
- source: parent.source
96
- });
97
- atRules.push(layerNode);
98
- }
99
- }
100
- const outerAtRule = atRules.shift();
101
- const innerAtRule = atRules.reduce((previous, next) => {
102
- previous.append(next);
103
- return next;
104
- }, outerAtRule);
105
- parent.insertBefore(nodes[0], outerAtRule);
106
- nodes.forEach((node) => {
107
- node.parent = undefined;
108
- });
109
- nodes[0].raws.before = nodes[0].raws.before || `
110
- `;
111
- innerAtRule.append(nodes);
112
- stmt.type = "nodes";
113
- stmt.nodes = [outerAtRule];
114
- delete stmt.node;
115
- });
116
- };
117
- });
118
- var require_apply_raws = /* @__PURE__ */ __commonJSMin((exports, module) => {
119
- module.exports = function applyRaws(bundle) {
120
- bundle.forEach((stmt, index) => {
121
- if (index === 0)
122
- return;
123
- if (stmt.parent) {
124
- const { before } = stmt.parent.node.raws;
125
- if (stmt.type === "nodes")
126
- stmt.nodes[0].raws.before = before;
127
- else
128
- stmt.node.raws.before = before;
129
- } else if (stmt.type === "nodes")
130
- stmt.nodes[0].raws.before = stmt.nodes[0].raws.before || `
131
- `;
132
- });
133
- };
134
- });
135
- var require_apply_styles = /* @__PURE__ */ __commonJSMin((exports, module) => {
136
- module.exports = function applyStyles(bundle, styles) {
137
- styles.nodes = [];
138
- bundle.forEach((stmt) => {
139
- if ([
140
- "charset",
141
- "import",
142
- "layer"
143
- ].includes(stmt.type)) {
144
- stmt.node.parent = undefined;
145
- styles.append(stmt.node);
146
- } else if (stmt.type === "nodes")
147
- stmt.nodes.forEach((node) => {
148
- node.parent = undefined;
149
- styles.append(node);
150
- });
151
- });
152
- };
153
- });
154
- var require_data_url = /* @__PURE__ */ __commonJSMin((exports, module) => {
155
- const anyDataURLRegexp = /^data:text\/css(?:;(base64|plain))?,/i;
156
- const base64DataURLRegexp = /^data:text\/css;base64,/i;
157
- const plainDataURLRegexp = /^data:text\/css;plain,/i;
158
- function isValid(url) {
159
- return anyDataURLRegexp.test(url);
160
- }
161
- function contents(url) {
162
- if (base64DataURLRegexp.test(url))
163
- return Buffer.from(url.slice(21), "base64").toString();
164
- if (plainDataURLRegexp.test(url))
165
- return decodeURIComponent(url.slice(20));
166
- return decodeURIComponent(url.slice(14));
167
- }
168
- module.exports = {
169
- isValid,
170
- contents
171
- };
172
- });
173
- var require_parse_statements = /* @__PURE__ */ __commonJSMin((exports, module) => {
174
- const valueParser = require_lib();
175
- const { stringify } = valueParser;
176
- module.exports = function parseStatements(result, styles, conditions, from) {
177
- const statements = [];
178
- let nodes = [];
179
- let encounteredNonImportNodes = false;
180
- styles.each((node) => {
181
- let stmt;
182
- if (node.type === "atrule") {
183
- if (node.name === "import")
184
- stmt = parseImport(result, node, conditions, from);
185
- else if (node.name === "charset")
186
- stmt = parseCharset(result, node, conditions, from);
187
- else if (node.name === "layer" && !encounteredNonImportNodes && !node.nodes)
188
- stmt = parseLayer(result, node, conditions, from);
189
- } else if (node.type !== "comment")
190
- encounteredNonImportNodes = true;
191
- if (stmt) {
192
- if (nodes.length) {
193
- statements.push({
194
- type: "nodes",
195
- nodes,
196
- conditions: [...conditions],
197
- from
198
- });
199
- nodes = [];
200
- }
201
- statements.push(stmt);
202
- } else
203
- nodes.push(node);
204
- });
205
- if (nodes.length)
206
- statements.push({
207
- type: "nodes",
208
- nodes,
209
- conditions: [...conditions],
210
- from
211
- });
212
- return statements;
213
- };
214
- function parseCharset(result, atRule, conditions, from) {
215
- if (atRule.prev())
216
- return result.warn("@charset must precede all other statements", { node: atRule });
217
- return {
218
- type: "charset",
219
- node: atRule,
220
- conditions: [...conditions],
221
- from
222
- };
223
- }
224
- function parseImport(result, atRule, conditions, from) {
225
- let prev = atRule.prev();
226
- if (prev)
227
- do {
228
- if (prev.type === "comment" || prev.type === "atrule" && prev.name === "import") {
229
- prev = prev.prev();
230
- continue;
231
- }
232
- break;
233
- } while (prev);
234
- if (prev)
235
- do {
236
- if (prev.type === "comment" || prev.type === "atrule" && (prev.name === "charset" || prev.name === "layer" && !prev.nodes)) {
237
- prev = prev.prev();
238
- continue;
239
- }
240
- return result.warn("@import must precede all other statements (besides @charset or empty @layer)", { node: atRule });
241
- } while (prev);
242
- if (atRule.nodes)
243
- return result.warn("It looks like you didn't end your @import statement correctly. Child nodes are attached to it.", { node: atRule });
244
- const params = valueParser(atRule.params).nodes;
245
- const stmt = {
246
- type: "import",
247
- uri: "",
248
- fullUri: "",
249
- node: atRule,
250
- conditions: [...conditions],
251
- from
252
- };
253
- let layer;
254
- let media;
255
- let supports;
256
- for (let i = 0;i < params.length; i++) {
257
- const node = params[i];
258
- if (node.type === "space" || node.type === "comment")
259
- continue;
260
- if (node.type === "string") {
261
- if (stmt.uri)
262
- return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule });
263
- if (!node.value)
264
- return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
265
- stmt.uri = node.value;
266
- stmt.fullUri = stringify(node);
267
- continue;
268
- }
269
- if (node.type === "function" && /^url$/i.test(node.value)) {
270
- if (stmt.uri)
271
- return result.warn(`Multiple url's in '${atRule.toString()}'`, { node: atRule });
272
- if (!node.nodes?.[0]?.value)
273
- return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
274
- stmt.uri = node.nodes[0].value;
275
- stmt.fullUri = stringify(node);
276
- continue;
277
- }
278
- if (!stmt.uri)
279
- return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
280
- if ((node.type === "word" || node.type === "function") && /^layer$/i.test(node.value)) {
281
- if (typeof layer !== "undefined")
282
- return result.warn(`Multiple layers in '${atRule.toString()}'`, { node: atRule });
283
- if (typeof supports !== "undefined")
284
- return result.warn(`layers must be defined before support conditions in '${atRule.toString()}'`, { node: atRule });
285
- if (node.nodes)
286
- layer = stringify(node.nodes);
287
- else
288
- layer = "";
289
- continue;
290
- }
291
- if (node.type === "function" && /^supports$/i.test(node.value)) {
292
- if (typeof supports !== "undefined")
293
- return result.warn(`Multiple support conditions in '${atRule.toString()}'`, { node: atRule });
294
- supports = stringify(node.nodes);
295
- continue;
296
- }
297
- media = stringify(params.slice(i));
298
- break;
299
- }
300
- if (!stmt.uri)
301
- return result.warn(`Unable to find uri in '${atRule.toString()}'`, { node: atRule });
302
- if (typeof media !== "undefined" || typeof layer !== "undefined" || typeof supports !== "undefined")
303
- stmt.conditions.push({
304
- layer,
305
- media,
306
- supports
307
- });
308
- return stmt;
309
- }
310
- function parseLayer(result, atRule, conditions, from) {
311
- return {
312
- type: "layer",
313
- node: atRule,
314
- conditions: [...conditions],
315
- from
316
- };
317
- }
318
- });
319
- var require_process_content = /* @__PURE__ */ __commonJSMin((exports, module) => {
320
- const path$2 = __require("path");
321
- let sugarss;
322
- module.exports = function processContent(result, content, filename, options, postcss) {
323
- const { plugins } = options;
324
- const ext = path$2.extname(filename);
325
- const parserList = [];
326
- if (ext === ".sss") {
327
- if (!sugarss)
328
- try {
329
- sugarss = __require("sugarss");
330
- } catch {}
331
- if (sugarss)
332
- return runPostcss(postcss, content, filename, plugins, [sugarss]);
333
- }
334
- if (result.opts.syntax?.parse)
335
- parserList.push(result.opts.syntax.parse);
336
- if (result.opts.parser)
337
- parserList.push(result.opts.parser);
338
- parserList.push(null);
339
- return runPostcss(postcss, content, filename, plugins, parserList);
340
- };
341
- function runPostcss(postcss, content, filename, plugins, parsers, index) {
342
- if (!index)
343
- index = 0;
344
- return postcss(plugins).process(content, {
345
- from: filename,
346
- parser: parsers[index]
347
- }).catch((err) => {
348
- index++;
349
- if (index === parsers.length)
350
- throw err;
351
- return runPostcss(postcss, content, filename, plugins, parsers, index);
352
- });
353
- }
354
- });
355
- var require_parse_styles = /* @__PURE__ */ __commonJSMin((exports, module) => {
356
- const path$1 = __require("path");
357
- const dataURL = require_data_url();
358
- const parseStatements = require_parse_statements();
359
- const processContent = require_process_content();
360
- const resolveId = (id) => id;
361
- const formatImportPrelude = require_format_import_prelude();
362
- async function parseStyles(result, styles, options, state, conditions, from, postcss) {
363
- const statements = parseStatements(result, styles, conditions, from);
364
- for (const stmt of statements) {
365
- if (stmt.type !== "import" || !isProcessableURL(stmt.uri))
366
- continue;
367
- if (options.filter && !options.filter(stmt.uri))
368
- continue;
369
- await resolveImportId(result, stmt, options, state, postcss);
370
- }
371
- let charset;
372
- const beforeBundle = [];
373
- const bundle = [];
374
- function handleCharset(stmt) {
375
- if (!charset)
376
- charset = stmt;
377
- else if (stmt.node.params.toLowerCase() !== charset.node.params.toLowerCase())
378
- throw stmt.node.error(`Incompatible @charset statements:
379
- ${stmt.node.params} specified in ${stmt.node.source.input.file}
380
- ${charset.node.params} specified in ${charset.node.source.input.file}`);
381
- }
382
- statements.forEach((stmt) => {
383
- if (stmt.type === "charset")
384
- handleCharset(stmt);
385
- else if (stmt.type === "import")
386
- if (stmt.children)
387
- stmt.children.forEach((child, index) => {
388
- if (child.type === "import")
389
- beforeBundle.push(child);
390
- else if (child.type === "layer")
391
- beforeBundle.push(child);
392
- else if (child.type === "charset")
393
- handleCharset(child);
394
- else
395
- bundle.push(child);
396
- if (index === 0)
397
- child.parent = stmt;
398
- });
399
- else
400
- beforeBundle.push(stmt);
401
- else if (stmt.type === "layer")
402
- beforeBundle.push(stmt);
403
- else if (stmt.type === "nodes")
404
- bundle.push(stmt);
405
- });
406
- return charset ? [charset, ...beforeBundle.concat(bundle)] : beforeBundle.concat(bundle);
407
- }
408
- async function resolveImportId(result, stmt, options, state, postcss) {
409
- if (dataURL.isValid(stmt.uri)) {
410
- stmt.children = await loadImportContent(result, stmt, stmt.uri, options, state, postcss);
411
- return;
412
- } else if (dataURL.isValid(stmt.from.slice(-1)))
413
- throw stmt.node.error(`Unable to import '${stmt.uri}' from a stylesheet that is embedded in a data url`);
414
- const atRule = stmt.node;
415
- let sourceFile;
416
- if (atRule.source?.input?.file)
417
- sourceFile = atRule.source.input.file;
418
- const base = sourceFile ? path$1.dirname(atRule.source.input.file) : options.root;
419
- const paths = [await options.resolve(stmt.uri, base, options, atRule)].flat();
420
- const resolved = await Promise.all(paths.map((file) => {
421
- return !path$1.isAbsolute(file) ? resolveId(file, base, options, atRule) : file;
422
- }));
423
- resolved.forEach((file) => {
424
- result.messages.push({
425
- type: "dependency",
426
- plugin: "postcss-import",
427
- file,
428
- parent: sourceFile
429
- });
430
- });
431
- stmt.children = (await Promise.all(resolved.map((file) => {
432
- return loadImportContent(result, stmt, file, options, state, postcss);
433
- }))).flat().filter((x) => !!x);
434
- }
435
- async function loadImportContent(result, stmt, filename, options, state, postcss) {
436
- const atRule = stmt.node;
437
- const { conditions, from } = stmt;
438
- const stmtDuplicateCheckKey = conditions.map((condition) => formatImportPrelude(condition.layer, condition.media, condition.supports)).join(":");
439
- if (options.skipDuplicates) {
440
- if (state.importedFiles[filename]?.[stmtDuplicateCheckKey])
441
- return;
442
- if (!state.importedFiles[filename])
443
- state.importedFiles[filename] = {};
444
- state.importedFiles[filename][stmtDuplicateCheckKey] = true;
445
- }
446
- if (from.includes(filename))
447
- return;
448
- const content = await options.load(filename, options);
449
- if (content.trim() === "" && options.warnOnEmpty) {
450
- result.warn(`${filename} is empty`, { node: atRule });
451
- return;
452
- }
453
- if (options.skipDuplicates && state.hashFiles[content]?.[stmtDuplicateCheckKey])
454
- return;
455
- const importedResult = await processContent(result, content, filename, options, postcss);
456
- const styles = importedResult.root;
457
- result.messages = result.messages.concat(importedResult.messages);
458
- if (options.skipDuplicates) {
459
- if (!styles.some((child) => {
460
- return child.type === "atrule" && child.name === "import";
461
- })) {
462
- if (!state.hashFiles[content])
463
- state.hashFiles[content] = {};
464
- state.hashFiles[content][stmtDuplicateCheckKey] = true;
465
- }
466
- }
467
- return parseStyles(result, styles, options, state, conditions, [...from, filename], postcss);
468
- }
469
- function isProcessableURL(uri) {
470
- if (/^(?:[a-z]+:)?\/\//i.test(uri))
471
- return false;
472
- try {
473
- if (new URL(uri, "https://example.com").search)
474
- return false;
475
- } catch {}
476
- return true;
477
- }
478
- module.exports = parseStyles;
479
- });
480
- var require_postcss_import = /* @__PURE__ */ __commonJSMin((exports, module) => {
481
- const path = __require("path");
482
- const applyConditions = require_apply_conditions();
483
- const applyRaws = require_apply_raws();
484
- const applyStyles = require_apply_styles();
485
- const loadContent = () => "";
486
- const parseStyles = require_parse_styles();
487
- const resolveId = (id) => id;
488
- function AtImport(options) {
489
- options = {
490
- root: process.cwd(),
491
- path: [],
492
- skipDuplicates: true,
493
- resolve: resolveId,
494
- load: loadContent,
495
- plugins: [],
496
- addModulesDirectories: [],
497
- warnOnEmpty: true,
498
- ...options
499
- };
500
- options.root = path.resolve(options.root);
501
- if (typeof options.path === "string")
502
- options.path = [options.path];
503
- if (!Array.isArray(options.path))
504
- options.path = [];
505
- options.path = options.path.map((p) => path.resolve(options.root, p));
506
- return {
507
- postcssPlugin: "postcss-import",
508
- async Once(styles, { result, atRule, postcss }) {
509
- const state = {
510
- importedFiles: {},
511
- hashFiles: {}
512
- };
513
- if (styles.source?.input?.file)
514
- state.importedFiles[styles.source.input.file] = {};
515
- if (options.plugins && !Array.isArray(options.plugins))
516
- throw new Error("plugins option must be an array");
517
- const bundle = await parseStyles(result, styles, options, state, [], [], postcss);
518
- applyRaws(bundle);
519
- applyConditions(bundle, atRule);
520
- applyStyles(bundle, styles);
521
- }
522
- };
523
- }
524
- AtImport.postcss = true;
525
- module.exports = AtImport;
526
- });
527
- var postcss_import_default = require_postcss_import();
528
- export {
529
- postcss_import_default as default
530
- };
531
-
532
- //# debugId=709DA938C4F70D1F64756E2164756E21
533
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3ZpdGUvZGlzdC9ub2RlL2NodW5rcy9wb3N0Y3NzLWltcG9ydC5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBmdCBhcyBfX2NvbW1vbkpTTWluLCBwdCBhcyBfX3JlcXVpcmUgfSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgeyB0IGFzIHJlcXVpcmVfbGliIH0gZnJvbSBcIi4vbGliLmpzXCI7XG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL2Zvcm1hdC1pbXBvcnQtcHJlbHVkZS5qc1xudmFyIHJlcXVpcmVfZm9ybWF0X2ltcG9ydF9wcmVsdWRlID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmb3JtYXRJbXBvcnRQcmVsdWRlKGxheWVyLCBtZWRpYSwgc3VwcG9ydHMpIHtcblx0XHRjb25zdCBwYXJ0cyA9IFtdO1xuXHRcdGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdGxldCBsYXllclBhcmFtcyA9IFwibGF5ZXJcIjtcblx0XHRcdGlmIChsYXllcikgbGF5ZXJQYXJhbXMgPSBgbGF5ZXIoJHtsYXllcn0pYDtcblx0XHRcdHBhcnRzLnB1c2gobGF5ZXJQYXJhbXMpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHN1cHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSBwYXJ0cy5wdXNoKGBzdXBwb3J0cygke3N1cHBvcnRzfSlgKTtcblx0XHRpZiAodHlwZW9mIG1lZGlhICE9PSBcInVuZGVmaW5lZFwiKSBwYXJ0cy5wdXNoKG1lZGlhKTtcblx0XHRyZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG5cdH07XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9saWIvYmFzZTY0LWVuY29kZWQtaW1wb3J0LmpzXG52YXIgcmVxdWlyZV9iYXNlNjRfZW5jb2RlZF9pbXBvcnQgPSAvKiBAX19QVVJFX18gKi8gX19jb21tb25KU01pbigoKGV4cG9ydHMsIG1vZHVsZSkgPT4ge1xuXHRjb25zdCBmb3JtYXRJbXBvcnRQcmVsdWRlID0gcmVxdWlyZV9mb3JtYXRfaW1wb3J0X3ByZWx1ZGUoKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiYXNlNjRFbmNvZGVkQ29uZGl0aW9uYWxJbXBvcnQocHJlbHVkZSwgY29uZGl0aW9ucykge1xuXHRcdGlmICghY29uZGl0aW9ucz8ubGVuZ3RoKSByZXR1cm4gcHJlbHVkZTtcblx0XHRjb25kaXRpb25zLnJldmVyc2UoKTtcblx0XHRjb25zdCBmaXJzdCA9IGNvbmRpdGlvbnMucG9wKCk7XG5cdFx0bGV0IHBhcmFtcyA9IGAke3ByZWx1ZGV9ICR7Zm9ybWF0SW1wb3J0UHJlbHVkZShmaXJzdC5sYXllciwgZmlyc3QubWVkaWEsIGZpcnN0LnN1cHBvcnRzKX1gO1xuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHBhcmFtcyA9IGAnZGF0YTp0ZXh0L2NzcztiYXNlNjQsJHtCdWZmZXIuZnJvbShgQGltcG9ydCAke3BhcmFtc31gKS50b1N0cmluZyhcImJhc2U2NFwiKX0nICR7Zm9ybWF0SW1wb3J0UHJlbHVkZShjb25kaXRpb24ubGF5ZXIsIGNvbmRpdGlvbi5tZWRpYSwgY29uZGl0aW9uLnN1cHBvcnRzKX1gO1xuXHRcdHJldHVybiBwYXJhbXM7XG5cdH07XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9saWIvYXBwbHktY29uZGl0aW9ucy5qc1xudmFyIHJlcXVpcmVfYXBwbHlfY29uZGl0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IGJhc2U2NEVuY29kZWRDb25kaXRpb25hbEltcG9ydCA9IHJlcXVpcmVfYmFzZTY0X2VuY29kZWRfaW1wb3J0KCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXBwbHlDb25kaXRpb25zKGJ1bmRsZSwgYXRSdWxlKSB7XG5cdFx0Y29uc3QgZmlyc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCA9IGJ1bmRsZS5maW5kSW5kZXgoKHN0bXQpID0+IHN0bXQudHlwZSA9PT0gXCJpbXBvcnRcIik7XG5cdFx0Y29uc3QgbGFzdEltcG9ydFN0YXRlbWVudEluZGV4ID0gYnVuZGxlLmZpbmRMYXN0SW5kZXgoKHN0bXQpID0+IHN0bXQudHlwZSA9PT0gXCJpbXBvcnRcIik7XG5cdFx0YnVuZGxlLmZvckVhY2goKHN0bXQsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImNoYXJzZXRcIiB8fCBzdG10LnR5cGUgPT09IFwid2FybmluZ1wiKSByZXR1cm47XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIgJiYgKGluZGV4IDwgbGFzdEltcG9ydFN0YXRlbWVudEluZGV4ICYmIHN0bXQuY29uZGl0aW9ucz8ubGVuZ3RoIHx8IGluZGV4ID4gZmlyc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCAmJiBpbmRleCA8IGxhc3RJbXBvcnRTdGF0ZW1lbnRJbmRleCkpIHtcblx0XHRcdFx0c3RtdC50eXBlID0gXCJpbXBvcnRcIjtcblx0XHRcdFx0c3RtdC5ub2RlID0gc3RtdC5ub2RlLmNsb25lKHtcblx0XHRcdFx0XHRuYW1lOiBcImltcG9ydFwiLFxuXHRcdFx0XHRcdHBhcmFtczogYmFzZTY0RW5jb2RlZENvbmRpdGlvbmFsSW1wb3J0KGAnZGF0YTp0ZXh0L2NzcztiYXNlNjQsJHtCdWZmZXIuZnJvbShzdG10Lm5vZGUudG9TdHJpbmcoKSkudG9TdHJpbmcoXCJiYXNlNjRcIil9J2AsIHN0bXQuY29uZGl0aW9ucylcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICghc3RtdC5jb25kaXRpb25zPy5sZW5ndGgpIHJldHVybjtcblx0XHRcdGlmIChzdG10LnR5cGUgPT09IFwiaW1wb3J0XCIpIHtcblx0XHRcdFx0c3RtdC5ub2RlLnBhcmFtcyA9IGJhc2U2NEVuY29kZWRDb25kaXRpb25hbEltcG9ydChzdG10LmZ1bGxVcmksIHN0bXQuY29uZGl0aW9ucyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBub2Rlcztcblx0XHRcdGxldCBwYXJlbnQ7XG5cdFx0XHRpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIpIHtcblx0XHRcdFx0bm9kZXMgPSBbc3RtdC5ub2RlXTtcblx0XHRcdFx0cGFyZW50ID0gc3RtdC5ub2RlLnBhcmVudDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vZGVzID0gc3RtdC5ub2Rlcztcblx0XHRcdFx0cGFyZW50ID0gbm9kZXNbMF0ucGFyZW50O1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgYXRSdWxlcyA9IFtdO1xuXHRcdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2Ygc3RtdC5jb25kaXRpb25zKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgY29uZGl0aW9uLm1lZGlhICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWVkaWFOb2RlID0gYXRSdWxlKHtcblx0XHRcdFx0XHRcdG5hbWU6IFwibWVkaWFcIixcblx0XHRcdFx0XHRcdHBhcmFtczogY29uZGl0aW9uLm1lZGlhLFxuXHRcdFx0XHRcdFx0c291cmNlOiBwYXJlbnQuc291cmNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXRSdWxlcy5wdXNoKG1lZGlhTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiBjb25kaXRpb24uc3VwcG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBzdXBwb3J0c05vZGUgPSBhdFJ1bGUoe1xuXHRcdFx0XHRcdFx0bmFtZTogXCJzdXBwb3J0c1wiLFxuXHRcdFx0XHRcdFx0cGFyYW1zOiBgKCR7Y29uZGl0aW9uLnN1cHBvcnRzfSlgLFxuXHRcdFx0XHRcdFx0c291cmNlOiBwYXJlbnQuc291cmNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXRSdWxlcy5wdXNoKHN1cHBvcnRzTm9kZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiBjb25kaXRpb24ubGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRjb25zdCBsYXllck5vZGUgPSBhdFJ1bGUoe1xuXHRcdFx0XHRcdFx0bmFtZTogXCJsYXllclwiLFxuXHRcdFx0XHRcdFx0cGFyYW1zOiBjb25kaXRpb24ubGF5ZXIsXG5cdFx0XHRcdFx0XHRzb3VyY2U6IHBhcmVudC5zb3VyY2Vcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhdFJ1bGVzLnB1c2gobGF5ZXJOb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgb3V0ZXJBdFJ1bGUgPSBhdFJ1bGVzLnNoaWZ0KCk7XG5cdFx0XHRjb25zdCBpbm5lckF0UnVsZSA9IGF0UnVsZXMucmVkdWNlKChwcmV2aW91cywgbmV4dCkgPT4ge1xuXHRcdFx0XHRwcmV2aW91cy5hcHBlbmQobmV4dCk7XG5cdFx0XHRcdHJldHVybiBuZXh0O1xuXHRcdFx0fSwgb3V0ZXJBdFJ1bGUpO1xuXHRcdFx0cGFyZW50Lmluc2VydEJlZm9yZShub2Rlc1swXSwgb3V0ZXJBdFJ1bGUpO1xuXHRcdFx0bm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRub2RlLnBhcmVudCA9IHZvaWQgMDtcblx0XHRcdH0pO1xuXHRcdFx0bm9kZXNbMF0ucmF3cy5iZWZvcmUgPSBub2Rlc1swXS5yYXdzLmJlZm9yZSB8fCBcIlxcblwiO1xuXHRcdFx0aW5uZXJBdFJ1bGUuYXBwZW5kKG5vZGVzKTtcblx0XHRcdHN0bXQudHlwZSA9IFwibm9kZXNcIjtcblx0XHRcdHN0bXQubm9kZXMgPSBbb3V0ZXJBdFJ1bGVdO1xuXHRcdFx0ZGVsZXRlIHN0bXQubm9kZTtcblx0XHR9KTtcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9hcHBseS1yYXdzLmpzXG52YXIgcmVxdWlyZV9hcHBseV9yYXdzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhcHBseVJhd3MoYnVuZGxlKSB7XG5cdFx0YnVuZGxlLmZvckVhY2goKHN0bXQsIGluZGV4KSA9PiB7XG5cdFx0XHRpZiAoaW5kZXggPT09IDApIHJldHVybjtcblx0XHRcdGlmIChzdG10LnBhcmVudCkge1xuXHRcdFx0XHRjb25zdCB7IGJlZm9yZSB9ID0gc3RtdC5wYXJlbnQubm9kZS5yYXdzO1xuXHRcdFx0XHRpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIHN0bXQubm9kZXNbMF0ucmF3cy5iZWZvcmUgPSBiZWZvcmU7XG5cdFx0XHRcdGVsc2Ugc3RtdC5ub2RlLnJhd3MuYmVmb3JlID0gYmVmb3JlO1xuXHRcdFx0fSBlbHNlIGlmIChzdG10LnR5cGUgPT09IFwibm9kZXNcIikgc3RtdC5ub2Rlc1swXS5yYXdzLmJlZm9yZSA9IHN0bXQubm9kZXNbMF0ucmF3cy5iZWZvcmUgfHwgXCJcXG5cIjtcblx0XHR9KTtcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9hcHBseS1zdHlsZXMuanNcbnZhciByZXF1aXJlX2FwcGx5X3N0eWxlcyA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXBwbHlTdHlsZXMoYnVuZGxlLCBzdHlsZXMpIHtcblx0XHRzdHlsZXMubm9kZXMgPSBbXTtcblx0XHRidW5kbGUuZm9yRWFjaCgoc3RtdCkgPT4ge1xuXHRcdFx0aWYgKFtcblx0XHRcdFx0XCJjaGFyc2V0XCIsXG5cdFx0XHRcdFwiaW1wb3J0XCIsXG5cdFx0XHRcdFwibGF5ZXJcIlxuXHRcdFx0XS5pbmNsdWRlcyhzdG10LnR5cGUpKSB7XG5cdFx0XHRcdHN0bXQubm9kZS5wYXJlbnQgPSB2b2lkIDA7XG5cdFx0XHRcdHN0eWxlcy5hcHBlbmQoc3RtdC5ub2RlKTtcblx0XHRcdH0gZWxzZSBpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIHN0bXQubm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdFx0XHRub2RlLnBhcmVudCA9IHZvaWQgMDtcblx0XHRcdFx0c3R5bGVzLmFwcGVuZChub2RlKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9O1xufSkpO1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL2RhdGEtdXJsLmpzXG52YXIgcmVxdWlyZV9kYXRhX3VybCA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IGFueURhdGFVUkxSZWdleHAgPSAvXmRhdGE6dGV4dFxcL2Nzcyg/OjsoYmFzZTY0fHBsYWluKSk/LC9pO1xuXHRjb25zdCBiYXNlNjREYXRhVVJMUmVnZXhwID0gL15kYXRhOnRleHRcXC9jc3M7YmFzZTY0LC9pO1xuXHRjb25zdCBwbGFpbkRhdGFVUkxSZWdleHAgPSAvXmRhdGE6dGV4dFxcL2NzcztwbGFpbiwvaTtcblx0ZnVuY3Rpb24gaXNWYWxpZCh1cmwpIHtcblx0XHRyZXR1cm4gYW55RGF0YVVSTFJlZ2V4cC50ZXN0KHVybCk7XG5cdH1cblx0ZnVuY3Rpb24gY29udGVudHModXJsKSB7XG5cdFx0aWYgKGJhc2U2NERhdGFVUkxSZWdleHAudGVzdCh1cmwpKSByZXR1cm4gQnVmZmVyLmZyb20odXJsLnNsaWNlKDIxKSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcblx0XHRpZiAocGxhaW5EYXRhVVJMUmVnZXhwLnRlc3QodXJsKSkgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmwuc2xpY2UoMjApKTtcblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5zbGljZSgxNCkpO1xuXHR9XG5cdG1vZHVsZS5leHBvcnRzID0ge1xuXHRcdGlzVmFsaWQsXG5cdFx0Y29udGVudHNcblx0fTtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9wYXJzZS1zdGF0ZW1lbnRzLmpzXG52YXIgcmVxdWlyZV9wYXJzZV9zdGF0ZW1lbnRzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0Y29uc3QgdmFsdWVQYXJzZXIgPSByZXF1aXJlX2xpYigpO1xuXHRjb25zdCB7IHN0cmluZ2lmeSB9ID0gdmFsdWVQYXJzZXI7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRzKHJlc3VsdCwgc3R5bGVzLCBjb25kaXRpb25zLCBmcm9tKSB7XG5cdFx0Y29uc3Qgc3RhdGVtZW50cyA9IFtdO1xuXHRcdGxldCBub2RlcyA9IFtdO1xuXHRcdGxldCBlbmNvdW50ZXJlZE5vbkltcG9ydE5vZGVzID0gZmFsc2U7XG5cdFx0c3R5bGVzLmVhY2goKG5vZGUpID0+IHtcblx0XHRcdGxldCBzdG10O1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJhdHJ1bGVcIikge1xuXHRcdFx0XHRpZiAobm9kZS5uYW1lID09PSBcImltcG9ydFwiKSBzdG10ID0gcGFyc2VJbXBvcnQocmVzdWx0LCBub2RlLCBjb25kaXRpb25zLCBmcm9tKTtcblx0XHRcdFx0ZWxzZSBpZiAobm9kZS5uYW1lID09PSBcImNoYXJzZXRcIikgc3RtdCA9IHBhcnNlQ2hhcnNldChyZXN1bHQsIG5vZGUsIGNvbmRpdGlvbnMsIGZyb20pO1xuXHRcdFx0XHRlbHNlIGlmIChub2RlLm5hbWUgPT09IFwibGF5ZXJcIiAmJiAhZW5jb3VudGVyZWROb25JbXBvcnROb2RlcyAmJiAhbm9kZS5ub2Rlcykgc3RtdCA9IHBhcnNlTGF5ZXIocmVzdWx0LCBub2RlLCBjb25kaXRpb25zLCBmcm9tKTtcblx0XHRcdH0gZWxzZSBpZiAobm9kZS50eXBlICE9PSBcImNvbW1lbnRcIikgZW5jb3VudGVyZWROb25JbXBvcnROb2RlcyA9IHRydWU7XG5cdFx0XHRpZiAoc3RtdCkge1xuXHRcdFx0XHRpZiAobm9kZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0c3RhdGVtZW50cy5wdXNoKHtcblx0XHRcdFx0XHRcdHR5cGU6IFwibm9kZXNcIixcblx0XHRcdFx0XHRcdG5vZGVzLFxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0XHRcdFx0ZnJvbVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG5vZGVzID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RhdGVtZW50cy5wdXNoKHN0bXQpO1xuXHRcdFx0fSBlbHNlIG5vZGVzLnB1c2gobm9kZSk7XG5cdFx0fSk7XG5cdFx0aWYgKG5vZGVzLmxlbmd0aCkgc3RhdGVtZW50cy5wdXNoKHtcblx0XHRcdHR5cGU6IFwibm9kZXNcIixcblx0XHRcdG5vZGVzLFxuXHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0ZnJvbVxuXHRcdH0pO1xuXHRcdHJldHVybiBzdGF0ZW1lbnRzO1xuXHR9O1xuXHRmdW5jdGlvbiBwYXJzZUNoYXJzZXQocmVzdWx0LCBhdFJ1bGUsIGNvbmRpdGlvbnMsIGZyb20pIHtcblx0XHRpZiAoYXRSdWxlLnByZXYoKSkgcmV0dXJuIHJlc3VsdC53YXJuKFwiQGNoYXJzZXQgbXVzdCBwcmVjZWRlIGFsbCBvdGhlciBzdGF0ZW1lbnRzXCIsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlOiBcImNoYXJzZXRcIixcblx0XHRcdG5vZGU6IGF0UnVsZSxcblx0XHRcdGNvbmRpdGlvbnM6IFsuLi5jb25kaXRpb25zXSxcblx0XHRcdGZyb21cblx0XHR9O1xuXHR9XG5cdGZ1bmN0aW9uIHBhcnNlSW1wb3J0KHJlc3VsdCwgYXRSdWxlLCBjb25kaXRpb25zLCBmcm9tKSB7XG5cdFx0bGV0IHByZXYgPSBhdFJ1bGUucHJldigpO1xuXHRcdGlmIChwcmV2KSBkbyB7XG5cdFx0XHRpZiAocHJldi50eXBlID09PSBcImNvbW1lbnRcIiB8fCBwcmV2LnR5cGUgPT09IFwiYXRydWxlXCIgJiYgcHJldi5uYW1lID09PSBcImltcG9ydFwiKSB7XG5cdFx0XHRcdHByZXYgPSBwcmV2LnByZXYoKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHR9IHdoaWxlIChwcmV2KTtcblx0XHRpZiAocHJldikgZG8ge1xuXHRcdFx0aWYgKHByZXYudHlwZSA9PT0gXCJjb21tZW50XCIgfHwgcHJldi50eXBlID09PSBcImF0cnVsZVwiICYmIChwcmV2Lm5hbWUgPT09IFwiY2hhcnNldFwiIHx8IHByZXYubmFtZSA9PT0gXCJsYXllclwiICYmICFwcmV2Lm5vZGVzKSkge1xuXHRcdFx0XHRwcmV2ID0gcHJldi5wcmV2KCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdC53YXJuKFwiQGltcG9ydCBtdXN0IHByZWNlZGUgYWxsIG90aGVyIHN0YXRlbWVudHMgKGJlc2lkZXMgQGNoYXJzZXQgb3IgZW1wdHkgQGxheWVyKVwiLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHR9IHdoaWxlIChwcmV2KTtcblx0XHRpZiAoYXRSdWxlLm5vZGVzKSByZXR1cm4gcmVzdWx0Lndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSBkaWRuJ3QgZW5kIHlvdXIgQGltcG9ydCBzdGF0ZW1lbnQgY29ycmVjdGx5LiBDaGlsZCBub2RlcyBhcmUgYXR0YWNoZWQgdG8gaXQuXCIsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdGNvbnN0IHBhcmFtcyA9IHZhbHVlUGFyc2VyKGF0UnVsZS5wYXJhbXMpLm5vZGVzO1xuXHRcdGNvbnN0IHN0bXQgPSB7XG5cdFx0XHR0eXBlOiBcImltcG9ydFwiLFxuXHRcdFx0dXJpOiBcIlwiLFxuXHRcdFx0ZnVsbFVyaTogXCJcIixcblx0XHRcdG5vZGU6IGF0UnVsZSxcblx0XHRcdGNvbmRpdGlvbnM6IFsuLi5jb25kaXRpb25zXSxcblx0XHRcdGZyb21cblx0XHR9O1xuXHRcdGxldCBsYXllcjtcblx0XHRsZXQgbWVkaWE7XG5cdFx0bGV0IHN1cHBvcnRzO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBub2RlID0gcGFyYW1zW2ldO1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJzcGFjZVwiIHx8IG5vZGUudHlwZSA9PT0gXCJjb21tZW50XCIpIGNvbnRpbnVlO1xuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRpZiAoc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgTXVsdGlwbGUgdXJsJ3MgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRpZiAoIW5vZGUudmFsdWUpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0c3RtdC51cmkgPSBub2RlLnZhbHVlO1xuXHRcdFx0XHRzdG10LmZ1bGxVcmkgPSBzdHJpbmdpZnkobm9kZSk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG5vZGUudHlwZSA9PT0gXCJmdW5jdGlvblwiICYmIC9edXJsJC9pLnRlc3Qobm9kZS52YWx1ZSkpIHtcblx0XHRcdFx0aWYgKHN0bXQudXJpKSByZXR1cm4gcmVzdWx0Lndhcm4oYE11bHRpcGxlIHVybCdzIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0aWYgKCFub2RlLm5vZGVzPy5bMF0/LnZhbHVlKSByZXR1cm4gcmVzdWx0Lndhcm4oYFVuYWJsZSB0byBmaW5kIHVyaSBpbiAnJHthdFJ1bGUudG9TdHJpbmcoKX0nYCwgeyBub2RlOiBhdFJ1bGUgfSk7XG5cdFx0XHRcdHN0bXQudXJpID0gbm9kZS5ub2Rlc1swXS52YWx1ZTtcblx0XHRcdFx0c3RtdC5mdWxsVXJpID0gc3RyaW5naWZ5KG5vZGUpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmICghc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdGlmICgobm9kZS50eXBlID09PSBcIndvcmRcIiB8fCBub2RlLnR5cGUgPT09IFwiZnVuY3Rpb25cIikgJiYgL15sYXllciQvaS50ZXN0KG5vZGUudmFsdWUpKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiByZXN1bHQud2FybihgTXVsdGlwbGUgbGF5ZXJzIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRcdFx0aWYgKHR5cGVvZiBzdXBwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHJlc3VsdC53YXJuKGBsYXllcnMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBzdXBwb3J0IGNvbmRpdGlvbnMgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRpZiAobm9kZS5ub2RlcykgbGF5ZXIgPSBzdHJpbmdpZnkobm9kZS5ub2Rlcyk7XG5cdFx0XHRcdGVsc2UgbGF5ZXIgPSBcIlwiO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGlmIChub2RlLnR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAvXnN1cHBvcnRzJC9pLnRlc3Qobm9kZS52YWx1ZSkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBzdXBwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHJlc3VsdC53YXJuKGBNdWx0aXBsZSBzdXBwb3J0IGNvbmRpdGlvbnMgaW4gJyR7YXRSdWxlLnRvU3RyaW5nKCl9J2AsIHsgbm9kZTogYXRSdWxlIH0pO1xuXHRcdFx0XHRzdXBwb3J0cyA9IHN0cmluZ2lmeShub2RlLm5vZGVzKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRtZWRpYSA9IHN0cmluZ2lmeShwYXJhbXMuc2xpY2UoaSkpO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghc3RtdC51cmkpIHJldHVybiByZXN1bHQud2FybihgVW5hYmxlIHRvIGZpbmQgdXJpIGluICcke2F0UnVsZS50b1N0cmluZygpfSdgLCB7IG5vZGU6IGF0UnVsZSB9KTtcblx0XHRpZiAodHlwZW9mIG1lZGlhICE9PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygc3VwcG9ydHMgIT09IFwidW5kZWZpbmVkXCIpIHN0bXQuY29uZGl0aW9ucy5wdXNoKHtcblx0XHRcdGxheWVyLFxuXHRcdFx0bWVkaWEsXG5cdFx0XHRzdXBwb3J0c1xuXHRcdH0pO1xuXHRcdHJldHVybiBzdG10O1xuXHR9XG5cdGZ1bmN0aW9uIHBhcnNlTGF5ZXIocmVzdWx0LCBhdFJ1bGUsIGNvbmRpdGlvbnMsIGZyb20pIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogXCJsYXllclwiLFxuXHRcdFx0bm9kZTogYXRSdWxlLFxuXHRcdFx0Y29uZGl0aW9uczogWy4uLmNvbmRpdGlvbnNdLFxuXHRcdFx0ZnJvbVxuXHRcdH07XG5cdH1cbn0pKTtcbi8vI2VuZHJlZ2lvblxuLy8jcmVnaW9uIC4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wb3N0Y3NzLWltcG9ydEAxNi4xLjFfcG9zdGNzc0A4LjUuMTcvbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtaW1wb3J0L2xpYi9wcm9jZXNzLWNvbnRlbnQuanNcbnZhciByZXF1aXJlX3Byb2Nlc3NfY29udGVudCA9IC8qIEBfX1BVUkVfXyAqLyBfX2NvbW1vbkpTTWluKCgoZXhwb3J0cywgbW9kdWxlKSA9PiB7XG5cdGNvbnN0IHBhdGgkMiA9IF9fcmVxdWlyZShcInBhdGhcIik7XG5cdGxldCBzdWdhcnNzO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHByb2Nlc3NDb250ZW50KHJlc3VsdCwgY29udGVudCwgZmlsZW5hbWUsIG9wdGlvbnMsIHBvc3Rjc3MpIHtcblx0XHRjb25zdCB7IHBsdWdpbnMgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3QgZXh0ID0gcGF0aCQyLmV4dG5hbWUoZmlsZW5hbWUpO1xuXHRcdGNvbnN0IHBhcnNlckxpc3QgPSBbXTtcblx0XHRpZiAoZXh0ID09PSBcIi5zc3NcIikge1xuXHRcdFx0aWYgKCFzdWdhcnNzKVxuIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN1Z2Fyc3MgPSBfX3JlcXVpcmUoXCJzdWdhcnNzXCIpO1xuXHRcdFx0fSBjYXRjaCB7fVxuXHRcdFx0aWYgKHN1Z2Fyc3MpIHJldHVybiBydW5Qb3N0Y3NzKHBvc3Rjc3MsIGNvbnRlbnQsIGZpbGVuYW1lLCBwbHVnaW5zLCBbc3VnYXJzc10pO1xuXHRcdH1cblx0XHRpZiAocmVzdWx0Lm9wdHMuc3ludGF4Py5wYXJzZSkgcGFyc2VyTGlzdC5wdXNoKHJlc3VsdC5vcHRzLnN5bnRheC5wYXJzZSk7XG5cdFx0aWYgKHJlc3VsdC5vcHRzLnBhcnNlcikgcGFyc2VyTGlzdC5wdXNoKHJlc3VsdC5vcHRzLnBhcnNlcik7XG5cdFx0cGFyc2VyTGlzdC5wdXNoKG51bGwpO1xuXHRcdHJldHVybiBydW5Qb3N0Y3NzKHBvc3Rjc3MsIGNvbnRlbnQsIGZpbGVuYW1lLCBwbHVnaW5zLCBwYXJzZXJMaXN0KTtcblx0fTtcblx0ZnVuY3Rpb24gcnVuUG9zdGNzcyhwb3N0Y3NzLCBjb250ZW50LCBmaWxlbmFtZSwgcGx1Z2lucywgcGFyc2VycywgaW5kZXgpIHtcblx0XHRpZiAoIWluZGV4KSBpbmRleCA9IDA7XG5cdFx0cmV0dXJuIHBvc3Rjc3MocGx1Z2lucykucHJvY2Vzcyhjb250ZW50LCB7XG5cdFx0XHRmcm9tOiBmaWxlbmFtZSxcblx0XHRcdHBhcnNlcjogcGFyc2Vyc1tpbmRleF1cblx0XHR9KS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRpbmRleCsrO1xuXHRcdFx0aWYgKGluZGV4ID09PSBwYXJzZXJzLmxlbmd0aCkgdGhyb3cgZXJyO1xuXHRcdFx0cmV0dXJuIHJ1blBvc3Rjc3MocG9zdGNzcywgY29udGVudCwgZmlsZW5hbWUsIHBsdWdpbnMsIHBhcnNlcnMsIGluZGV4KTtcblx0XHR9KTtcblx0fVxufSkpO1xuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3Bvc3Rjc3MtaW1wb3J0QDE2LjEuMV9wb3N0Y3NzQDguNS4xNy9ub2RlX21vZHVsZXMvcG9zdGNzcy1pbXBvcnQvbGliL3BhcnNlLXN0eWxlcy5qc1xudmFyIHJlcXVpcmVfcGFyc2Vfc3R5bGVzID0gLyogQF9fUFVSRV9fICovIF9fY29tbW9uSlNNaW4oKChleHBvcnRzLCBtb2R1bGUpID0+IHtcblx0Y29uc3QgcGF0aCQxID0gX19yZXF1aXJlKFwicGF0aFwiKTtcblx0Y29uc3QgZGF0YVVSTCA9IHJlcXVpcmVfZGF0YV91cmwoKTtcblx0Y29uc3QgcGFyc2VTdGF0ZW1lbnRzID0gcmVxdWlyZV9wYXJzZV9zdGF0ZW1lbnRzKCk7XG5cdGNvbnN0IHByb2Nlc3NDb250ZW50ID0gcmVxdWlyZV9wcm9jZXNzX2NvbnRlbnQoKTtcblx0Y29uc3QgcmVzb2x2ZUlkID0gKGlkKSA9PiBpZDtcblx0Y29uc3QgZm9ybWF0SW1wb3J0UHJlbHVkZSA9IHJlcXVpcmVfZm9ybWF0X2ltcG9ydF9wcmVsdWRlKCk7XG5cdGFzeW5jIGZ1bmN0aW9uIHBhcnNlU3R5bGVzKHJlc3VsdCwgc3R5bGVzLCBvcHRpb25zLCBzdGF0ZSwgY29uZGl0aW9ucywgZnJvbSwgcG9zdGNzcykge1xuXHRcdGNvbnN0IHN0YXRlbWVudHMgPSBwYXJzZVN0YXRlbWVudHMocmVzdWx0LCBzdHlsZXMsIGNvbmRpdGlvbnMsIGZyb20pO1xuXHRcdGZvciAoY29uc3Qgc3RtdCBvZiBzdGF0ZW1lbnRzKSB7XG5cdFx0XHRpZiAoc3RtdC50eXBlICE9PSBcImltcG9ydFwiIHx8ICFpc1Byb2Nlc3NhYmxlVVJMKHN0bXQudXJpKSkgY29udGludWU7XG5cdFx0XHRpZiAob3B0aW9ucy5maWx0ZXIgJiYgIW9wdGlvbnMuZmlsdGVyKHN0bXQudXJpKSkgY29udGludWU7XG5cdFx0XHRhd2FpdCByZXNvbHZlSW1wb3J0SWQocmVzdWx0LCBzdG10LCBvcHRpb25zLCBzdGF0ZSwgcG9zdGNzcyk7XG5cdFx0fVxuXHRcdGxldCBjaGFyc2V0O1xuXHRcdGNvbnN0IGJlZm9yZUJ1bmRsZSA9IFtdO1xuXHRcdGNvbnN0IGJ1bmRsZSA9IFtdO1xuXHRcdGZ1bmN0aW9uIGhhbmRsZUNoYXJzZXQoc3RtdCkge1xuXHRcdFx0aWYgKCFjaGFyc2V0KSBjaGFyc2V0ID0gc3RtdDtcblx0XHRcdGVsc2UgaWYgKHN0bXQubm9kZS5wYXJhbXMudG9Mb3dlckNhc2UoKSAhPT0gY2hhcnNldC5ub2RlLnBhcmFtcy50b0xvd2VyQ2FzZSgpKSB0aHJvdyBzdG10Lm5vZGUuZXJyb3IoYEluY29tcGF0aWJsZSBAY2hhcnNldCBzdGF0ZW1lbnRzOlxuICAke3N0bXQubm9kZS5wYXJhbXN9IHNwZWNpZmllZCBpbiAke3N0bXQubm9kZS5zb3VyY2UuaW5wdXQuZmlsZX1cbiAgJHtjaGFyc2V0Lm5vZGUucGFyYW1zfSBzcGVjaWZpZWQgaW4gJHtjaGFyc2V0Lm5vZGUuc291cmNlLmlucHV0LmZpbGV9YCk7XG5cdFx0fVxuXHRcdHN0YXRlbWVudHMuZm9yRWFjaCgoc3RtdCkgPT4ge1xuXHRcdFx0aWYgKHN0bXQudHlwZSA9PT0gXCJjaGFyc2V0XCIpIGhhbmRsZUNoYXJzZXQoc3RtdCk7XG5cdFx0XHRlbHNlIGlmIChzdG10LnR5cGUgPT09IFwiaW1wb3J0XCIpIGlmIChzdG10LmNoaWxkcmVuKSBzdG10LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRpZiAoY2hpbGQudHlwZSA9PT0gXCJpbXBvcnRcIikgYmVmb3JlQnVuZGxlLnB1c2goY2hpbGQpO1xuXHRcdFx0XHRlbHNlIGlmIChjaGlsZC50eXBlID09PSBcImxheWVyXCIpIGJlZm9yZUJ1bmRsZS5wdXNoKGNoaWxkKTtcblx0XHRcdFx0ZWxzZSBpZiAoY2hpbGQudHlwZSA9PT0gXCJjaGFyc2V0XCIpIGhhbmRsZUNoYXJzZXQoY2hpbGQpO1xuXHRcdFx0XHRlbHNlIGJ1bmRsZS5wdXNoKGNoaWxkKTtcblx0XHRcdFx0aWYgKGluZGV4ID09PSAwKSBjaGlsZC5wYXJlbnQgPSBzdG10O1xuXHRcdFx0fSk7XG5cdFx0XHRlbHNlIGJlZm9yZUJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdFx0ZWxzZSBpZiAoc3RtdC50eXBlID09PSBcImxheWVyXCIpIGJlZm9yZUJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdFx0ZWxzZSBpZiAoc3RtdC50eXBlID09PSBcIm5vZGVzXCIpIGJ1bmRsZS5wdXNoKHN0bXQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBjaGFyc2V0ID8gW2NoYXJzZXQsIC4uLmJlZm9yZUJ1bmRsZS5jb25jYXQoYnVuZGxlKV0gOiBiZWZvcmVCdW5kbGUuY29uY2F0KGJ1bmRsZSk7XG5cdH1cblx0YXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUltcG9ydElkKHJlc3VsdCwgc3RtdCwgb3B0aW9ucywgc3RhdGUsIHBvc3Rjc3MpIHtcblx0XHRpZiAoZGF0YVVSTC5pc1ZhbGlkKHN0bXQudXJpKSkge1xuXHRcdFx0c3RtdC5jaGlsZHJlbiA9IGF3YWl0IGxvYWRJbXBvcnRDb250ZW50KHJlc3VsdCwgc3RtdCwgc3RtdC51cmksIG9wdGlvbnMsIHN0YXRlLCBwb3N0Y3NzKTtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2UgaWYgKGRhdGFVUkwuaXNWYWxpZChzdG10LmZyb20uc2xpY2UoLTEpKSkgdGhyb3cgc3RtdC5ub2RlLmVycm9yKGBVbmFibGUgdG8gaW1wb3J0ICcke3N0bXQudXJpfScgZnJvbSBhIHN0eWxlc2hlZXQgdGhhdCBpcyBlbWJlZGRlZCBpbiBhIGRhdGEgdXJsYCk7XG5cdFx0Y29uc3QgYXRSdWxlID0gc3RtdC5ub2RlO1xuXHRcdGxldCBzb3VyY2VGaWxlO1xuXHRcdGlmIChhdFJ1bGUuc291cmNlPy5pbnB1dD8uZmlsZSkgc291cmNlRmlsZSA9IGF0UnVsZS5zb3VyY2UuaW5wdXQuZmlsZTtcblx0XHRjb25zdCBiYXNlID0gc291cmNlRmlsZSA/IHBhdGgkMS5kaXJuYW1lKGF0UnVsZS5zb3VyY2UuaW5wdXQuZmlsZSkgOiBvcHRpb25zLnJvb3Q7XG5cdFx0Y29uc3QgcGF0aHMgPSBbYXdhaXQgb3B0aW9ucy5yZXNvbHZlKHN0bXQudXJpLCBiYXNlLCBvcHRpb25zLCBhdFJ1bGUpXS5mbGF0KCk7XG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChwYXRocy5tYXAoKGZpbGUpID0+IHtcblx0XHRcdHJldHVybiAhcGF0aCQxLmlzQWJzb2x1dGUoZmlsZSkgPyByZXNvbHZlSWQoZmlsZSwgYmFzZSwgb3B0aW9ucywgYXRSdWxlKSA6IGZpbGU7XG5cdFx0fSkpO1xuXHRcdHJlc29sdmVkLmZvckVhY2goKGZpbGUpID0+IHtcblx0XHRcdHJlc3VsdC5tZXNzYWdlcy5wdXNoKHtcblx0XHRcdFx0dHlwZTogXCJkZXBlbmRlbmN5XCIsXG5cdFx0XHRcdHBsdWdpbjogXCJwb3N0Y3NzLWltcG9ydFwiLFxuXHRcdFx0XHRmaWxlLFxuXHRcdFx0XHRwYXJlbnQ6IHNvdXJjZUZpbGVcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdHN0bXQuY2hpbGRyZW4gPSAoYXdhaXQgUHJvbWlzZS5hbGwocmVzb2x2ZWQubWFwKChmaWxlKSA9PiB7XG5cdFx0XHRyZXR1cm4gbG9hZEltcG9ydENvbnRlbnQocmVzdWx0LCBzdG10LCBmaWxlLCBvcHRpb25zLCBzdGF0ZSwgcG9zdGNzcyk7XG5cdFx0fSkpKS5mbGF0KCkuZmlsdGVyKCh4KSA9PiAhIXgpO1xuXHR9XG5cdGFzeW5jIGZ1bmN0aW9uIGxvYWRJbXBvcnRDb250ZW50KHJlc3VsdCwgc3RtdCwgZmlsZW5hbWUsIG9wdGlvbnMsIHN0YXRlLCBwb3N0Y3NzKSB7XG5cdFx0Y29uc3QgYXRSdWxlID0gc3RtdC5ub2RlO1xuXHRcdGNvbnN0IHsgY29uZGl0aW9ucywgZnJvbSB9ID0gc3RtdDtcblx0XHRjb25zdCBzdG10RHVwbGljYXRlQ2hlY2tLZXkgPSBjb25kaXRpb25zLm1hcCgoY29uZGl0aW9uKSA9PiBmb3JtYXRJbXBvcnRQcmVsdWRlKGNvbmRpdGlvbi5sYXllciwgY29uZGl0aW9uLm1lZGlhLCBjb25kaXRpb24uc3VwcG9ydHMpKS5qb2luKFwiOlwiKTtcblx0XHRpZiAob3B0aW9ucy5za2lwRHVwbGljYXRlcykge1xuXHRcdFx0aWYgKHN0YXRlLmltcG9ydGVkRmlsZXNbZmlsZW5hbWVdPy5bc3RtdER1cGxpY2F0ZUNoZWNrS2V5XSkgcmV0dXJuO1xuXHRcdFx0aWYgKCFzdGF0ZS5pbXBvcnRlZEZpbGVzW2ZpbGVuYW1lXSkgc3RhdGUuaW1wb3J0ZWRGaWxlc1tmaWxlbmFtZV0gPSB7fTtcblx0XHRcdHN0YXRlLmltcG9ydGVkRmlsZXNbZmlsZW5hbWVdW3N0bXREdXBsaWNhdGVDaGVja0tleV0gPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoZnJvbS5pbmNsdWRlcyhmaWxlbmFtZSkpIHJldHVybjtcblx0XHRjb25zdCBjb250ZW50ID0gYXdhaXQgb3B0aW9ucy5sb2FkKGZpbGVuYW1lLCBvcHRpb25zKTtcblx0XHRpZiAoY29udGVudC50cmltKCkgPT09IFwiXCIgJiYgb3B0aW9ucy53YXJuT25FbXB0eSkge1xuXHRcdFx0cmVzdWx0Lndhcm4oYCR7ZmlsZW5hbWV9IGlzIGVtcHR5YCwgeyBub2RlOiBhdFJ1bGUgfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChvcHRpb25zLnNraXBEdXBsaWNhdGVzICYmIHN0YXRlLmhhc2hGaWxlc1tjb250ZW50XT8uW3N0bXREdXBsaWNhdGVDaGVja0tleV0pIHJldHVybjtcblx0XHRjb25zdCBpbXBvcnRlZFJlc3VsdCA9IGF3YWl0IHByb2Nlc3NDb250ZW50KHJlc3VsdCwgY29udGVudCwgZmlsZW5hbWUsIG9wdGlvbnMsIHBvc3Rjc3MpO1xuXHRcdGNvbnN0IHN0eWxlcyA9IGltcG9ydGVkUmVzdWx0LnJvb3Q7XG5cdFx0cmVzdWx0Lm1lc3NhZ2VzID0gcmVzdWx0Lm1lc3NhZ2VzLmNvbmNhdChpbXBvcnRlZFJlc3VsdC5tZXNzYWdlcyk7XG5cdFx0aWYgKG9wdGlvbnMuc2tpcER1cGxpY2F0ZXMpIHtcblx0XHRcdGlmICghc3R5bGVzLnNvbWUoKGNoaWxkKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjaGlsZC50eXBlID09PSBcImF0cnVsZVwiICYmIGNoaWxkLm5hbWUgPT09IFwiaW1wb3J0XCI7XG5cdFx0XHR9KSkge1xuXHRcdFx0XHRpZiAoIXN0YXRlLmhhc2hGaWxlc1tjb250ZW50XSkgc3RhdGUuaGFzaEZpbGVzW2NvbnRlbnRdID0ge307XG5cdFx0XHRcdHN0YXRlLmhhc2hGaWxlc1tjb250ZW50XVtzdG10RHVwbGljYXRlQ2hlY2tLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHBhcnNlU3R5bGVzKHJlc3VsdCwgc3R5bGVzLCBvcHRpb25zLCBzdGF0ZSwgY29uZGl0aW9ucywgWy4uLmZyb20sIGZpbGVuYW1lXSwgcG9zdGNzcyk7XG5cdH1cblx0ZnVuY3Rpb24gaXNQcm9jZXNzYWJsZVVSTCh1cmkpIHtcblx0XHRpZiAoL14oPzpbYS16XSs6KT9cXC9cXC8vaS50ZXN0KHVyaSkpIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG5ldyBVUkwodXJpLCBcImh0dHBzOi8vZXhhbXBsZS5jb21cIikuc2VhcmNoKSByZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCB7fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdG1vZHVsZS5leHBvcnRzID0gcGFyc2VTdHlsZXM7XG59KSk7XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiAuLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcG9zdGNzcy1pbXBvcnRAMTYuMS4xX3Bvc3Rjc3NAOC41LjE3L25vZGVfbW9kdWxlcy9wb3N0Y3NzLWltcG9ydC9pbmRleC5qc1xudmFyIHJlcXVpcmVfcG9zdGNzc19pbXBvcnQgPSAvKiBAX19QVVJFX18gKi8gX19jb21tb25KU01pbigoKGV4cG9ydHMsIG1vZHVsZSkgPT4ge1xuXHRjb25zdCBwYXRoID0gX19yZXF1aXJlKFwicGF0aFwiKTtcblx0Y29uc3QgYXBwbHlDb25kaXRpb25zID0gcmVxdWlyZV9hcHBseV9jb25kaXRpb25zKCk7XG5cdGNvbnN0IGFwcGx5UmF3cyA9IHJlcXVpcmVfYXBwbHlfcmF3cygpO1xuXHRjb25zdCBhcHBseVN0eWxlcyA9IHJlcXVpcmVfYXBwbHlfc3R5bGVzKCk7XG5cdGNvbnN0IGxvYWRDb250ZW50ID0gKCkgPT4gXCJcIjtcblx0Y29uc3QgcGFyc2VTdHlsZXMgPSByZXF1aXJlX3BhcnNlX3N0eWxlcygpO1xuXHRjb25zdCByZXNvbHZlSWQgPSAoaWQpID0+IGlkO1xuXHRmdW5jdGlvbiBBdEltcG9ydChvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IHtcblx0XHRcdHJvb3Q6IHByb2Nlc3MuY3dkKCksXG5cdFx0XHRwYXRoOiBbXSxcblx0XHRcdHNraXBEdXBsaWNhdGVzOiB0cnVlLFxuXHRcdFx0cmVzb2x2ZTogcmVzb2x2ZUlkLFxuXHRcdFx0bG9hZDogbG9hZENvbnRlbnQsXG5cdFx0XHRwbHVnaW5zOiBbXSxcblx0XHRcdGFkZE1vZHVsZXNEaXJlY3RvcmllczogW10sXG5cdFx0XHR3YXJuT25FbXB0eTogdHJ1ZSxcblx0XHRcdC4uLm9wdGlvbnNcblx0XHR9O1xuXHRcdG9wdGlvbnMucm9vdCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLnJvb3QpO1xuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5wYXRoID09PSBcInN0cmluZ1wiKSBvcHRpb25zLnBhdGggPSBbb3B0aW9ucy5wYXRoXTtcblx0XHRpZiAoIUFycmF5LmlzQXJyYXkob3B0aW9ucy5wYXRoKSkgb3B0aW9ucy5wYXRoID0gW107XG5cdFx0b3B0aW9ucy5wYXRoID0gb3B0aW9ucy5wYXRoLm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKG9wdGlvbnMucm9vdCwgcCkpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRwb3N0Y3NzUGx1Z2luOiBcInBvc3Rjc3MtaW1wb3J0XCIsXG5cdFx0XHRhc3luYyBPbmNlKHN0eWxlcywgeyByZXN1bHQsIGF0UnVsZSwgcG9zdGNzcyB9KSB7XG5cdFx0XHRcdGNvbnN0IHN0YXRlID0ge1xuXHRcdFx0XHRcdGltcG9ydGVkRmlsZXM6IHt9LFxuXHRcdFx0XHRcdGhhc2hGaWxlczoge31cblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKHN0eWxlcy5zb3VyY2U/LmlucHV0Py5maWxlKSBzdGF0ZS5pbXBvcnRlZEZpbGVzW3N0eWxlcy5zb3VyY2UuaW5wdXQuZmlsZV0gPSB7fTtcblx0XHRcdFx0aWYgKG9wdGlvbnMucGx1Z2lucyAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLnBsdWdpbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJwbHVnaW5zIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5XCIpO1xuXHRcdFx0XHRjb25zdCBidW5kbGUgPSBhd2FpdCBwYXJzZVN0eWxlcyhyZXN1bHQsIHN0eWxlcywgb3B0aW9ucywgc3RhdGUsIFtdLCBbXSwgcG9zdGNzcyk7XG5cdFx0XHRcdGFwcGx5UmF3cyhidW5kbGUpO1xuXHRcdFx0XHRhcHBseUNvbmRpdGlvbnMoYnVuZGxlLCBhdFJ1bGUpO1xuXHRcdFx0XHRhcHBseVN0eWxlcyhidW5kbGUsIHN0eWxlcyk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRBdEltcG9ydC5wb3N0Y3NzID0gdHJ1ZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBBdEltcG9ydDtcbn0pKTtcbi8vI2VuZHJlZ2lvblxuZXhwb3J0IGRlZmF1bHQgcmVxdWlyZV9wb3N0Y3NzX2ltcG9ydCgpO1xuZXhwb3J0IHt9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxnREFBZ0QsY0FBZSxDQUFDLFNBQVMsV0FBVztBQUFBLEVBQ3ZGLE9BQU8sVUFBVSxTQUFTLG1CQUFtQixDQUFDLE9BQU8sT0FBTyxVQUFVO0FBQUEsSUFDckUsTUFBTSxRQUFRLENBQUM7QUFBQSxJQUNmLElBQUksT0FBTyxVQUFVLGFBQWE7QUFBQSxNQUNqQyxJQUFJLGNBQWM7QUFBQSxNQUNsQixJQUFJO0FBQUEsUUFBTyxjQUFjLFNBQVM7QUFBQSxNQUNsQyxNQUFNLEtBQUssV0FBVztBQUFBLElBQ3ZCO0FBQUEsSUFDQSxJQUFJLE9BQU8sYUFBYTtBQUFBLE1BQWEsTUFBTSxLQUFLLFlB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