vitest 0.5.5 → 0.5.6
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/dist/{chunk-api-setup.bfd4a66d.js → chunk-api-setup.ab3a8330.js} +2 -2
- package/dist/chunk-defaults.8ca84d7b.js +1833 -0
- package/dist/{chunk-vite-node-externalize.70d7fd52.js → chunk-vite-node-externalize.e6096d90.js} +6 -6
- package/dist/{chunk-vite-node-utils.d38851ea.js → chunk-vite-node-utils.952694b8.js} +2 -2
- package/dist/cli.js +5 -5
- package/dist/config.cjs +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +1 -1
- package/dist/entry.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/node.d.ts +6 -0
- package/dist/node.js +3 -3
- package/dist/worker.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-defaults.1725002f.js +0 -1833
|
@@ -0,0 +1,1833 @@
|
|
|
1
|
+
import { existsSync, promises } from 'fs';
|
|
2
|
+
import { createRequire } from 'module';
|
|
3
|
+
import { pathToFileURL } from 'url';
|
|
4
|
+
import { a as resolve, r as relative } from './vendor-index.76be1f4d.js';
|
|
5
|
+
import { t as toArray, c } from './chunk-utils-base.39767f3e.js';
|
|
6
|
+
import { p as parseStacktrace, i as interpretSourcePos, a as posToNumber, l as lineSplitRE } from './chunk-utils-source-map.be2b14e2.js';
|
|
7
|
+
|
|
8
|
+
const defaultInclude = ["**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"];
|
|
9
|
+
const defaultExclude = ["**/node_modules/**", "**/dist/**", "**/cypress/**", "**/.{idea,git,cache,output,temp}/**"];
|
|
10
|
+
const defaultCoverageExcludes = [
|
|
11
|
+
"coverage/**",
|
|
12
|
+
"packages/*/test{,s}/**",
|
|
13
|
+
"**/*.d.ts",
|
|
14
|
+
"cypress/**",
|
|
15
|
+
"test{,s}/**",
|
|
16
|
+
"test{,-*}.{js,cjs,mjs,ts,tsx,jsx}",
|
|
17
|
+
"**/*{.,-}test.{js,cjs,mjs,ts,tsx,jsx}",
|
|
18
|
+
"**/__tests__/**",
|
|
19
|
+
"**/{karma,rollup,webpack,vite,vitest,jest,ava,babel,nyc}.config.{js,cjs,mjs,ts}",
|
|
20
|
+
"**/.{eslint,mocha,prettier}rc.{js,cjs,yml}"
|
|
21
|
+
];
|
|
22
|
+
const coverageConfigDefaults = {
|
|
23
|
+
enabled: false,
|
|
24
|
+
clean: true,
|
|
25
|
+
cleanOnRerun: false,
|
|
26
|
+
reportsDirectory: "./coverage",
|
|
27
|
+
excludeNodeModules: true,
|
|
28
|
+
exclude: defaultCoverageExcludes,
|
|
29
|
+
reporter: ["text", "html"],
|
|
30
|
+
allowExternal: false,
|
|
31
|
+
extension: [".js", ".cjs", ".mjs", ".ts", ".tsx", ".jsx", ".vue", ".svelte"]
|
|
32
|
+
};
|
|
33
|
+
const configDefaults = Object.freeze({
|
|
34
|
+
allowOnly: !process.env.CI,
|
|
35
|
+
watch: !process.env.CI,
|
|
36
|
+
globals: false,
|
|
37
|
+
environment: "node",
|
|
38
|
+
threads: true,
|
|
39
|
+
clearMocks: false,
|
|
40
|
+
restoreMocks: false,
|
|
41
|
+
mockReset: false,
|
|
42
|
+
include: defaultInclude,
|
|
43
|
+
exclude: defaultExclude,
|
|
44
|
+
testTimeout: 5e3,
|
|
45
|
+
hookTimeout: 1e4,
|
|
46
|
+
isolate: true,
|
|
47
|
+
watchIgnore: [/\/node_modules\//, /\/dist\//],
|
|
48
|
+
update: false,
|
|
49
|
+
reporters: [],
|
|
50
|
+
silent: false,
|
|
51
|
+
api: false,
|
|
52
|
+
ui: false,
|
|
53
|
+
uiBase: "/__vitest__/",
|
|
54
|
+
open: true,
|
|
55
|
+
coverage: coverageConfigDefaults
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
var __defProp = Object.defineProperty;
|
|
59
|
+
var __defProps = Object.defineProperties;
|
|
60
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
61
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
62
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
63
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
64
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
65
|
+
var __spreadValues = (a, b) => {
|
|
66
|
+
for (var prop in b || (b = {}))
|
|
67
|
+
if (__hasOwnProp.call(b, prop))
|
|
68
|
+
__defNormalProp(a, prop, b[prop]);
|
|
69
|
+
if (__getOwnPropSymbols)
|
|
70
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
71
|
+
if (__propIsEnum.call(b, prop))
|
|
72
|
+
__defNormalProp(a, prop, b[prop]);
|
|
73
|
+
}
|
|
74
|
+
return a;
|
|
75
|
+
};
|
|
76
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
77
|
+
function resolveC8Options(options, root) {
|
|
78
|
+
const resolved = __spreadValues(__spreadValues({}, configDefaults.coverage), options);
|
|
79
|
+
resolved.reporter = toArray(resolved.reporter);
|
|
80
|
+
resolved.reportsDirectory = resolve(root, resolved.reportsDirectory);
|
|
81
|
+
resolved.tempDirectory = process.env.NODE_V8_COVERAGE || resolve(resolved.reportsDirectory, "tmp");
|
|
82
|
+
return resolved;
|
|
83
|
+
}
|
|
84
|
+
async function cleanCoverage(options, clean = true) {
|
|
85
|
+
if (clean && existsSync(options.reportsDirectory))
|
|
86
|
+
await promises.rm(options.reportsDirectory, { recursive: true, force: true });
|
|
87
|
+
if (!existsSync(options.tempDirectory))
|
|
88
|
+
await promises.mkdir(options.tempDirectory, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
const require2 = createRequire(import.meta.url);
|
|
91
|
+
function takeCoverage() {
|
|
92
|
+
const v8 = require2("v8");
|
|
93
|
+
if (v8.takeCoverage == null)
|
|
94
|
+
console.warn("[Vitest] takeCoverage is not available in this NodeJs version.\nCoverage could be incomplete. Update to NodeJs 14.18.");
|
|
95
|
+
else
|
|
96
|
+
v8.takeCoverage();
|
|
97
|
+
}
|
|
98
|
+
async function reportCoverage(ctx) {
|
|
99
|
+
takeCoverage();
|
|
100
|
+
const createReport = require2("c8/lib/report");
|
|
101
|
+
const report = createReport(ctx.config.coverage);
|
|
102
|
+
const sourceMapMeta = {};
|
|
103
|
+
await Promise.all(Array.from(ctx.vitenode.fetchCache.entries()).filter((i) => !i[0].includes("/node_modules/")).map(async ([file, { result }]) => {
|
|
104
|
+
const map = result.map;
|
|
105
|
+
if (!map)
|
|
106
|
+
return;
|
|
107
|
+
const url = pathToFileURL(file).href;
|
|
108
|
+
let code;
|
|
109
|
+
try {
|
|
110
|
+
code = (await promises.readFile(file)).toString();
|
|
111
|
+
} catch {
|
|
112
|
+
}
|
|
113
|
+
const sources = [url];
|
|
114
|
+
sourceMapMeta[url] = {
|
|
115
|
+
source: result.code,
|
|
116
|
+
map: __spreadProps(__spreadValues({
|
|
117
|
+
sourcesContent: code ? [code] : void 0
|
|
118
|
+
}, map), {
|
|
119
|
+
sources
|
|
120
|
+
})
|
|
121
|
+
};
|
|
122
|
+
}));
|
|
123
|
+
const offset = 190;
|
|
124
|
+
report._getSourceMap = (coverage) => {
|
|
125
|
+
const path = pathToFileURL(coverage.url).href;
|
|
126
|
+
const data = sourceMapMeta[path];
|
|
127
|
+
if (!data)
|
|
128
|
+
return {};
|
|
129
|
+
return {
|
|
130
|
+
sourceMap: {
|
|
131
|
+
sourcemap: data.map
|
|
132
|
+
},
|
|
133
|
+
source: Array(offset).fill(".").join("") + data.source
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
await report.run();
|
|
137
|
+
if (ctx.config.coverage.enabled) {
|
|
138
|
+
if (ctx.config.coverage["100"]) {
|
|
139
|
+
ctx.config.coverage.lines = 100;
|
|
140
|
+
ctx.config.coverage.functions = 100;
|
|
141
|
+
ctx.config.coverage.branches = 100;
|
|
142
|
+
ctx.config.coverage.statements = 100;
|
|
143
|
+
}
|
|
144
|
+
const { checkCoverages } = require2("c8/lib/commands/check-coverage");
|
|
145
|
+
await checkCoverages(ctx.config.coverage, report);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function Diff() {}
|
|
150
|
+
Diff.prototype = {
|
|
151
|
+
diff: function diff(oldString, newString) {
|
|
152
|
+
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
153
|
+
var callback = options.callback;
|
|
154
|
+
|
|
155
|
+
if (typeof options === 'function') {
|
|
156
|
+
callback = options;
|
|
157
|
+
options = {};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
this.options = options;
|
|
161
|
+
var self = this;
|
|
162
|
+
|
|
163
|
+
function done(value) {
|
|
164
|
+
if (callback) {
|
|
165
|
+
setTimeout(function () {
|
|
166
|
+
callback(undefined, value);
|
|
167
|
+
}, 0);
|
|
168
|
+
return true;
|
|
169
|
+
} else {
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
} // Allow subclasses to massage the input prior to running
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
oldString = this.castInput(oldString);
|
|
176
|
+
newString = this.castInput(newString);
|
|
177
|
+
oldString = this.removeEmpty(this.tokenize(oldString));
|
|
178
|
+
newString = this.removeEmpty(this.tokenize(newString));
|
|
179
|
+
var newLen = newString.length,
|
|
180
|
+
oldLen = oldString.length;
|
|
181
|
+
var editLength = 1;
|
|
182
|
+
var maxEditLength = newLen + oldLen;
|
|
183
|
+
var bestPath = [{
|
|
184
|
+
newPos: -1,
|
|
185
|
+
components: []
|
|
186
|
+
}]; // Seed editLength = 0, i.e. the content starts with the same values
|
|
187
|
+
|
|
188
|
+
var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
|
|
189
|
+
|
|
190
|
+
if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
|
|
191
|
+
// Identity per the equality and tokenizer
|
|
192
|
+
return done([{
|
|
193
|
+
value: this.join(newString),
|
|
194
|
+
count: newString.length
|
|
195
|
+
}]);
|
|
196
|
+
} // Main worker method. checks all permutations of a given edit length for acceptance.
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
function execEditLength() {
|
|
200
|
+
for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
|
|
201
|
+
var basePath = void 0;
|
|
202
|
+
|
|
203
|
+
var addPath = bestPath[diagonalPath - 1],
|
|
204
|
+
removePath = bestPath[diagonalPath + 1],
|
|
205
|
+
_oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
|
|
206
|
+
|
|
207
|
+
if (addPath) {
|
|
208
|
+
// No one else is going to attempt to use this value, clear it
|
|
209
|
+
bestPath[diagonalPath - 1] = undefined;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
var canAdd = addPath && addPath.newPos + 1 < newLen,
|
|
213
|
+
canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
|
|
214
|
+
|
|
215
|
+
if (!canAdd && !canRemove) {
|
|
216
|
+
// If this path is a terminal then prune
|
|
217
|
+
bestPath[diagonalPath] = undefined;
|
|
218
|
+
continue;
|
|
219
|
+
} // Select the diagonal that we want to branch from. We select the prior
|
|
220
|
+
// path whose position in the new string is the farthest from the origin
|
|
221
|
+
// and does not pass the bounds of the diff graph
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
|
|
225
|
+
basePath = clonePath(removePath);
|
|
226
|
+
self.pushComponent(basePath.components, undefined, true);
|
|
227
|
+
} else {
|
|
228
|
+
basePath = addPath; // No need to clone, we've pulled it from the list
|
|
229
|
+
|
|
230
|
+
basePath.newPos++;
|
|
231
|
+
self.pushComponent(basePath.components, true, undefined);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
_oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done
|
|
235
|
+
|
|
236
|
+
if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
|
|
237
|
+
return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
|
|
238
|
+
} else {
|
|
239
|
+
// Otherwise track this path as a potential candidate and continue.
|
|
240
|
+
bestPath[diagonalPath] = basePath;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
editLength++;
|
|
245
|
+
} // Performs the length of edit iteration. Is a bit fugly as this has to support the
|
|
246
|
+
// sync and async mode which is never fun. Loops over execEditLength until a value
|
|
247
|
+
// is produced.
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
if (callback) {
|
|
251
|
+
(function exec() {
|
|
252
|
+
setTimeout(function () {
|
|
253
|
+
// This should not happen, but we want to be safe.
|
|
254
|
+
|
|
255
|
+
/* istanbul ignore next */
|
|
256
|
+
if (editLength > maxEditLength) {
|
|
257
|
+
return callback();
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (!execEditLength()) {
|
|
261
|
+
exec();
|
|
262
|
+
}
|
|
263
|
+
}, 0);
|
|
264
|
+
})();
|
|
265
|
+
} else {
|
|
266
|
+
while (editLength <= maxEditLength) {
|
|
267
|
+
var ret = execEditLength();
|
|
268
|
+
|
|
269
|
+
if (ret) {
|
|
270
|
+
return ret;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
pushComponent: function pushComponent(components, added, removed) {
|
|
276
|
+
var last = components[components.length - 1];
|
|
277
|
+
|
|
278
|
+
if (last && last.added === added && last.removed === removed) {
|
|
279
|
+
// We need to clone here as the component clone operation is just
|
|
280
|
+
// as shallow array clone
|
|
281
|
+
components[components.length - 1] = {
|
|
282
|
+
count: last.count + 1,
|
|
283
|
+
added: added,
|
|
284
|
+
removed: removed
|
|
285
|
+
};
|
|
286
|
+
} else {
|
|
287
|
+
components.push({
|
|
288
|
+
count: 1,
|
|
289
|
+
added: added,
|
|
290
|
+
removed: removed
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
|
|
295
|
+
var newLen = newString.length,
|
|
296
|
+
oldLen = oldString.length,
|
|
297
|
+
newPos = basePath.newPos,
|
|
298
|
+
oldPos = newPos - diagonalPath,
|
|
299
|
+
commonCount = 0;
|
|
300
|
+
|
|
301
|
+
while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
|
|
302
|
+
newPos++;
|
|
303
|
+
oldPos++;
|
|
304
|
+
commonCount++;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (commonCount) {
|
|
308
|
+
basePath.components.push({
|
|
309
|
+
count: commonCount
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
basePath.newPos = newPos;
|
|
314
|
+
return oldPos;
|
|
315
|
+
},
|
|
316
|
+
equals: function equals(left, right) {
|
|
317
|
+
if (this.options.comparator) {
|
|
318
|
+
return this.options.comparator(left, right);
|
|
319
|
+
} else {
|
|
320
|
+
return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
removeEmpty: function removeEmpty(array) {
|
|
324
|
+
var ret = [];
|
|
325
|
+
|
|
326
|
+
for (var i = 0; i < array.length; i++) {
|
|
327
|
+
if (array[i]) {
|
|
328
|
+
ret.push(array[i]);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return ret;
|
|
333
|
+
},
|
|
334
|
+
castInput: function castInput(value) {
|
|
335
|
+
return value;
|
|
336
|
+
},
|
|
337
|
+
tokenize: function tokenize(value) {
|
|
338
|
+
return value.split('');
|
|
339
|
+
},
|
|
340
|
+
join: function join(chars) {
|
|
341
|
+
return chars.join('');
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
function buildValues(diff, components, newString, oldString, useLongestToken) {
|
|
346
|
+
var componentPos = 0,
|
|
347
|
+
componentLen = components.length,
|
|
348
|
+
newPos = 0,
|
|
349
|
+
oldPos = 0;
|
|
350
|
+
|
|
351
|
+
for (; componentPos < componentLen; componentPos++) {
|
|
352
|
+
var component = components[componentPos];
|
|
353
|
+
|
|
354
|
+
if (!component.removed) {
|
|
355
|
+
if (!component.added && useLongestToken) {
|
|
356
|
+
var value = newString.slice(newPos, newPos + component.count);
|
|
357
|
+
value = value.map(function (value, i) {
|
|
358
|
+
var oldValue = oldString[oldPos + i];
|
|
359
|
+
return oldValue.length > value.length ? oldValue : value;
|
|
360
|
+
});
|
|
361
|
+
component.value = diff.join(value);
|
|
362
|
+
} else {
|
|
363
|
+
component.value = diff.join(newString.slice(newPos, newPos + component.count));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
newPos += component.count; // Common case
|
|
367
|
+
|
|
368
|
+
if (!component.added) {
|
|
369
|
+
oldPos += component.count;
|
|
370
|
+
}
|
|
371
|
+
} else {
|
|
372
|
+
component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
|
|
373
|
+
oldPos += component.count; // Reverse add and remove so removes are output first to match common convention
|
|
374
|
+
// The diffing algorithm is tied to add then remove output and this is the simplest
|
|
375
|
+
// route to get the desired output with minimal overhead.
|
|
376
|
+
|
|
377
|
+
if (componentPos && components[componentPos - 1].added) {
|
|
378
|
+
var tmp = components[componentPos - 1];
|
|
379
|
+
components[componentPos - 1] = components[componentPos];
|
|
380
|
+
components[componentPos] = tmp;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
} // Special case handle for when one terminal is ignored (i.e. whitespace).
|
|
384
|
+
// For this case we merge the terminal into the prior string and drop the change.
|
|
385
|
+
// This is only available for string mode.
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
var lastComponent = components[componentLen - 1];
|
|
389
|
+
|
|
390
|
+
if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
|
|
391
|
+
components[componentLen - 2].value += lastComponent.value;
|
|
392
|
+
components.pop();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
return components;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function clonePath(path) {
|
|
399
|
+
return {
|
|
400
|
+
newPos: path.newPos,
|
|
401
|
+
components: path.components.slice(0)
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
//
|
|
406
|
+
// Ranges and exceptions:
|
|
407
|
+
// Latin-1 Supplement, 0080–00FF
|
|
408
|
+
// - U+00D7 × Multiplication sign
|
|
409
|
+
// - U+00F7 ÷ Division sign
|
|
410
|
+
// Latin Extended-A, 0100–017F
|
|
411
|
+
// Latin Extended-B, 0180–024F
|
|
412
|
+
// IPA Extensions, 0250–02AF
|
|
413
|
+
// Spacing Modifier Letters, 02B0–02FF
|
|
414
|
+
// - U+02C7 ˇ ˇ Caron
|
|
415
|
+
// - U+02D8 ˘ ˘ Breve
|
|
416
|
+
// - U+02D9 ˙ ˙ Dot Above
|
|
417
|
+
// - U+02DA ˚ ˚ Ring Above
|
|
418
|
+
// - U+02DB ˛ ˛ Ogonek
|
|
419
|
+
// - U+02DC ˜ ˜ Small Tilde
|
|
420
|
+
// - U+02DD ˝ ˝ Double Acute Accent
|
|
421
|
+
// Latin Extended Additional, 1E00–1EFF
|
|
422
|
+
|
|
423
|
+
var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/;
|
|
424
|
+
var reWhitespace = /\S/;
|
|
425
|
+
var wordDiff = new Diff();
|
|
426
|
+
|
|
427
|
+
wordDiff.equals = function (left, right) {
|
|
428
|
+
if (this.options.ignoreCase) {
|
|
429
|
+
left = left.toLowerCase();
|
|
430
|
+
right = right.toLowerCase();
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
wordDiff.tokenize = function (value) {
|
|
437
|
+
// All whitespace symbols except newline group into one token, each newline - in separate token
|
|
438
|
+
var tokens = value.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.
|
|
439
|
+
|
|
440
|
+
for (var i = 0; i < tokens.length - 1; i++) {
|
|
441
|
+
// If we have an empty string in the next field and we have only word chars before and after, merge
|
|
442
|
+
if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {
|
|
443
|
+
tokens[i] += tokens[i + 2];
|
|
444
|
+
tokens.splice(i + 1, 2);
|
|
445
|
+
i--;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
return tokens;
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
var lineDiff = new Diff();
|
|
453
|
+
|
|
454
|
+
lineDiff.tokenize = function (value) {
|
|
455
|
+
var retLines = [],
|
|
456
|
+
linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line
|
|
457
|
+
|
|
458
|
+
if (!linesAndNewlines[linesAndNewlines.length - 1]) {
|
|
459
|
+
linesAndNewlines.pop();
|
|
460
|
+
} // Merge the content and line separators into single tokens
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
for (var i = 0; i < linesAndNewlines.length; i++) {
|
|
464
|
+
var line = linesAndNewlines[i];
|
|
465
|
+
|
|
466
|
+
if (i % 2 && !this.options.newlineIsToken) {
|
|
467
|
+
retLines[retLines.length - 1] += line;
|
|
468
|
+
} else {
|
|
469
|
+
if (this.options.ignoreWhitespace) {
|
|
470
|
+
line = line.trim();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
retLines.push(line);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return retLines;
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
function diffLines(oldStr, newStr, callback) {
|
|
481
|
+
return lineDiff.diff(oldStr, newStr, callback);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
var sentenceDiff = new Diff();
|
|
485
|
+
|
|
486
|
+
sentenceDiff.tokenize = function (value) {
|
|
487
|
+
return value.split(/(\S.+?[.!?])(?=\s+|$)/);
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
var cssDiff = new Diff();
|
|
491
|
+
|
|
492
|
+
cssDiff.tokenize = function (value) {
|
|
493
|
+
return value.split(/([{}:;,]|\s+)/);
|
|
494
|
+
};
|
|
495
|
+
|
|
496
|
+
function _typeof(obj) {
|
|
497
|
+
"@babel/helpers - typeof";
|
|
498
|
+
|
|
499
|
+
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
500
|
+
_typeof = function (obj) {
|
|
501
|
+
return typeof obj;
|
|
502
|
+
};
|
|
503
|
+
} else {
|
|
504
|
+
_typeof = function (obj) {
|
|
505
|
+
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
return _typeof(obj);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
function _toConsumableArray(arr) {
|
|
513
|
+
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function _arrayWithoutHoles(arr) {
|
|
517
|
+
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function _iterableToArray(iter) {
|
|
521
|
+
if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function _unsupportedIterableToArray(o, minLen) {
|
|
525
|
+
if (!o) return;
|
|
526
|
+
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
|
527
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
528
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
529
|
+
if (n === "Map" || n === "Set") return Array.from(o);
|
|
530
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
function _arrayLikeToArray(arr, len) {
|
|
534
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
535
|
+
|
|
536
|
+
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
537
|
+
|
|
538
|
+
return arr2;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
function _nonIterableSpread() {
|
|
542
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
var objectPrototypeToString = Object.prototype.toString;
|
|
546
|
+
var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
|
|
547
|
+
// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
|
|
548
|
+
|
|
549
|
+
jsonDiff.useLongestToken = true;
|
|
550
|
+
jsonDiff.tokenize = lineDiff.tokenize;
|
|
551
|
+
|
|
552
|
+
jsonDiff.castInput = function (value) {
|
|
553
|
+
var _this$options = this.options,
|
|
554
|
+
undefinedReplacement = _this$options.undefinedReplacement,
|
|
555
|
+
_this$options$stringi = _this$options.stringifyReplacer,
|
|
556
|
+
stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) {
|
|
557
|
+
return typeof v === 'undefined' ? undefinedReplacement : v;
|
|
558
|
+
} : _this$options$stringi;
|
|
559
|
+
return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');
|
|
560
|
+
};
|
|
561
|
+
|
|
562
|
+
jsonDiff.equals = function (left, right) {
|
|
563
|
+
return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'));
|
|
564
|
+
};
|
|
565
|
+
// object that is already on the "stack" of items being processed. Accepts an optional replacer
|
|
566
|
+
|
|
567
|
+
function canonicalize(obj, stack, replacementStack, replacer, key) {
|
|
568
|
+
stack = stack || [];
|
|
569
|
+
replacementStack = replacementStack || [];
|
|
570
|
+
|
|
571
|
+
if (replacer) {
|
|
572
|
+
obj = replacer(key, obj);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
var i;
|
|
576
|
+
|
|
577
|
+
for (i = 0; i < stack.length; i += 1) {
|
|
578
|
+
if (stack[i] === obj) {
|
|
579
|
+
return replacementStack[i];
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
var canonicalizedObj;
|
|
584
|
+
|
|
585
|
+
if ('[object Array]' === objectPrototypeToString.call(obj)) {
|
|
586
|
+
stack.push(obj);
|
|
587
|
+
canonicalizedObj = new Array(obj.length);
|
|
588
|
+
replacementStack.push(canonicalizedObj);
|
|
589
|
+
|
|
590
|
+
for (i = 0; i < obj.length; i += 1) {
|
|
591
|
+
canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
stack.pop();
|
|
595
|
+
replacementStack.pop();
|
|
596
|
+
return canonicalizedObj;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (obj && obj.toJSON) {
|
|
600
|
+
obj = obj.toJSON();
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
if (_typeof(obj) === 'object' && obj !== null) {
|
|
604
|
+
stack.push(obj);
|
|
605
|
+
canonicalizedObj = {};
|
|
606
|
+
replacementStack.push(canonicalizedObj);
|
|
607
|
+
|
|
608
|
+
var sortedKeys = [],
|
|
609
|
+
_key;
|
|
610
|
+
|
|
611
|
+
for (_key in obj) {
|
|
612
|
+
/* istanbul ignore else */
|
|
613
|
+
if (obj.hasOwnProperty(_key)) {
|
|
614
|
+
sortedKeys.push(_key);
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
sortedKeys.sort();
|
|
619
|
+
|
|
620
|
+
for (i = 0; i < sortedKeys.length; i += 1) {
|
|
621
|
+
_key = sortedKeys[i];
|
|
622
|
+
canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
stack.pop();
|
|
626
|
+
replacementStack.pop();
|
|
627
|
+
} else {
|
|
628
|
+
canonicalizedObj = obj;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
return canonicalizedObj;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
var arrayDiff = new Diff();
|
|
635
|
+
|
|
636
|
+
arrayDiff.tokenize = function (value) {
|
|
637
|
+
return value.slice();
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
arrayDiff.join = arrayDiff.removeEmpty = function (value) {
|
|
641
|
+
return value;
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
|
|
645
|
+
if (!options) {
|
|
646
|
+
options = {};
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (typeof options.context === 'undefined') {
|
|
650
|
+
options.context = 4;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
var diff = diffLines(oldStr, newStr, options);
|
|
654
|
+
diff.push({
|
|
655
|
+
value: '',
|
|
656
|
+
lines: []
|
|
657
|
+
}); // Append an empty value to make cleanup easier
|
|
658
|
+
|
|
659
|
+
function contextLines(lines) {
|
|
660
|
+
return lines.map(function (entry) {
|
|
661
|
+
return ' ' + entry;
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
var hunks = [];
|
|
666
|
+
var oldRangeStart = 0,
|
|
667
|
+
newRangeStart = 0,
|
|
668
|
+
curRange = [],
|
|
669
|
+
oldLine = 1,
|
|
670
|
+
newLine = 1;
|
|
671
|
+
|
|
672
|
+
var _loop = function _loop(i) {
|
|
673
|
+
var current = diff[i],
|
|
674
|
+
lines = current.lines || current.value.replace(/\n$/, '').split('\n');
|
|
675
|
+
current.lines = lines;
|
|
676
|
+
|
|
677
|
+
if (current.added || current.removed) {
|
|
678
|
+
var _curRange;
|
|
679
|
+
|
|
680
|
+
// If we have previous context, start with that
|
|
681
|
+
if (!oldRangeStart) {
|
|
682
|
+
var prev = diff[i - 1];
|
|
683
|
+
oldRangeStart = oldLine;
|
|
684
|
+
newRangeStart = newLine;
|
|
685
|
+
|
|
686
|
+
if (prev) {
|
|
687
|
+
curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];
|
|
688
|
+
oldRangeStart -= curRange.length;
|
|
689
|
+
newRangeStart -= curRange.length;
|
|
690
|
+
}
|
|
691
|
+
} // Output our changes
|
|
692
|
+
|
|
693
|
+
|
|
694
|
+
(_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) {
|
|
695
|
+
return (current.added ? '+' : '-') + entry;
|
|
696
|
+
}))); // Track the updated file position
|
|
697
|
+
|
|
698
|
+
|
|
699
|
+
if (current.added) {
|
|
700
|
+
newLine += lines.length;
|
|
701
|
+
} else {
|
|
702
|
+
oldLine += lines.length;
|
|
703
|
+
}
|
|
704
|
+
} else {
|
|
705
|
+
// Identical context lines. Track line changes
|
|
706
|
+
if (oldRangeStart) {
|
|
707
|
+
// Close out any changes that have been output (or join overlapping)
|
|
708
|
+
if (lines.length <= options.context * 2 && i < diff.length - 2) {
|
|
709
|
+
var _curRange2;
|
|
710
|
+
|
|
711
|
+
// Overlapping
|
|
712
|
+
(_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));
|
|
713
|
+
} else {
|
|
714
|
+
var _curRange3;
|
|
715
|
+
|
|
716
|
+
// end the range and output
|
|
717
|
+
var contextSize = Math.min(lines.length, options.context);
|
|
718
|
+
|
|
719
|
+
(_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));
|
|
720
|
+
|
|
721
|
+
var hunk = {
|
|
722
|
+
oldStart: oldRangeStart,
|
|
723
|
+
oldLines: oldLine - oldRangeStart + contextSize,
|
|
724
|
+
newStart: newRangeStart,
|
|
725
|
+
newLines: newLine - newRangeStart + contextSize,
|
|
726
|
+
lines: curRange
|
|
727
|
+
};
|
|
728
|
+
|
|
729
|
+
if (i >= diff.length - 2 && lines.length <= options.context) {
|
|
730
|
+
// EOF is inside this hunk
|
|
731
|
+
var oldEOFNewline = /\n$/.test(oldStr);
|
|
732
|
+
var newEOFNewline = /\n$/.test(newStr);
|
|
733
|
+
var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;
|
|
734
|
+
|
|
735
|
+
if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) {
|
|
736
|
+
// special case: old has no eol and no trailing context; no-nl can end up before adds
|
|
737
|
+
// however, if the old file is empty, do not output the no-nl line
|
|
738
|
+
curRange.splice(hunk.oldLines, 0, '\');
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {
|
|
742
|
+
curRange.push('\');
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
hunks.push(hunk);
|
|
747
|
+
oldRangeStart = 0;
|
|
748
|
+
newRangeStart = 0;
|
|
749
|
+
curRange = [];
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
oldLine += lines.length;
|
|
754
|
+
newLine += lines.length;
|
|
755
|
+
}
|
|
756
|
+
};
|
|
757
|
+
|
|
758
|
+
for (var i = 0; i < diff.length; i++) {
|
|
759
|
+
_loop(i);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
return {
|
|
763
|
+
oldFileName: oldFileName,
|
|
764
|
+
newFileName: newFileName,
|
|
765
|
+
oldHeader: oldHeader,
|
|
766
|
+
newHeader: newHeader,
|
|
767
|
+
hunks: hunks
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
function formatPatch(diff) {
|
|
771
|
+
var ret = [];
|
|
772
|
+
|
|
773
|
+
if (diff.oldFileName == diff.newFileName) {
|
|
774
|
+
ret.push('Index: ' + diff.oldFileName);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
ret.push('===================================================================');
|
|
778
|
+
ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader));
|
|
779
|
+
ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader));
|
|
780
|
+
|
|
781
|
+
for (var i = 0; i < diff.hunks.length; i++) {
|
|
782
|
+
var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0,
|
|
783
|
+
// the first number is one lower than one would expect.
|
|
784
|
+
// https://www.artima.com/weblogs/viewpost.jsp?thread=164293
|
|
785
|
+
|
|
786
|
+
if (hunk.oldLines === 0) {
|
|
787
|
+
hunk.oldStart -= 1;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
if (hunk.newLines === 0) {
|
|
791
|
+
hunk.newStart -= 1;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');
|
|
795
|
+
ret.push.apply(ret, hunk.lines);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
return ret.join('\n') + '\n';
|
|
799
|
+
}
|
|
800
|
+
function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
|
|
801
|
+
return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options));
|
|
802
|
+
}
|
|
803
|
+
function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {
|
|
804
|
+
return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/* eslint-disable yoda */
|
|
808
|
+
|
|
809
|
+
function isFullwidthCodePoint(codePoint) {
|
|
810
|
+
if (!Number.isInteger(codePoint)) {
|
|
811
|
+
return false;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// Code points are derived from:
|
|
815
|
+
// https://unicode.org/Public/UNIDATA/EastAsianWidth.txt
|
|
816
|
+
return codePoint >= 0x1100 && (
|
|
817
|
+
codePoint <= 0x115F || // Hangul Jamo
|
|
818
|
+
codePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET
|
|
819
|
+
codePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET
|
|
820
|
+
// CJK Radicals Supplement .. Enclosed CJK Letters and Months
|
|
821
|
+
(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||
|
|
822
|
+
// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
|
|
823
|
+
(0x3250 <= codePoint && codePoint <= 0x4DBF) ||
|
|
824
|
+
// CJK Unified Ideographs .. Yi Radicals
|
|
825
|
+
(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||
|
|
826
|
+
// Hangul Jamo Extended-A
|
|
827
|
+
(0xA960 <= codePoint && codePoint <= 0xA97C) ||
|
|
828
|
+
// Hangul Syllables
|
|
829
|
+
(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
|
|
830
|
+
// CJK Compatibility Ideographs
|
|
831
|
+
(0xF900 <= codePoint && codePoint <= 0xFAFF) ||
|
|
832
|
+
// Vertical Forms
|
|
833
|
+
(0xFE10 <= codePoint && codePoint <= 0xFE19) ||
|
|
834
|
+
// CJK Compatibility Forms .. Small Form Variants
|
|
835
|
+
(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||
|
|
836
|
+
// Halfwidth and Fullwidth Forms
|
|
837
|
+
(0xFF01 <= codePoint && codePoint <= 0xFF60) ||
|
|
838
|
+
(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||
|
|
839
|
+
// Kana Supplement
|
|
840
|
+
(0x1B000 <= codePoint && codePoint <= 0x1B001) ||
|
|
841
|
+
// Enclosed Ideographic Supplement
|
|
842
|
+
(0x1F200 <= codePoint && codePoint <= 0x1F251) ||
|
|
843
|
+
// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
|
|
844
|
+
(0x20000 <= codePoint && codePoint <= 0x3FFFD)
|
|
845
|
+
);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
const ANSI_BACKGROUND_OFFSET = 10;
|
|
849
|
+
|
|
850
|
+
const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`;
|
|
851
|
+
|
|
852
|
+
const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`;
|
|
853
|
+
|
|
854
|
+
const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`;
|
|
855
|
+
|
|
856
|
+
function assembleStyles() {
|
|
857
|
+
const codes = new Map();
|
|
858
|
+
const styles = {
|
|
859
|
+
modifier: {
|
|
860
|
+
reset: [0, 0],
|
|
861
|
+
// 21 isn't widely supported and 22 does the same thing
|
|
862
|
+
bold: [1, 22],
|
|
863
|
+
dim: [2, 22],
|
|
864
|
+
italic: [3, 23],
|
|
865
|
+
underline: [4, 24],
|
|
866
|
+
overline: [53, 55],
|
|
867
|
+
inverse: [7, 27],
|
|
868
|
+
hidden: [8, 28],
|
|
869
|
+
strikethrough: [9, 29]
|
|
870
|
+
},
|
|
871
|
+
color: {
|
|
872
|
+
black: [30, 39],
|
|
873
|
+
red: [31, 39],
|
|
874
|
+
green: [32, 39],
|
|
875
|
+
yellow: [33, 39],
|
|
876
|
+
blue: [34, 39],
|
|
877
|
+
magenta: [35, 39],
|
|
878
|
+
cyan: [36, 39],
|
|
879
|
+
white: [37, 39],
|
|
880
|
+
|
|
881
|
+
// Bright color
|
|
882
|
+
blackBright: [90, 39],
|
|
883
|
+
redBright: [91, 39],
|
|
884
|
+
greenBright: [92, 39],
|
|
885
|
+
yellowBright: [93, 39],
|
|
886
|
+
blueBright: [94, 39],
|
|
887
|
+
magentaBright: [95, 39],
|
|
888
|
+
cyanBright: [96, 39],
|
|
889
|
+
whiteBright: [97, 39]
|
|
890
|
+
},
|
|
891
|
+
bgColor: {
|
|
892
|
+
bgBlack: [40, 49],
|
|
893
|
+
bgRed: [41, 49],
|
|
894
|
+
bgGreen: [42, 49],
|
|
895
|
+
bgYellow: [43, 49],
|
|
896
|
+
bgBlue: [44, 49],
|
|
897
|
+
bgMagenta: [45, 49],
|
|
898
|
+
bgCyan: [46, 49],
|
|
899
|
+
bgWhite: [47, 49],
|
|
900
|
+
|
|
901
|
+
// Bright color
|
|
902
|
+
bgBlackBright: [100, 49],
|
|
903
|
+
bgRedBright: [101, 49],
|
|
904
|
+
bgGreenBright: [102, 49],
|
|
905
|
+
bgYellowBright: [103, 49],
|
|
906
|
+
bgBlueBright: [104, 49],
|
|
907
|
+
bgMagentaBright: [105, 49],
|
|
908
|
+
bgCyanBright: [106, 49],
|
|
909
|
+
bgWhiteBright: [107, 49]
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
|
|
913
|
+
// Alias bright black as gray (and grey)
|
|
914
|
+
styles.color.gray = styles.color.blackBright;
|
|
915
|
+
styles.bgColor.bgGray = styles.bgColor.bgBlackBright;
|
|
916
|
+
styles.color.grey = styles.color.blackBright;
|
|
917
|
+
styles.bgColor.bgGrey = styles.bgColor.bgBlackBright;
|
|
918
|
+
|
|
919
|
+
for (const [groupName, group] of Object.entries(styles)) {
|
|
920
|
+
for (const [styleName, style] of Object.entries(group)) {
|
|
921
|
+
styles[styleName] = {
|
|
922
|
+
open: `\u001B[${style[0]}m`,
|
|
923
|
+
close: `\u001B[${style[1]}m`
|
|
924
|
+
};
|
|
925
|
+
|
|
926
|
+
group[styleName] = styles[styleName];
|
|
927
|
+
|
|
928
|
+
codes.set(style[0], style[1]);
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
Object.defineProperty(styles, groupName, {
|
|
932
|
+
value: group,
|
|
933
|
+
enumerable: false
|
|
934
|
+
});
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
Object.defineProperty(styles, 'codes', {
|
|
938
|
+
value: codes,
|
|
939
|
+
enumerable: false
|
|
940
|
+
});
|
|
941
|
+
|
|
942
|
+
styles.color.close = '\u001B[39m';
|
|
943
|
+
styles.bgColor.close = '\u001B[49m';
|
|
944
|
+
|
|
945
|
+
styles.color.ansi = wrapAnsi16();
|
|
946
|
+
styles.color.ansi256 = wrapAnsi256();
|
|
947
|
+
styles.color.ansi16m = wrapAnsi16m();
|
|
948
|
+
styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
|
|
949
|
+
styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
|
|
950
|
+
styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
|
|
951
|
+
|
|
952
|
+
// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js
|
|
953
|
+
Object.defineProperties(styles, {
|
|
954
|
+
rgbToAnsi256: {
|
|
955
|
+
value: (red, green, blue) => {
|
|
956
|
+
// We use the extended greyscale palette here, with the exception of
|
|
957
|
+
// black and white. normal palette only has 4 greyscale shades.
|
|
958
|
+
if (red === green && green === blue) {
|
|
959
|
+
if (red < 8) {
|
|
960
|
+
return 16;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
if (red > 248) {
|
|
964
|
+
return 231;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
return Math.round(((red - 8) / 247) * 24) + 232;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
return 16 +
|
|
971
|
+
(36 * Math.round(red / 255 * 5)) +
|
|
972
|
+
(6 * Math.round(green / 255 * 5)) +
|
|
973
|
+
Math.round(blue / 255 * 5);
|
|
974
|
+
},
|
|
975
|
+
enumerable: false
|
|
976
|
+
},
|
|
977
|
+
hexToRgb: {
|
|
978
|
+
value: hex => {
|
|
979
|
+
const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16));
|
|
980
|
+
if (!matches) {
|
|
981
|
+
return [0, 0, 0];
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
let {colorString} = matches.groups;
|
|
985
|
+
|
|
986
|
+
if (colorString.length === 3) {
|
|
987
|
+
colorString = colorString.split('').map(character => character + character).join('');
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
const integer = Number.parseInt(colorString, 16);
|
|
991
|
+
|
|
992
|
+
return [
|
|
993
|
+
(integer >> 16) & 0xFF,
|
|
994
|
+
(integer >> 8) & 0xFF,
|
|
995
|
+
integer & 0xFF
|
|
996
|
+
];
|
|
997
|
+
},
|
|
998
|
+
enumerable: false
|
|
999
|
+
},
|
|
1000
|
+
hexToAnsi256: {
|
|
1001
|
+
value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
|
|
1002
|
+
enumerable: false
|
|
1003
|
+
},
|
|
1004
|
+
ansi256ToAnsi: {
|
|
1005
|
+
value: code => {
|
|
1006
|
+
if (code < 8) {
|
|
1007
|
+
return 30 + code;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
if (code < 16) {
|
|
1011
|
+
return 90 + (code - 8);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
let red;
|
|
1015
|
+
let green;
|
|
1016
|
+
let blue;
|
|
1017
|
+
|
|
1018
|
+
if (code >= 232) {
|
|
1019
|
+
red = (((code - 232) * 10) + 8) / 255;
|
|
1020
|
+
green = red;
|
|
1021
|
+
blue = red;
|
|
1022
|
+
} else {
|
|
1023
|
+
code -= 16;
|
|
1024
|
+
|
|
1025
|
+
const remainder = code % 36;
|
|
1026
|
+
|
|
1027
|
+
red = Math.floor(code / 36) / 5;
|
|
1028
|
+
green = Math.floor(remainder / 6) / 5;
|
|
1029
|
+
blue = (remainder % 6) / 5;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
const value = Math.max(red, green, blue) * 2;
|
|
1033
|
+
|
|
1034
|
+
if (value === 0) {
|
|
1035
|
+
return 30;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));
|
|
1039
|
+
|
|
1040
|
+
if (value === 2) {
|
|
1041
|
+
result += 60;
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
return result;
|
|
1045
|
+
},
|
|
1046
|
+
enumerable: false
|
|
1047
|
+
},
|
|
1048
|
+
rgbToAnsi: {
|
|
1049
|
+
value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
|
|
1050
|
+
enumerable: false
|
|
1051
|
+
},
|
|
1052
|
+
hexToAnsi: {
|
|
1053
|
+
value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
|
|
1054
|
+
enumerable: false
|
|
1055
|
+
}
|
|
1056
|
+
});
|
|
1057
|
+
|
|
1058
|
+
return styles;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
const ansiStyles = assembleStyles();
|
|
1062
|
+
|
|
1063
|
+
const astralRegex = /^[\uD800-\uDBFF][\uDC00-\uDFFF]$/;
|
|
1064
|
+
|
|
1065
|
+
const ESCAPES = [
|
|
1066
|
+
'\u001B',
|
|
1067
|
+
'\u009B'
|
|
1068
|
+
];
|
|
1069
|
+
|
|
1070
|
+
const wrapAnsi = code => `${ESCAPES[0]}[${code}m`;
|
|
1071
|
+
|
|
1072
|
+
const checkAnsi = (ansiCodes, isEscapes, endAnsiCode) => {
|
|
1073
|
+
let output = [];
|
|
1074
|
+
ansiCodes = [...ansiCodes];
|
|
1075
|
+
|
|
1076
|
+
for (let ansiCode of ansiCodes) {
|
|
1077
|
+
const ansiCodeOrigin = ansiCode;
|
|
1078
|
+
if (ansiCode.includes(';')) {
|
|
1079
|
+
ansiCode = ansiCode.split(';')[0][0] + '0';
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
const item = ansiStyles.codes.get(Number.parseInt(ansiCode, 10));
|
|
1083
|
+
if (item) {
|
|
1084
|
+
const indexEscape = ansiCodes.indexOf(item.toString());
|
|
1085
|
+
if (indexEscape === -1) {
|
|
1086
|
+
output.push(wrapAnsi(isEscapes ? item : ansiCodeOrigin));
|
|
1087
|
+
} else {
|
|
1088
|
+
ansiCodes.splice(indexEscape, 1);
|
|
1089
|
+
}
|
|
1090
|
+
} else if (isEscapes) {
|
|
1091
|
+
output.push(wrapAnsi(0));
|
|
1092
|
+
break;
|
|
1093
|
+
} else {
|
|
1094
|
+
output.push(wrapAnsi(ansiCodeOrigin));
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
if (isEscapes) {
|
|
1099
|
+
output = output.filter((element, index) => output.indexOf(element) === index);
|
|
1100
|
+
|
|
1101
|
+
if (endAnsiCode !== undefined) {
|
|
1102
|
+
const fistEscapeCode = wrapAnsi(ansiStyles.codes.get(Number.parseInt(endAnsiCode, 10)));
|
|
1103
|
+
// TODO: Remove the use of `.reduce` here.
|
|
1104
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
1105
|
+
output = output.reduce((current, next) => next === fistEscapeCode ? [next, ...current] : [...current, next], []);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
return output.join('');
|
|
1110
|
+
};
|
|
1111
|
+
|
|
1112
|
+
function sliceAnsi(string, begin, end) {
|
|
1113
|
+
const characters = [...string];
|
|
1114
|
+
const ansiCodes = [];
|
|
1115
|
+
|
|
1116
|
+
let stringEnd = typeof end === 'number' ? end : characters.length;
|
|
1117
|
+
let isInsideEscape = false;
|
|
1118
|
+
let ansiCode;
|
|
1119
|
+
let visible = 0;
|
|
1120
|
+
let output = '';
|
|
1121
|
+
|
|
1122
|
+
for (const [index, character] of characters.entries()) {
|
|
1123
|
+
let leftEscape = false;
|
|
1124
|
+
|
|
1125
|
+
if (ESCAPES.includes(character)) {
|
|
1126
|
+
const code = /\d[^m]*/.exec(string.slice(index, index + 18));
|
|
1127
|
+
ansiCode = code && code.length > 0 ? code[0] : undefined;
|
|
1128
|
+
|
|
1129
|
+
if (visible < stringEnd) {
|
|
1130
|
+
isInsideEscape = true;
|
|
1131
|
+
|
|
1132
|
+
if (ansiCode !== undefined) {
|
|
1133
|
+
ansiCodes.push(ansiCode);
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
} else if (isInsideEscape && character === 'm') {
|
|
1137
|
+
isInsideEscape = false;
|
|
1138
|
+
leftEscape = true;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
if (!isInsideEscape && !leftEscape) {
|
|
1142
|
+
visible++;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
if (!astralRegex.test(character) && isFullwidthCodePoint(character.codePointAt())) {
|
|
1146
|
+
visible++;
|
|
1147
|
+
|
|
1148
|
+
if (typeof end !== 'number') {
|
|
1149
|
+
stringEnd++;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
if (visible > begin && visible <= stringEnd) {
|
|
1154
|
+
output += character;
|
|
1155
|
+
} else if (visible === begin && !isInsideEscape && ansiCode !== undefined) {
|
|
1156
|
+
output = checkAnsi(ansiCodes);
|
|
1157
|
+
} else if (visible >= stringEnd) {
|
|
1158
|
+
output += checkAnsi(ansiCodes, true, ansiCode);
|
|
1159
|
+
break;
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
return output;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
function ansiRegex({onlyFirst = false} = {}) {
|
|
1167
|
+
const pattern = [
|
|
1168
|
+
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
|
|
1169
|
+
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'
|
|
1170
|
+
].join('|');
|
|
1171
|
+
|
|
1172
|
+
return new RegExp(pattern, onlyFirst ? undefined : 'g');
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
function stripAnsi(string) {
|
|
1176
|
+
if (typeof string !== 'string') {
|
|
1177
|
+
throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
return string.replace(ansiRegex(), '');
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
var eastasianwidth = {exports: {}};
|
|
1184
|
+
|
|
1185
|
+
(function (module) {
|
|
1186
|
+
var eaw = {};
|
|
1187
|
+
|
|
1188
|
+
{
|
|
1189
|
+
module.exports = eaw;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
eaw.eastAsianWidth = function(character) {
|
|
1193
|
+
var x = character.charCodeAt(0);
|
|
1194
|
+
var y = (character.length == 2) ? character.charCodeAt(1) : 0;
|
|
1195
|
+
var codePoint = x;
|
|
1196
|
+
if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {
|
|
1197
|
+
x &= 0x3FF;
|
|
1198
|
+
y &= 0x3FF;
|
|
1199
|
+
codePoint = (x << 10) | y;
|
|
1200
|
+
codePoint += 0x10000;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
if ((0x3000 == codePoint) ||
|
|
1204
|
+
(0xFF01 <= codePoint && codePoint <= 0xFF60) ||
|
|
1205
|
+
(0xFFE0 <= codePoint && codePoint <= 0xFFE6)) {
|
|
1206
|
+
return 'F';
|
|
1207
|
+
}
|
|
1208
|
+
if ((0x20A9 == codePoint) ||
|
|
1209
|
+
(0xFF61 <= codePoint && codePoint <= 0xFFBE) ||
|
|
1210
|
+
(0xFFC2 <= codePoint && codePoint <= 0xFFC7) ||
|
|
1211
|
+
(0xFFCA <= codePoint && codePoint <= 0xFFCF) ||
|
|
1212
|
+
(0xFFD2 <= codePoint && codePoint <= 0xFFD7) ||
|
|
1213
|
+
(0xFFDA <= codePoint && codePoint <= 0xFFDC) ||
|
|
1214
|
+
(0xFFE8 <= codePoint && codePoint <= 0xFFEE)) {
|
|
1215
|
+
return 'H';
|
|
1216
|
+
}
|
|
1217
|
+
if ((0x1100 <= codePoint && codePoint <= 0x115F) ||
|
|
1218
|
+
(0x11A3 <= codePoint && codePoint <= 0x11A7) ||
|
|
1219
|
+
(0x11FA <= codePoint && codePoint <= 0x11FF) ||
|
|
1220
|
+
(0x2329 <= codePoint && codePoint <= 0x232A) ||
|
|
1221
|
+
(0x2E80 <= codePoint && codePoint <= 0x2E99) ||
|
|
1222
|
+
(0x2E9B <= codePoint && codePoint <= 0x2EF3) ||
|
|
1223
|
+
(0x2F00 <= codePoint && codePoint <= 0x2FD5) ||
|
|
1224
|
+
(0x2FF0 <= codePoint && codePoint <= 0x2FFB) ||
|
|
1225
|
+
(0x3001 <= codePoint && codePoint <= 0x303E) ||
|
|
1226
|
+
(0x3041 <= codePoint && codePoint <= 0x3096) ||
|
|
1227
|
+
(0x3099 <= codePoint && codePoint <= 0x30FF) ||
|
|
1228
|
+
(0x3105 <= codePoint && codePoint <= 0x312D) ||
|
|
1229
|
+
(0x3131 <= codePoint && codePoint <= 0x318E) ||
|
|
1230
|
+
(0x3190 <= codePoint && codePoint <= 0x31BA) ||
|
|
1231
|
+
(0x31C0 <= codePoint && codePoint <= 0x31E3) ||
|
|
1232
|
+
(0x31F0 <= codePoint && codePoint <= 0x321E) ||
|
|
1233
|
+
(0x3220 <= codePoint && codePoint <= 0x3247) ||
|
|
1234
|
+
(0x3250 <= codePoint && codePoint <= 0x32FE) ||
|
|
1235
|
+
(0x3300 <= codePoint && codePoint <= 0x4DBF) ||
|
|
1236
|
+
(0x4E00 <= codePoint && codePoint <= 0xA48C) ||
|
|
1237
|
+
(0xA490 <= codePoint && codePoint <= 0xA4C6) ||
|
|
1238
|
+
(0xA960 <= codePoint && codePoint <= 0xA97C) ||
|
|
1239
|
+
(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||
|
|
1240
|
+
(0xD7B0 <= codePoint && codePoint <= 0xD7C6) ||
|
|
1241
|
+
(0xD7CB <= codePoint && codePoint <= 0xD7FB) ||
|
|
1242
|
+
(0xF900 <= codePoint && codePoint <= 0xFAFF) ||
|
|
1243
|
+
(0xFE10 <= codePoint && codePoint <= 0xFE19) ||
|
|
1244
|
+
(0xFE30 <= codePoint && codePoint <= 0xFE52) ||
|
|
1245
|
+
(0xFE54 <= codePoint && codePoint <= 0xFE66) ||
|
|
1246
|
+
(0xFE68 <= codePoint && codePoint <= 0xFE6B) ||
|
|
1247
|
+
(0x1B000 <= codePoint && codePoint <= 0x1B001) ||
|
|
1248
|
+
(0x1F200 <= codePoint && codePoint <= 0x1F202) ||
|
|
1249
|
+
(0x1F210 <= codePoint && codePoint <= 0x1F23A) ||
|
|
1250
|
+
(0x1F240 <= codePoint && codePoint <= 0x1F248) ||
|
|
1251
|
+
(0x1F250 <= codePoint && codePoint <= 0x1F251) ||
|
|
1252
|
+
(0x20000 <= codePoint && codePoint <= 0x2F73F) ||
|
|
1253
|
+
(0x2B740 <= codePoint && codePoint <= 0x2FFFD) ||
|
|
1254
|
+
(0x30000 <= codePoint && codePoint <= 0x3FFFD)) {
|
|
1255
|
+
return 'W';
|
|
1256
|
+
}
|
|
1257
|
+
if ((0x0020 <= codePoint && codePoint <= 0x007E) ||
|
|
1258
|
+
(0x00A2 <= codePoint && codePoint <= 0x00A3) ||
|
|
1259
|
+
(0x00A5 <= codePoint && codePoint <= 0x00A6) ||
|
|
1260
|
+
(0x00AC == codePoint) ||
|
|
1261
|
+
(0x00AF == codePoint) ||
|
|
1262
|
+
(0x27E6 <= codePoint && codePoint <= 0x27ED) ||
|
|
1263
|
+
(0x2985 <= codePoint && codePoint <= 0x2986)) {
|
|
1264
|
+
return 'Na';
|
|
1265
|
+
}
|
|
1266
|
+
if ((0x00A1 == codePoint) ||
|
|
1267
|
+
(0x00A4 == codePoint) ||
|
|
1268
|
+
(0x00A7 <= codePoint && codePoint <= 0x00A8) ||
|
|
1269
|
+
(0x00AA == codePoint) ||
|
|
1270
|
+
(0x00AD <= codePoint && codePoint <= 0x00AE) ||
|
|
1271
|
+
(0x00B0 <= codePoint && codePoint <= 0x00B4) ||
|
|
1272
|
+
(0x00B6 <= codePoint && codePoint <= 0x00BA) ||
|
|
1273
|
+
(0x00BC <= codePoint && codePoint <= 0x00BF) ||
|
|
1274
|
+
(0x00C6 == codePoint) ||
|
|
1275
|
+
(0x00D0 == codePoint) ||
|
|
1276
|
+
(0x00D7 <= codePoint && codePoint <= 0x00D8) ||
|
|
1277
|
+
(0x00DE <= codePoint && codePoint <= 0x00E1) ||
|
|
1278
|
+
(0x00E6 == codePoint) ||
|
|
1279
|
+
(0x00E8 <= codePoint && codePoint <= 0x00EA) ||
|
|
1280
|
+
(0x00EC <= codePoint && codePoint <= 0x00ED) ||
|
|
1281
|
+
(0x00F0 == codePoint) ||
|
|
1282
|
+
(0x00F2 <= codePoint && codePoint <= 0x00F3) ||
|
|
1283
|
+
(0x00F7 <= codePoint && codePoint <= 0x00FA) ||
|
|
1284
|
+
(0x00FC == codePoint) ||
|
|
1285
|
+
(0x00FE == codePoint) ||
|
|
1286
|
+
(0x0101 == codePoint) ||
|
|
1287
|
+
(0x0111 == codePoint) ||
|
|
1288
|
+
(0x0113 == codePoint) ||
|
|
1289
|
+
(0x011B == codePoint) ||
|
|
1290
|
+
(0x0126 <= codePoint && codePoint <= 0x0127) ||
|
|
1291
|
+
(0x012B == codePoint) ||
|
|
1292
|
+
(0x0131 <= codePoint && codePoint <= 0x0133) ||
|
|
1293
|
+
(0x0138 == codePoint) ||
|
|
1294
|
+
(0x013F <= codePoint && codePoint <= 0x0142) ||
|
|
1295
|
+
(0x0144 == codePoint) ||
|
|
1296
|
+
(0x0148 <= codePoint && codePoint <= 0x014B) ||
|
|
1297
|
+
(0x014D == codePoint) ||
|
|
1298
|
+
(0x0152 <= codePoint && codePoint <= 0x0153) ||
|
|
1299
|
+
(0x0166 <= codePoint && codePoint <= 0x0167) ||
|
|
1300
|
+
(0x016B == codePoint) ||
|
|
1301
|
+
(0x01CE == codePoint) ||
|
|
1302
|
+
(0x01D0 == codePoint) ||
|
|
1303
|
+
(0x01D2 == codePoint) ||
|
|
1304
|
+
(0x01D4 == codePoint) ||
|
|
1305
|
+
(0x01D6 == codePoint) ||
|
|
1306
|
+
(0x01D8 == codePoint) ||
|
|
1307
|
+
(0x01DA == codePoint) ||
|
|
1308
|
+
(0x01DC == codePoint) ||
|
|
1309
|
+
(0x0251 == codePoint) ||
|
|
1310
|
+
(0x0261 == codePoint) ||
|
|
1311
|
+
(0x02C4 == codePoint) ||
|
|
1312
|
+
(0x02C7 == codePoint) ||
|
|
1313
|
+
(0x02C9 <= codePoint && codePoint <= 0x02CB) ||
|
|
1314
|
+
(0x02CD == codePoint) ||
|
|
1315
|
+
(0x02D0 == codePoint) ||
|
|
1316
|
+
(0x02D8 <= codePoint && codePoint <= 0x02DB) ||
|
|
1317
|
+
(0x02DD == codePoint) ||
|
|
1318
|
+
(0x02DF == codePoint) ||
|
|
1319
|
+
(0x0300 <= codePoint && codePoint <= 0x036F) ||
|
|
1320
|
+
(0x0391 <= codePoint && codePoint <= 0x03A1) ||
|
|
1321
|
+
(0x03A3 <= codePoint && codePoint <= 0x03A9) ||
|
|
1322
|
+
(0x03B1 <= codePoint && codePoint <= 0x03C1) ||
|
|
1323
|
+
(0x03C3 <= codePoint && codePoint <= 0x03C9) ||
|
|
1324
|
+
(0x0401 == codePoint) ||
|
|
1325
|
+
(0x0410 <= codePoint && codePoint <= 0x044F) ||
|
|
1326
|
+
(0x0451 == codePoint) ||
|
|
1327
|
+
(0x2010 == codePoint) ||
|
|
1328
|
+
(0x2013 <= codePoint && codePoint <= 0x2016) ||
|
|
1329
|
+
(0x2018 <= codePoint && codePoint <= 0x2019) ||
|
|
1330
|
+
(0x201C <= codePoint && codePoint <= 0x201D) ||
|
|
1331
|
+
(0x2020 <= codePoint && codePoint <= 0x2022) ||
|
|
1332
|
+
(0x2024 <= codePoint && codePoint <= 0x2027) ||
|
|
1333
|
+
(0x2030 == codePoint) ||
|
|
1334
|
+
(0x2032 <= codePoint && codePoint <= 0x2033) ||
|
|
1335
|
+
(0x2035 == codePoint) ||
|
|
1336
|
+
(0x203B == codePoint) ||
|
|
1337
|
+
(0x203E == codePoint) ||
|
|
1338
|
+
(0x2074 == codePoint) ||
|
|
1339
|
+
(0x207F == codePoint) ||
|
|
1340
|
+
(0x2081 <= codePoint && codePoint <= 0x2084) ||
|
|
1341
|
+
(0x20AC == codePoint) ||
|
|
1342
|
+
(0x2103 == codePoint) ||
|
|
1343
|
+
(0x2105 == codePoint) ||
|
|
1344
|
+
(0x2109 == codePoint) ||
|
|
1345
|
+
(0x2113 == codePoint) ||
|
|
1346
|
+
(0x2116 == codePoint) ||
|
|
1347
|
+
(0x2121 <= codePoint && codePoint <= 0x2122) ||
|
|
1348
|
+
(0x2126 == codePoint) ||
|
|
1349
|
+
(0x212B == codePoint) ||
|
|
1350
|
+
(0x2153 <= codePoint && codePoint <= 0x2154) ||
|
|
1351
|
+
(0x215B <= codePoint && codePoint <= 0x215E) ||
|
|
1352
|
+
(0x2160 <= codePoint && codePoint <= 0x216B) ||
|
|
1353
|
+
(0x2170 <= codePoint && codePoint <= 0x2179) ||
|
|
1354
|
+
(0x2189 == codePoint) ||
|
|
1355
|
+
(0x2190 <= codePoint && codePoint <= 0x2199) ||
|
|
1356
|
+
(0x21B8 <= codePoint && codePoint <= 0x21B9) ||
|
|
1357
|
+
(0x21D2 == codePoint) ||
|
|
1358
|
+
(0x21D4 == codePoint) ||
|
|
1359
|
+
(0x21E7 == codePoint) ||
|
|
1360
|
+
(0x2200 == codePoint) ||
|
|
1361
|
+
(0x2202 <= codePoint && codePoint <= 0x2203) ||
|
|
1362
|
+
(0x2207 <= codePoint && codePoint <= 0x2208) ||
|
|
1363
|
+
(0x220B == codePoint) ||
|
|
1364
|
+
(0x220F == codePoint) ||
|
|
1365
|
+
(0x2211 == codePoint) ||
|
|
1366
|
+
(0x2215 == codePoint) ||
|
|
1367
|
+
(0x221A == codePoint) ||
|
|
1368
|
+
(0x221D <= codePoint && codePoint <= 0x2220) ||
|
|
1369
|
+
(0x2223 == codePoint) ||
|
|
1370
|
+
(0x2225 == codePoint) ||
|
|
1371
|
+
(0x2227 <= codePoint && codePoint <= 0x222C) ||
|
|
1372
|
+
(0x222E == codePoint) ||
|
|
1373
|
+
(0x2234 <= codePoint && codePoint <= 0x2237) ||
|
|
1374
|
+
(0x223C <= codePoint && codePoint <= 0x223D) ||
|
|
1375
|
+
(0x2248 == codePoint) ||
|
|
1376
|
+
(0x224C == codePoint) ||
|
|
1377
|
+
(0x2252 == codePoint) ||
|
|
1378
|
+
(0x2260 <= codePoint && codePoint <= 0x2261) ||
|
|
1379
|
+
(0x2264 <= codePoint && codePoint <= 0x2267) ||
|
|
1380
|
+
(0x226A <= codePoint && codePoint <= 0x226B) ||
|
|
1381
|
+
(0x226E <= codePoint && codePoint <= 0x226F) ||
|
|
1382
|
+
(0x2282 <= codePoint && codePoint <= 0x2283) ||
|
|
1383
|
+
(0x2286 <= codePoint && codePoint <= 0x2287) ||
|
|
1384
|
+
(0x2295 == codePoint) ||
|
|
1385
|
+
(0x2299 == codePoint) ||
|
|
1386
|
+
(0x22A5 == codePoint) ||
|
|
1387
|
+
(0x22BF == codePoint) ||
|
|
1388
|
+
(0x2312 == codePoint) ||
|
|
1389
|
+
(0x2460 <= codePoint && codePoint <= 0x24E9) ||
|
|
1390
|
+
(0x24EB <= codePoint && codePoint <= 0x254B) ||
|
|
1391
|
+
(0x2550 <= codePoint && codePoint <= 0x2573) ||
|
|
1392
|
+
(0x2580 <= codePoint && codePoint <= 0x258F) ||
|
|
1393
|
+
(0x2592 <= codePoint && codePoint <= 0x2595) ||
|
|
1394
|
+
(0x25A0 <= codePoint && codePoint <= 0x25A1) ||
|
|
1395
|
+
(0x25A3 <= codePoint && codePoint <= 0x25A9) ||
|
|
1396
|
+
(0x25B2 <= codePoint && codePoint <= 0x25B3) ||
|
|
1397
|
+
(0x25B6 <= codePoint && codePoint <= 0x25B7) ||
|
|
1398
|
+
(0x25BC <= codePoint && codePoint <= 0x25BD) ||
|
|
1399
|
+
(0x25C0 <= codePoint && codePoint <= 0x25C1) ||
|
|
1400
|
+
(0x25C6 <= codePoint && codePoint <= 0x25C8) ||
|
|
1401
|
+
(0x25CB == codePoint) ||
|
|
1402
|
+
(0x25CE <= codePoint && codePoint <= 0x25D1) ||
|
|
1403
|
+
(0x25E2 <= codePoint && codePoint <= 0x25E5) ||
|
|
1404
|
+
(0x25EF == codePoint) ||
|
|
1405
|
+
(0x2605 <= codePoint && codePoint <= 0x2606) ||
|
|
1406
|
+
(0x2609 == codePoint) ||
|
|
1407
|
+
(0x260E <= codePoint && codePoint <= 0x260F) ||
|
|
1408
|
+
(0x2614 <= codePoint && codePoint <= 0x2615) ||
|
|
1409
|
+
(0x261C == codePoint) ||
|
|
1410
|
+
(0x261E == codePoint) ||
|
|
1411
|
+
(0x2640 == codePoint) ||
|
|
1412
|
+
(0x2642 == codePoint) ||
|
|
1413
|
+
(0x2660 <= codePoint && codePoint <= 0x2661) ||
|
|
1414
|
+
(0x2663 <= codePoint && codePoint <= 0x2665) ||
|
|
1415
|
+
(0x2667 <= codePoint && codePoint <= 0x266A) ||
|
|
1416
|
+
(0x266C <= codePoint && codePoint <= 0x266D) ||
|
|
1417
|
+
(0x266F == codePoint) ||
|
|
1418
|
+
(0x269E <= codePoint && codePoint <= 0x269F) ||
|
|
1419
|
+
(0x26BE <= codePoint && codePoint <= 0x26BF) ||
|
|
1420
|
+
(0x26C4 <= codePoint && codePoint <= 0x26CD) ||
|
|
1421
|
+
(0x26CF <= codePoint && codePoint <= 0x26E1) ||
|
|
1422
|
+
(0x26E3 == codePoint) ||
|
|
1423
|
+
(0x26E8 <= codePoint && codePoint <= 0x26FF) ||
|
|
1424
|
+
(0x273D == codePoint) ||
|
|
1425
|
+
(0x2757 == codePoint) ||
|
|
1426
|
+
(0x2776 <= codePoint && codePoint <= 0x277F) ||
|
|
1427
|
+
(0x2B55 <= codePoint && codePoint <= 0x2B59) ||
|
|
1428
|
+
(0x3248 <= codePoint && codePoint <= 0x324F) ||
|
|
1429
|
+
(0xE000 <= codePoint && codePoint <= 0xF8FF) ||
|
|
1430
|
+
(0xFE00 <= codePoint && codePoint <= 0xFE0F) ||
|
|
1431
|
+
(0xFFFD == codePoint) ||
|
|
1432
|
+
(0x1F100 <= codePoint && codePoint <= 0x1F10A) ||
|
|
1433
|
+
(0x1F110 <= codePoint && codePoint <= 0x1F12D) ||
|
|
1434
|
+
(0x1F130 <= codePoint && codePoint <= 0x1F169) ||
|
|
1435
|
+
(0x1F170 <= codePoint && codePoint <= 0x1F19A) ||
|
|
1436
|
+
(0xE0100 <= codePoint && codePoint <= 0xE01EF) ||
|
|
1437
|
+
(0xF0000 <= codePoint && codePoint <= 0xFFFFD) ||
|
|
1438
|
+
(0x100000 <= codePoint && codePoint <= 0x10FFFD)) {
|
|
1439
|
+
return 'A';
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
return 'N';
|
|
1443
|
+
};
|
|
1444
|
+
|
|
1445
|
+
eaw.characterLength = function(character) {
|
|
1446
|
+
var code = this.eastAsianWidth(character);
|
|
1447
|
+
if (code == 'F' || code == 'W' || code == 'A') {
|
|
1448
|
+
return 2;
|
|
1449
|
+
} else {
|
|
1450
|
+
return 1;
|
|
1451
|
+
}
|
|
1452
|
+
};
|
|
1453
|
+
|
|
1454
|
+
// Split a string considering surrogate-pairs.
|
|
1455
|
+
function stringToArray(string) {
|
|
1456
|
+
return string.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
eaw.length = function(string) {
|
|
1460
|
+
var characters = stringToArray(string);
|
|
1461
|
+
var len = 0;
|
|
1462
|
+
for (var i = 0; i < characters.length; i++) {
|
|
1463
|
+
len = len + this.characterLength(characters[i]);
|
|
1464
|
+
}
|
|
1465
|
+
return len;
|
|
1466
|
+
};
|
|
1467
|
+
|
|
1468
|
+
eaw.slice = function(text, start, end) {
|
|
1469
|
+
textLen = eaw.length(text);
|
|
1470
|
+
start = start ? start : 0;
|
|
1471
|
+
end = end ? end : 1;
|
|
1472
|
+
if (start < 0) {
|
|
1473
|
+
start = textLen + start;
|
|
1474
|
+
}
|
|
1475
|
+
if (end < 0) {
|
|
1476
|
+
end = textLen + end;
|
|
1477
|
+
}
|
|
1478
|
+
var result = '';
|
|
1479
|
+
var eawLen = 0;
|
|
1480
|
+
var chars = stringToArray(text);
|
|
1481
|
+
for (var i = 0; i < chars.length; i++) {
|
|
1482
|
+
var char = chars[i];
|
|
1483
|
+
var charLen = eaw.length(char);
|
|
1484
|
+
if (eawLen >= start - (charLen == 2 ? 1 : 0)) {
|
|
1485
|
+
if (eawLen + charLen <= end) {
|
|
1486
|
+
result += char;
|
|
1487
|
+
} else {
|
|
1488
|
+
break;
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
eawLen += charLen;
|
|
1492
|
+
}
|
|
1493
|
+
return result;
|
|
1494
|
+
};
|
|
1495
|
+
}(eastasianwidth));
|
|
1496
|
+
|
|
1497
|
+
var eastAsianWidth = eastasianwidth.exports;
|
|
1498
|
+
|
|
1499
|
+
var emojiRegex = function () {
|
|
1500
|
+
// https://mths.be/emoji
|
|
1501
|
+
return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67)\uDB40\uDC7F|(?:\uD83E\uDDD1\uD83C\uDFFF\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFC-\uDFFF])|\uD83D\uDC68(?:\uD83C\uDFFB(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|[\u2695\u2696\u2708]\uFE0F|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))?|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFF]))|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])\uFE0F|\u200D(?:(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D[\uDC66\uDC67])|\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC)?|(?:\uD83D\uDC69(?:\uD83C\uDFFB\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|(?:\uD83C[\uDFFC-\uDFFF])\u200D\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69]))|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC69(?:\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83E\uDDD1(?:\u200D(?:\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|\uD83D\uDE36\u200D\uD83C\uDF2B|\uD83C\uDFF3\uFE0F\u200D\u26A7|\uD83D\uDC3B\u200D\u2744|(?:(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\uD83C\uDFF4\u200D\u2620|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])\u200D[\u2640\u2642]|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u2600-\u2604\u260E\u2611\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26B0\u26B1\u26C8\u26CF\u26D1\u26D3\u26E9\u26F0\u26F1\u26F4\u26F7\u26F8\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u3030\u303D\u3297\u3299]|\uD83C[\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]|\uD83D[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3])\uFE0F|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDE35\u200D\uD83D\uDCAB|\uD83D\uDE2E\u200D\uD83D\uDCA8|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83E\uDDD1(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83D\uDC69(?:\uD83C\uDFFF|\uD83C\uDFFE|\uD83C\uDFFD|\uD83C\uDFFC|\uD83C\uDFFB)?|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF6\uD83C\uDDE6|\uD83C\uDDF4\uD83C\uDDF2|\uD83D\uDC08\u200D\u2B1B|\u2764\uFE0F\u200D(?:\uD83D\uDD25|\uD83E\uDE79)|\uD83D\uDC41\uFE0F|\uD83C\uDFF3\uFE0F|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|[#\*0-9]\uFE0F\u20E3|\u2764\uFE0F|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|\uD83C\uDFF4|(?:[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270C\u270D]|\uD83D[\uDD74\uDD90])(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])|[\u270A\u270B]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC08\uDC15\uDC3B\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE2E\uDE35\uDE36\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5]|\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD4\uDDD6-\uDDDD]|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF]|[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0D\uDD0E\uDD10-\uDD17\uDD1D\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78\uDD7A-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCB\uDDD0\uDDE0-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6]|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5-\uDED7\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26A7\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5-\uDED7\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFC\uDFE0-\uDFEB]|\uD83E[\uDD0C-\uDD3A\uDD3C-\uDD45\uDD47-\uDD78\uDD7A-\uDDCB\uDDCD-\uDDFF\uDE70-\uDE74\uDE78-\uDE7A\uDE80-\uDE86\uDE90-\uDEA8\uDEB0-\uDEB6\uDEC0-\uDEC2\uDED0-\uDED6])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0C\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDD77\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
|
|
1502
|
+
};
|
|
1503
|
+
|
|
1504
|
+
function stringWidth(string, options = {}) {
|
|
1505
|
+
if (typeof string !== 'string' || string.length === 0) {
|
|
1506
|
+
return 0;
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
string = stripAnsi(string);
|
|
1510
|
+
|
|
1511
|
+
if (string.length === 0) {
|
|
1512
|
+
return 0;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
string = string.replace(emojiRegex(), ' ');
|
|
1516
|
+
|
|
1517
|
+
const ambiguousCharWidth = options.ambiguousIsNarrow ? 1 : 2;
|
|
1518
|
+
let width = 0;
|
|
1519
|
+
|
|
1520
|
+
for (let index = 0; index < string.length; index++) {
|
|
1521
|
+
const codePoint = string.codePointAt(index);
|
|
1522
|
+
|
|
1523
|
+
// Ignore control characters
|
|
1524
|
+
if (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {
|
|
1525
|
+
continue;
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
// Ignore combining characters
|
|
1529
|
+
if (codePoint >= 0x300 && codePoint <= 0x36F) {
|
|
1530
|
+
continue;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
const code = eastAsianWidth.eastAsianWidth(string.charAt(index));
|
|
1534
|
+
switch (code) {
|
|
1535
|
+
case 'F':
|
|
1536
|
+
case 'W':
|
|
1537
|
+
width += 2;
|
|
1538
|
+
break;
|
|
1539
|
+
case 'A':
|
|
1540
|
+
width += ambiguousCharWidth;
|
|
1541
|
+
break;
|
|
1542
|
+
default:
|
|
1543
|
+
width += 1;
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
return width;
|
|
1548
|
+
}
|
|
1549
|
+
|
|
1550
|
+
function getIndexOfNearestSpace(string, wantedIndex, shouldSearchRight) {
|
|
1551
|
+
if (string.charAt(wantedIndex) === ' ') {
|
|
1552
|
+
return wantedIndex;
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
for (let index = 1; index <= 3; index++) {
|
|
1556
|
+
if (shouldSearchRight) {
|
|
1557
|
+
if (string.charAt(wantedIndex + index) === ' ') {
|
|
1558
|
+
return wantedIndex + index;
|
|
1559
|
+
}
|
|
1560
|
+
} else if (string.charAt(wantedIndex - index) === ' ') {
|
|
1561
|
+
return wantedIndex - index;
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
return wantedIndex;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
function cliTruncate(text, columns, options) {
|
|
1569
|
+
options = {
|
|
1570
|
+
position: 'end',
|
|
1571
|
+
preferTruncationOnSpace: false,
|
|
1572
|
+
truncationCharacter: '…',
|
|
1573
|
+
...options,
|
|
1574
|
+
};
|
|
1575
|
+
|
|
1576
|
+
const {position, space, preferTruncationOnSpace} = options;
|
|
1577
|
+
let {truncationCharacter} = options;
|
|
1578
|
+
|
|
1579
|
+
if (typeof text !== 'string') {
|
|
1580
|
+
throw new TypeError(`Expected \`input\` to be a string, got ${typeof text}`);
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
if (typeof columns !== 'number') {
|
|
1584
|
+
throw new TypeError(`Expected \`columns\` to be a number, got ${typeof columns}`);
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
if (columns < 1) {
|
|
1588
|
+
return '';
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
if (columns === 1) {
|
|
1592
|
+
return truncationCharacter;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
const length = stringWidth(text);
|
|
1596
|
+
|
|
1597
|
+
if (length <= columns) {
|
|
1598
|
+
return text;
|
|
1599
|
+
}
|
|
1600
|
+
|
|
1601
|
+
if (position === 'start') {
|
|
1602
|
+
if (preferTruncationOnSpace) {
|
|
1603
|
+
const nearestSpace = getIndexOfNearestSpace(text, length - columns + 1, true);
|
|
1604
|
+
return truncationCharacter + sliceAnsi(text, nearestSpace, length).trim();
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
if (space === true) {
|
|
1608
|
+
truncationCharacter += ' ';
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
return truncationCharacter + sliceAnsi(text, length - columns + stringWidth(truncationCharacter), length);
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
if (position === 'middle') {
|
|
1615
|
+
if (space === true) {
|
|
1616
|
+
truncationCharacter = ` ${truncationCharacter} `;
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
const half = Math.floor(columns / 2);
|
|
1620
|
+
|
|
1621
|
+
if (preferTruncationOnSpace) {
|
|
1622
|
+
const spaceNearFirstBreakPoint = getIndexOfNearestSpace(text, half);
|
|
1623
|
+
const spaceNearSecondBreakPoint = getIndexOfNearestSpace(text, length - (columns - half) + 1, true);
|
|
1624
|
+
return sliceAnsi(text, 0, spaceNearFirstBreakPoint) + truncationCharacter + sliceAnsi(text, spaceNearSecondBreakPoint, length).trim();
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
return (
|
|
1628
|
+
sliceAnsi(text, 0, half)
|
|
1629
|
+
+ truncationCharacter
|
|
1630
|
+
+ sliceAnsi(text, length - (columns - half) + stringWidth(truncationCharacter), length)
|
|
1631
|
+
);
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
if (position === 'end') {
|
|
1635
|
+
if (preferTruncationOnSpace) {
|
|
1636
|
+
const nearestSpace = getIndexOfNearestSpace(text, columns - 1);
|
|
1637
|
+
return sliceAnsi(text, 0, nearestSpace) + truncationCharacter;
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
if (space === true) {
|
|
1641
|
+
truncationCharacter = ` ${truncationCharacter}`;
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
return sliceAnsi(text, 0, columns - stringWidth(truncationCharacter)) + truncationCharacter;
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${position}`);
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1650
|
+
const F_RIGHT = "\u2192";
|
|
1651
|
+
const F_DOWN = "\u2193";
|
|
1652
|
+
const F_DOWN_RIGHT = "\u21B3";
|
|
1653
|
+
const F_POINTER = "\u276F";
|
|
1654
|
+
const F_DOT = "\xB7";
|
|
1655
|
+
const F_CHECK = "\u221A";
|
|
1656
|
+
const F_CROSS = "\xD7";
|
|
1657
|
+
const F_LONG_DASH = "\u23AF";
|
|
1658
|
+
|
|
1659
|
+
async function printError(error, ctx) {
|
|
1660
|
+
let e = error;
|
|
1661
|
+
if (typeof error === "string") {
|
|
1662
|
+
e = {
|
|
1663
|
+
message: error.split(/\n/g)[0],
|
|
1664
|
+
stack: error
|
|
1665
|
+
};
|
|
1666
|
+
}
|
|
1667
|
+
const stacks = parseStacktrace(e);
|
|
1668
|
+
await interpretSourcePos(stacks, ctx);
|
|
1669
|
+
const nearest = stacks.find((stack) => ctx.server.moduleGraph.getModuleById(stack.file) && existsSync(stack.file));
|
|
1670
|
+
printErrorMessage(e, ctx.console);
|
|
1671
|
+
await printStack(ctx, stacks, nearest, async (s, pos) => {
|
|
1672
|
+
if (s === nearest && nearest) {
|
|
1673
|
+
const sourceCode = await promises.readFile(nearest.file, "utf-8");
|
|
1674
|
+
ctx.log(c.yellow(generateCodeFrame(sourceCode, 4, pos)));
|
|
1675
|
+
}
|
|
1676
|
+
});
|
|
1677
|
+
handleImportOutsideModuleError(e.stack || e.stackStr || "", ctx);
|
|
1678
|
+
if (e.showDiff)
|
|
1679
|
+
displayDiff(e.actual, e.expected, ctx.console);
|
|
1680
|
+
}
|
|
1681
|
+
const esmErrors = [
|
|
1682
|
+
"Cannot use import statement outside a module",
|
|
1683
|
+
"Unexpected token 'export'"
|
|
1684
|
+
];
|
|
1685
|
+
function handleImportOutsideModuleError(stack, ctx) {
|
|
1686
|
+
if (!esmErrors.some((e) => stack.includes(e)))
|
|
1687
|
+
return;
|
|
1688
|
+
const path = stack.split("\n")[0].trim();
|
|
1689
|
+
let name = path.split("/node_modules/").pop() || "";
|
|
1690
|
+
if (name == null ? void 0 : name.startsWith("@"))
|
|
1691
|
+
name = name.split("/").slice(0, 2).join("/");
|
|
1692
|
+
else
|
|
1693
|
+
name = name.split("/")[0];
|
|
1694
|
+
ctx.console.error(c.yellow(`Module ${path} seems to be an ES Module but shipped in a CommonJS package. You might want to create an issue to the package ${c.bold(`"${name}"`)} asking them to ship the file in .mjs extension or add "type": "module" in their package.json.
|
|
1695
|
+
|
|
1696
|
+
As a temporary workaround you can try to inline the package by updating your config:
|
|
1697
|
+
|
|
1698
|
+
` + c.gray(c.dim("// vitest.config.js")) + "\n" + c.green(`export default {
|
|
1699
|
+
test: {
|
|
1700
|
+
deps: {
|
|
1701
|
+
inline: [
|
|
1702
|
+
${c.yellow(c.bold(`"${name}"`))}
|
|
1703
|
+
]
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
`)));
|
|
1708
|
+
}
|
|
1709
|
+
function displayDiff(actual, expected, console) {
|
|
1710
|
+
console.error(c.gray(unifiedDiff(actual, expected)) + "\n");
|
|
1711
|
+
}
|
|
1712
|
+
function printErrorMessage(error, console) {
|
|
1713
|
+
const errorName = error.name || error.nameStr || "Unknown Error";
|
|
1714
|
+
console.error(c.red(`${c.bold(errorName)}: ${error.message}`));
|
|
1715
|
+
}
|
|
1716
|
+
async function printStack(ctx, stack, highlight, onStack) {
|
|
1717
|
+
if (!stack.length)
|
|
1718
|
+
return;
|
|
1719
|
+
for (const frame of stack) {
|
|
1720
|
+
const pos = frame.sourcePos || frame;
|
|
1721
|
+
const color = frame === highlight ? c.yellow : c.gray;
|
|
1722
|
+
const path = relative(ctx.config.root, frame.file);
|
|
1723
|
+
ctx.log(color(` ${c.dim(F_POINTER)} ${[frame.method, c.dim(`${path}:${pos.line}:${pos.column}`)].filter(Boolean).join(" ")}`));
|
|
1724
|
+
await (onStack == null ? void 0 : onStack(frame, pos));
|
|
1725
|
+
if (frame.file in ctx.state.filesMap)
|
|
1726
|
+
break;
|
|
1727
|
+
}
|
|
1728
|
+
ctx.log();
|
|
1729
|
+
}
|
|
1730
|
+
function generateCodeFrame(source, indent = 0, start = 0, end, range = 2) {
|
|
1731
|
+
start = posToNumber(source, start);
|
|
1732
|
+
end = end || start;
|
|
1733
|
+
const lines = source.split(lineSplitRE);
|
|
1734
|
+
let count = 0;
|
|
1735
|
+
let res = [];
|
|
1736
|
+
const columns = process.stdout.columns || 80;
|
|
1737
|
+
function lineNo(no = "") {
|
|
1738
|
+
return c.gray(`${String(no).padStart(3, " ")}| `);
|
|
1739
|
+
}
|
|
1740
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1741
|
+
count += lines[i].length + 1;
|
|
1742
|
+
if (count >= start) {
|
|
1743
|
+
for (let j = i - range; j <= i + range || end > count; j++) {
|
|
1744
|
+
if (j < 0 || j >= lines.length)
|
|
1745
|
+
continue;
|
|
1746
|
+
const lineLength = lines[j].length;
|
|
1747
|
+
if (lineLength > 200)
|
|
1748
|
+
return "";
|
|
1749
|
+
res.push(lineNo(j + 1) + cliTruncate(lines[j], columns - 5 - indent));
|
|
1750
|
+
if (j === i) {
|
|
1751
|
+
const pad = start - (count - lineLength);
|
|
1752
|
+
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
|
1753
|
+
res.push(lineNo() + " ".repeat(pad) + c.red("^".repeat(length)));
|
|
1754
|
+
} else if (j > i) {
|
|
1755
|
+
if (end > count) {
|
|
1756
|
+
const length = Math.max(1, Math.min(end - count, lineLength));
|
|
1757
|
+
res.push(lineNo() + c.red("^".repeat(length)));
|
|
1758
|
+
}
|
|
1759
|
+
count += lineLength + 1;
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
break;
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
if (indent)
|
|
1766
|
+
res = res.map((line) => " ".repeat(indent) + line);
|
|
1767
|
+
return res.join("\n");
|
|
1768
|
+
}
|
|
1769
|
+
function unifiedDiff(actual, expected) {
|
|
1770
|
+
if (actual === expected)
|
|
1771
|
+
return "";
|
|
1772
|
+
const indent = " ";
|
|
1773
|
+
const diffLimit = 15;
|
|
1774
|
+
const counts = {
|
|
1775
|
+
"+": 0,
|
|
1776
|
+
"-": 0
|
|
1777
|
+
};
|
|
1778
|
+
let previousState = null;
|
|
1779
|
+
let previousCount = 0;
|
|
1780
|
+
function preprocess(line) {
|
|
1781
|
+
if (!line || line.match(/\\ No newline/))
|
|
1782
|
+
return;
|
|
1783
|
+
const char = line[0];
|
|
1784
|
+
if ("-+".includes(char)) {
|
|
1785
|
+
if (previousState !== char) {
|
|
1786
|
+
previousState = char;
|
|
1787
|
+
previousCount = 0;
|
|
1788
|
+
}
|
|
1789
|
+
previousCount++;
|
|
1790
|
+
counts[char]++;
|
|
1791
|
+
if (previousCount === diffLimit)
|
|
1792
|
+
return c.dim(char + " ...");
|
|
1793
|
+
else if (previousCount > diffLimit)
|
|
1794
|
+
return;
|
|
1795
|
+
}
|
|
1796
|
+
return line;
|
|
1797
|
+
}
|
|
1798
|
+
const msg = createPatch("string", expected, actual);
|
|
1799
|
+
const lines = msg.split("\n").slice(5).map(preprocess).filter(Boolean);
|
|
1800
|
+
const isCompact = counts["+"] === 1 && counts["-"] === 1 && lines.length === 2;
|
|
1801
|
+
let formatted = lines.map((line) => {
|
|
1802
|
+
if (line[0] === "-") {
|
|
1803
|
+
line = formatLine(line.slice(1));
|
|
1804
|
+
if (isCompact)
|
|
1805
|
+
return c.green(line);
|
|
1806
|
+
return c.green(`- ${formatLine(line)}`);
|
|
1807
|
+
}
|
|
1808
|
+
if (line[0] === "+") {
|
|
1809
|
+
line = formatLine(line.slice(1));
|
|
1810
|
+
if (isCompact)
|
|
1811
|
+
return c.red(line);
|
|
1812
|
+
return c.red(`+ ${formatLine(line)}`);
|
|
1813
|
+
}
|
|
1814
|
+
if (line.match(/@@/))
|
|
1815
|
+
return "--";
|
|
1816
|
+
return " " + line;
|
|
1817
|
+
});
|
|
1818
|
+
if (isCompact) {
|
|
1819
|
+
formatted = [
|
|
1820
|
+
`${c.green("- Expected")} ${formatted[0]}`,
|
|
1821
|
+
`${c.red("+ Received")} ${formatted[1]}`
|
|
1822
|
+
];
|
|
1823
|
+
} else {
|
|
1824
|
+
formatted.unshift(c.green("- Expected - " + counts["-"]), c.red("+ Received + " + counts["+"]), "");
|
|
1825
|
+
}
|
|
1826
|
+
return formatted.map((i) => indent + i).join("\n");
|
|
1827
|
+
}
|
|
1828
|
+
function formatLine(line) {
|
|
1829
|
+
return cliTruncate(line, (process.stdout.columns || 80) - 4);
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1832
|
+
export { F_POINTER as F, F_DOWN as a, F_LONG_DASH as b, F_DOWN_RIGHT as c, F_DOT as d, F_CHECK as e, F_CROSS as f, F_RIGHT as g, stringWidth as h, ansiStyles as i, sliceAnsi as j, cliTruncate as k, configDefaults as l, cleanCoverage as m, reportCoverage as n, printError as p, resolveC8Options as r, stripAnsi as s, takeCoverage as t, unifiedDiff as u };
|
|
1833
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2h1bmstZGVmYXVsdHMuOGNhODRkN2IuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWZhdWx0cy50cyIsIi4uL3NyYy9pbnRlZ3JhdGlvbnMvY292ZXJhZ2UudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZGlmZkA1LjAuMC9ub2RlX21vZHVsZXMvZGlmZi9saWIvaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50QDQuMC4wL25vZGVfbW9kdWxlcy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9hbnNpLXN0eWxlc0A2LjEuMC9ub2RlX21vZHVsZXMvYW5zaS1zdHlsZXMvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vc2xpY2UtYW5zaUA1LjAuMC9ub2RlX21vZHVsZXMvc2xpY2UtYW5zaS9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9hbnNpLXJlZ2V4QDYuMC4xL25vZGVfbW9kdWxlcy9hbnNpLXJlZ2V4L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3N0cmlwLWFuc2lANy4wLjEvbm9kZV9tb2R1bGVzL3N0cmlwLWFuc2kvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZWFzdGFzaWFud2lkdGhAMC4yLjAvbm9kZV9tb2R1bGVzL2Vhc3Rhc2lhbndpZHRoL2Vhc3Rhc2lhbndpZHRoLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2Vtb2ppLXJlZ2V4QDkuMi4yL25vZGVfbW9kdWxlcy9lbW9qaS1yZWdleC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9zdHJpbmctd2lkdGhANS4xLjAvbm9kZV9tb2R1bGVzL3N0cmluZy13aWR0aC9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9jbGktdHJ1bmNhdGVAMy4xLjAvbm9kZV9tb2R1bGVzL2NsaS10cnVuY2F0ZS9pbmRleC5qcyIsIi4uL3NyYy9ub2RlL3JlcG9ydGVycy9yZW5kZXJlcnMvZmlndXJlcy50cyIsIi4uL3NyYy9ub2RlL3JlcG9ydGVycy9yZW5kZXJlcnMvZGlmZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlc29sdmVkQzhPcHRpb25zLCBVc2VyQ29uZmlnIH0gZnJvbSAnLi90eXBlcydcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbmNsdWRlID0gWycqKi8qLnt0ZXN0LHNwZWN9LntqcyxtanMsY2pzLHRzLG10cyxjdHMsanN4LHRzeH0nXVxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFeGNsdWRlID0gWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovZGlzdC8qKicsICcqKi9jeXByZXNzLyoqJywgJyoqLy57aWRlYSxnaXQsY2FjaGUsb3V0cHV0LHRlbXB9LyoqJ11cblxuY29uc3QgZGVmYXVsdENvdmVyYWdlRXhjbHVkZXMgPSBbXG4gICdjb3ZlcmFnZS8qKicsXG4gICdwYWNrYWdlcy8qL3Rlc3R7LHN9LyoqJyxcbiAgJyoqLyouZC50cycsXG4gICdjeXByZXNzLyoqJyxcbiAgJ3Rlc3R7LHN9LyoqJyxcbiAgJ3Rlc3R7LC0qfS57anMsY2pzLG1qcyx0cyx0c3gsanN4fScsXG4gICcqKi8qey4sLX10ZXN0LntqcyxjanMsbWpzLHRzLHRzeCxqc3h9JyxcbiAgJyoqL19fdGVzdHNfXy8qKicsXG4gICcqKi97a2FybWEscm9sbHVwLHdlYnBhY2ssdml0ZSx2aXRlc3QsamVzdCxhdmEsYmFiZWwsbnljfS5jb25maWcue2pzLGNqcyxtanMsdHN9JyxcbiAgJyoqLy57ZXNsaW50LG1vY2hhLHByZXR0aWVyfXJjLntqcyxjanMseW1sfScsXG5dXG5cbmNvbnN0IGNvdmVyYWdlQ29uZmlnRGVmYXVsdHMgPSB7XG4gIGVuYWJsZWQ6IGZhbHNlLFxuICBjbGVhbjogdHJ1ZSxcbiAgY2xlYW5PblJlcnVuOiBmYWxzZSxcbiAgcmVwb3J0c0RpcmVjdG9yeTogJy4vY292ZXJhZ2UnLFxuICBleGNsdWRlTm9kZU1vZHVsZXM6IHRydWUsXG4gIGV4Y2x1ZGU6IGRlZmF1bHRDb3ZlcmFnZUV4Y2x1ZGVzLFxuICByZXBvcnRlcjogWyd0ZXh0JywgJ2h0bWwnXSxcbiAgYWxsb3dFeHRlcm5hbDogZmFsc2UsXG4gIC8vIGRlZmF1bHQgZXh0ZW5zaW9ucyB1c2VkIGJ5IGM4LCBwbHVzICcudnVlJyBhbmQgJy5zdmVsdGUnXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaXN0YW5idWxqcy9zY2hlbWEvYmxvYi9tYXN0ZXIvZGVmYXVsdC1leHRlbnNpb24uanNcbiAgZXh0ZW5zaW9uOiBbJy5qcycsICcuY2pzJywgJy5tanMnLCAnLnRzJywgJy50c3gnLCAnLmpzeCcsICcudnVlJywgJy5zdmVsdGUnXSxcbn0gYXMgUmVzb2x2ZWRDOE9wdGlvbnNcblxuZXhwb3J0IGNvbnN0IGNvbmZpZ0RlZmF1bHRzOiBVc2VyQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGFsbG93T25seTogIXByb2Nlc3MuZW52LkNJLFxuICB3YXRjaDogIXByb2Nlc3MuZW52LkNJLFxuICBnbG9iYWxzOiBmYWxzZSxcbiAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgdGhyZWFkczogdHJ1ZSxcbiAgY2xlYXJNb2NrczogZmFsc2UsXG4gIHJlc3RvcmVNb2NrczogZmFsc2UsXG4gIG1vY2tSZXNldDogZmFsc2UsXG4gIGluY2x1ZGU6IGRlZmF1bHRJbmNsdWRlLFxuICBleGNsdWRlOiBkZWZhdWx0RXhjbHVkZSxcbiAgdGVzdFRpbWVvdXQ6IDUwMDAsXG4gIGhvb2tUaW1lb3V0OiAxMDAwMCxcbiAgaXNvbGF0ZTogdHJ1ZSxcbiAgd2F0Y2hJZ25vcmU6IFsvXFwvbm9kZV9tb2R1bGVzXFwvLywgL1xcL2Rpc3RcXC8vXSxcbiAgdXBkYXRlOiBmYWxzZSxcbiAgcmVwb3J0ZXJzOiBbXSxcbiAgc2lsZW50OiBmYWxzZSxcbiAgYXBpOiBmYWxzZSxcbiAgdWk6IGZhbHNlLFxuICB1aUJhc2U6ICcvX192aXRlc3RfXy8nLFxuICBvcGVuOiB0cnVlLFxuICBjb3ZlcmFnZTogY292ZXJhZ2VDb25maWdEZWZhdWx0cyxcbn0pXG4iLCJpbXBvcnQgeyBleGlzdHNTeW5jLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSdcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICd1cmwnXG5pbXBvcnQgdHlwZSB7IFByb2ZpbGVyIH0gZnJvbSAnaW5zcGVjdG9yJ1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGhlJ1xuaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICd2aXRlLW5vZGUnXG5pbXBvcnQgdHlwZSB7IFZpdGVzdCB9IGZyb20gJy4uL25vZGUnXG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgdHlwZSB7IEM4T3B0aW9ucywgUmVzb2x2ZWRDOE9wdGlvbnMgfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCB7IGNvbmZpZ0RlZmF1bHRzIH0gZnJvbSAnLi4vZGVmYXVsdHMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQzhPcHRpb25zKG9wdGlvbnM6IEM4T3B0aW9ucywgcm9vdDogc3RyaW5nKTogUmVzb2x2ZWRDOE9wdGlvbnMge1xuICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRDOE9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnRGVmYXVsdHMuY292ZXJhZ2UsXG4gICAgLi4ub3B0aW9ucyBhcyBhbnksXG4gIH1cblxuICByZXNvbHZlZC5yZXBvcnRlciA9IHRvQXJyYXkocmVzb2x2ZWQucmVwb3J0ZXIpXG4gIHJlc29sdmVkLnJlcG9ydHNEaXJlY3RvcnkgPSByZXNvbHZlKHJvb3QsIHJlc29sdmVkLnJlcG9ydHNEaXJlY3RvcnkpXG4gIHJlc29sdmVkLnRlbXBEaXJlY3RvcnkgPSBwcm9jZXNzLmVudi5OT0RFX1Y4X0NPVkVSQUdFIHx8IHJlc29sdmUocmVzb2x2ZWQucmVwb3J0c0RpcmVjdG9yeSwgJ3RtcCcpXG5cbiAgcmV0dXJuIHJlc29sdmVkIGFzIFJlc29sdmVkQzhPcHRpb25zXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbkNvdmVyYWdlKG9wdGlvbnM6IFJlc29sdmVkQzhPcHRpb25zLCBjbGVhbiA9IHRydWUpIHtcbiAgaWYgKGNsZWFuICYmIGV4aXN0c1N5bmMob3B0aW9ucy5yZXBvcnRzRGlyZWN0b3J5KSlcbiAgICBhd2FpdCBmcy5ybShvcHRpb25zLnJlcG9ydHNEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuXG4gIGlmICghZXhpc3RzU3luYyhvcHRpb25zLnRlbXBEaXJlY3RvcnkpKVxuICAgIGF3YWl0IGZzLm1rZGlyKG9wdGlvbnMudGVtcERpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuXG4vLyBGbHVzaCBjb3ZlcmFnZSB0byBkaXNrXG5leHBvcnQgZnVuY3Rpb24gdGFrZUNvdmVyYWdlKCkge1xuICBjb25zdCB2OCA9IHJlcXVpcmUoJ3Y4JylcbiAgaWYgKHY4LnRha2VDb3ZlcmFnZSA9PSBudWxsKVxuICAgIGNvbnNvbGUud2FybignW1ZpdGVzdF0gdGFrZUNvdmVyYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBOb2RlSnMgdmVyc2lvbi5cXG5Db3ZlcmFnZSBjb3VsZCBiZSBpbmNvbXBsZXRlLiBVcGRhdGUgdG8gTm9kZUpzIDE0LjE4LicpXG4gIGVsc2VcbiAgICB2OC50YWtlQ292ZXJhZ2UoKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwb3J0Q292ZXJhZ2UoY3R4OiBWaXRlc3QpIHtcbiAgdGFrZUNvdmVyYWdlKClcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICBjb25zdCBjcmVhdGVSZXBvcnQgPSByZXF1aXJlKCdjOC9saWIvcmVwb3J0JylcbiAgY29uc3QgcmVwb3J0ID0gY3JlYXRlUmVwb3J0KGN0eC5jb25maWcuY292ZXJhZ2UpXG5cbiAgLy8gYWRkIHNvdXJjZSBtYXBzXG4gIGNvbnN0IHNvdXJjZU1hcE1ldGE6IFJlY29yZDxzdHJpbmcsIHsgbWFwOiBSYXdTb3VyY2VNYXA7IHNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0+ID0ge31cbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXlcbiAgICAuZnJvbShjdHgudml0ZW5vZGUuZmV0Y2hDYWNoZS5lbnRyaWVzKCkpXG4gICAgLmZpbHRlcihpID0+ICFpWzBdLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpKVxuICAgIC5tYXAoYXN5bmMoW2ZpbGUsIHsgcmVzdWx0IH1dKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSByZXN1bHQubWFwXG4gICAgICBpZiAoIW1hcClcbiAgICAgICAgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHVybCA9IHBhdGhUb0ZpbGVVUkwoZmlsZSkuaHJlZlxuXG4gICAgICBsZXQgY29kZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICB0cnkge1xuICAgICAgICBjb2RlID0gKGF3YWl0IGZzLnJlYWRGaWxlKGZpbGUpKS50b1N0cmluZygpXG4gICAgICB9XG4gICAgICBjYXRjaCB7fVxuXG4gICAgICAvLyBWaXRlIGRvZXMgbm90IHJlcG9ydCBmdWxsIHBhdGggaW4gc291cmNlbWFwIHNvdXJjZXNcbiAgICAgIC8vIHNvIHVzZSBhbiBhY3R1YWwgZmlsZSBwYXRoXG4gICAgICBjb25zdCBzb3VyY2VzID0gW3VybF1cblxuICAgICAgc291cmNlTWFwTWV0YVt1cmxdID0ge1xuICAgICAgICBzb3VyY2U6IHJlc3VsdC5jb2RlLFxuICAgICAgICBtYXA6IHtcbiAgICAgICAgICBzb3VyY2VzQ29udGVudDogY29kZSA/IFtjb2RlXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi5tYXAsXG4gICAgICAgICAgc291cmNlcyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9KSlcblxuICAvLyBUaGlzIGlzIGEgbWFnaWMgbnVtYmVyLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgYW1vdW50IG9mIGNvZGVcbiAgLy8gdGhhdCB3ZSBhZGQgaW4gcGFja2FnZXMvdml0ZS1ub2RlL3NyYy9jbGllbnQudHM6MTE0ICh2bS5ydW5JblRoaXNDb250ZXh0KVxuICAvLyBUT0RPOiBJbmNsdWRlIG91ciB0cmFuc2Zvcm1hdGlvbnMgaW4gc291Y2VtYXBzXG4gIGNvbnN0IG9mZnNldCA9IDE5MFxuXG4gIHJlcG9ydC5fZ2V0U291cmNlTWFwID0gKGNvdmVyYWdlOiBQcm9maWxlci5TY3JpcHRDb3ZlcmFnZSkgPT4ge1xuICAgIGNvbnN0IHBhdGggPSBwYXRoVG9GaWxlVVJMKGNvdmVyYWdlLnVybCkuaHJlZlxuICAgIGNvbnN0IGRhdGEgPSBzb3VyY2VNYXBNZXRhW3BhdGhdXG5cbiAgICBpZiAoIWRhdGEpXG4gICAgICByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2VNYXA6IHtcbiAgICAgICAgc291cmNlbWFwOiBkYXRhLm1hcCxcbiAgICAgIH0sXG4gICAgICBzb3VyY2U6IEFycmF5KG9mZnNldCkuZmlsbCgnLicpLmpvaW4oJycpICsgZGF0YS5zb3VyY2UsXG4gICAgfVxuICB9XG5cbiAgYXdhaXQgcmVwb3J0LnJ1bigpXG5cbiAgaWYgKGN0eC5jb25maWcuY292ZXJhZ2UuZW5hYmxlZCkge1xuICAgIGlmIChjdHguY29uZmlnLmNvdmVyYWdlWycxMDAnXSkge1xuICAgICAgY3R4LmNvbmZpZy5jb3ZlcmFnZS5saW5lcyA9IDEwMFxuICAgICAgY3R4LmNvbmZpZy5jb3ZlcmFnZS5mdW5jdGlvbnMgPSAxMDBcbiAgICAgIGN0eC5jb25maWcuY292ZXJhZ2UuYnJhbmNoZXMgPSAxMDBcbiAgICAgIGN0eC5jb25maWcuY292ZXJhZ2Uuc3RhdGVtZW50cyA9IDEwMFxuICAgIH1cblxuICAgIGNvbnN0IHsgY2hlY2tDb3ZlcmFnZXMgfSA9IHJlcXVpcmUoJ2M4L2xpYi9jb21tYW5kcy9jaGVjay1jb3ZlcmFnZScpXG4gICAgYXdhaXQgY2hlY2tDb3ZlcmFnZXMoY3R4LmNvbmZpZy5jb3ZlcmFnZSwgcmVwb3J0KVxuICB9XG59XG4iLCJmdW5jdGlvbiBEaWZmKCkge31cbkRpZmYucHJvdG90eXBlID0ge1xuICBkaWZmOiBmdW5jdGlvbiBkaWZmKG9sZFN0cmluZywgbmV3U3RyaW5nKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIGRvbmUodmFsdWUpIHtcbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIHZhbHVlKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBtYXNzYWdlIHRoZSBpbnB1dCBwcmlvciB0byBydW5uaW5nXG5cblxuICAgIG9sZFN0cmluZyA9IHRoaXMuY2FzdElucHV0KG9sZFN0cmluZyk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5jYXN0SW5wdXQobmV3U3RyaW5nKTtcbiAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuICAgIHZhciBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoO1xuICAgIHZhciBlZGl0TGVuZ3RoID0gMTtcbiAgICB2YXIgbWF4RWRpdExlbmd0aCA9IG5ld0xlbiArIG9sZExlbjtcbiAgICB2YXIgYmVzdFBhdGggPSBbe1xuICAgICAgbmV3UG9zOiAtMSxcbiAgICAgIGNvbXBvbmVudHM6IFtdXG4gICAgfV07IC8vIFNlZWQgZWRpdExlbmd0aCA9IDAsIGkuZS4gdGhlIGNvbnRlbnQgc3RhcnRzIHdpdGggdGhlIHNhbWUgdmFsdWVzXG5cbiAgICB2YXIgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG5cbiAgICBpZiAoYmVzdFBhdGhbMF0ubmV3UG9zICsgMSA+PSBuZXdMZW4gJiYgb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgcmV0dXJuIGRvbmUoW3tcbiAgICAgICAgdmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLFxuICAgICAgICBjb3VudDogbmV3U3RyaW5nLmxlbmd0aFxuICAgICAgfV0pO1xuICAgIH0gLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuXG5cbiAgICBmdW5jdGlvbiBleGVjRWRpdExlbmd0aCgpIHtcbiAgICAgIGZvciAodmFyIGRpYWdvbmFsUGF0aCA9IC0xICogZWRpdExlbmd0aDsgZGlhZ29uYWxQYXRoIDw9IGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCArPSAyKSB7XG4gICAgICAgIHZhciBiYXNlUGF0aCA9IHZvaWQgMDtcblxuICAgICAgICB2YXIgYWRkUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLFxuICAgICAgICAgICAgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCArIDFdLFxuICAgICAgICAgICAgX29sZFBvcyA9IChyZW1vdmVQYXRoID8gcmVtb3ZlUGF0aC5uZXdQb3MgOiAwKSAtIGRpYWdvbmFsUGF0aDtcblxuICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgIC8vIE5vIG9uZSBlbHNlIGlzIGdvaW5nIHRvIGF0dGVtcHQgdG8gdXNlIHRoaXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2FuQWRkID0gYWRkUGF0aCAmJiBhZGRQYXRoLm5ld1BvcyArIDEgPCBuZXdMZW4sXG4gICAgICAgICAgICBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIDAgPD0gX29sZFBvcyAmJiBfb2xkUG9zIDwgb2xkTGVuO1xuXG4gICAgICAgIGlmICghY2FuQWRkICYmICFjYW5SZW1vdmUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHBhdGggaXMgYSB0ZXJtaW5hbCB0aGVuIHBydW5lXG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuXG5cbiAgICAgICAgaWYgKCFjYW5BZGQgfHwgY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IGNsb25lUGF0aChyZW1vdmVQYXRoKTtcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYXNlUGF0aCA9IGFkZFBhdGg7IC8vIE5vIG5lZWQgdG8gY2xvbmUsIHdlJ3ZlIHB1bGxlZCBpdCBmcm9tIHRoZSBsaXN0XG5cbiAgICAgICAgICBiYXNlUGF0aC5uZXdQb3MrKztcbiAgICAgICAgICBzZWxmLnB1c2hDb21wb25lbnQoYmFzZVBhdGguY29tcG9uZW50cywgdHJ1ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9vbGRQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpOyAvLyBJZiB3ZSBoYXZlIGhpdCB0aGUgZW5kIG9mIGJvdGggc3RyaW5ncywgdGhlbiB3ZSBhcmUgZG9uZVxuXG4gICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBfb2xkUG9zICsgMSA+PSBvbGRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gZG9uZShidWlsZFZhbHVlcyhzZWxmLCBiYXNlUGF0aC5jb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgc2VsZi51c2VMb25nZXN0VG9rZW4pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgdHJhY2sgdGhpcyBwYXRoIGFzIGEgcG90ZW50aWFsIGNhbmRpZGF0ZSBhbmQgY29udGludWUuXG4gICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVkaXRMZW5ndGgrKztcbiAgICB9IC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLlxuXG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIChmdW5jdGlvbiBleGVjKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgd2Ugd2FudCB0byBiZSBzYWZlLlxuXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBpZiAoZWRpdExlbmd0aCA+IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZXhlY0VkaXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZXhlYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoZWRpdExlbmd0aCA8PSBtYXhFZGl0TGVuZ3RoKSB7XG4gICAgICAgIHZhciByZXQgPSBleGVjRWRpdExlbmd0aCgpO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwdXNoQ29tcG9uZW50OiBmdW5jdGlvbiBwdXNoQ29tcG9uZW50KGNvbXBvbmVudHMsIGFkZGVkLCByZW1vdmVkKSB7XG4gICAgdmFyIGxhc3QgPSBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG4gICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7XG4gICAgICAgIGNvdW50OiBsYXN0LmNvdW50ICsgMSxcbiAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICByZW1vdmVkOiByZW1vdmVkXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb25lbnRzLnB1c2goe1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgYWRkZWQ6IGFkZGVkLFxuICAgICAgICByZW1vdmVkOiByZW1vdmVkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGV4dHJhY3RDb21tb246IGZ1bmN0aW9uIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpIHtcbiAgICB2YXIgbmV3TGVuID0gbmV3U3RyaW5nLmxlbmd0aCxcbiAgICAgICAgb2xkTGVuID0gb2xkU3RyaW5nLmxlbmd0aCxcbiAgICAgICAgbmV3UG9zID0gYmFzZVBhdGgubmV3UG9zLFxuICAgICAgICBvbGRQb3MgPSBuZXdQb3MgLSBkaWFnb25hbFBhdGgsXG4gICAgICAgIGNvbW1vbkNvdW50ID0gMDtcblxuICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMobmV3U3RyaW5nW25ld1BvcyArIDFdLCBvbGRTdHJpbmdbb2xkUG9zICsgMV0pKSB7XG4gICAgICBuZXdQb3MrKztcbiAgICAgIG9sZFBvcysrO1xuICAgICAgY29tbW9uQ291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY29tbW9uQ291bnQpIHtcbiAgICAgIGJhc2VQYXRoLmNvbXBvbmVudHMucHVzaCh7XG4gICAgICAgIGNvdW50OiBjb21tb25Db3VudFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYmFzZVBhdGgubmV3UG9zID0gbmV3UG9zO1xuICAgIHJldHVybiBvbGRQb3M7XG4gIH0sXG4gIGVxdWFsczogZnVuY3Rpb24gZXF1YWxzKGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlRW1wdHk6IGZ1bmN0aW9uIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgdmFyIHJldCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgIHJldC5wdXNoKGFycmF5W2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuICBjYXN0SW5wdXQ6IGZ1bmN0aW9uIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemU6IGZ1bmN0aW9uIHRva2VuaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcnKTtcbiAgfSxcbiAgam9pbjogZnVuY3Rpb24gam9pbihjaGFycykge1xuICAgIHJldHVybiBjaGFycy5qb2luKCcnKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gYnVpbGRWYWx1ZXMoZGlmZiwgY29tcG9uZW50cywgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIHVzZUxvbmdlc3RUb2tlbikge1xuICB2YXIgY29tcG9uZW50UG9zID0gMCxcbiAgICAgIGNvbXBvbmVudExlbiA9IGNvbXBvbmVudHMubGVuZ3RoLFxuICAgICAgbmV3UG9zID0gMCxcbiAgICAgIG9sZFBvcyA9IDA7XG5cbiAgZm9yICg7IGNvbXBvbmVudFBvcyA8IGNvbXBvbmVudExlbjsgY29tcG9uZW50UG9zKyspIHtcbiAgICB2YXIgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRQb3NdO1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFN0cmluZ1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICByZXR1cm4gb2xkVmFsdWUubGVuZ3RoID4gdmFsdWUubGVuZ3RoID8gb2xkVmFsdWUgOiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbih2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4obmV3U3RyaW5nLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KSk7XG4gICAgICB9XG5cbiAgICAgIG5ld1BvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIENvbW1vbiBjYXNlXG5cbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7IC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG5cbiAgICAgIGlmIChjb21wb25lbnRQb3MgJiYgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXS5hZGRlZCkge1xuICAgICAgICB2YXIgdG1wID0gY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3MgLSAxXSA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zXTtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRQb3NdID0gdG1wO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG5cblxuICB2YXIgbGFzdENvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcG9uZW50TGVuIC0gMV07XG5cbiAgaWYgKGNvbXBvbmVudExlbiA+IDEgJiYgdHlwZW9mIGxhc3RDb21wb25lbnQudmFsdWUgPT09ICdzdHJpbmcnICYmIChsYXN0Q29tcG9uZW50LmFkZGVkIHx8IGxhc3RDb21wb25lbnQucmVtb3ZlZCkgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHtcbiAgICBuZXdQb3M6IHBhdGgubmV3UG9zLFxuICAgIGNvbXBvbmVudHM6IHBhdGguY29tcG9uZW50cy5zbGljZSgwKVxuICB9O1xufVxuXG52YXIgY2hhcmFjdGVyRGlmZiA9IG5ldyBEaWZmKCk7XG5mdW5jdGlvbiBkaWZmQ2hhcnMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNoYXJhY3RlckRpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlT3B0aW9ucyhvcHRpb25zLCBkZWZhdWx0cykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZWZhdWx0cy5jYWxsYmFjayA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAob3B0aW9ucykge1xuICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGRlZmF1bHRzW25hbWVdID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdHM7XG59XG5cbi8vXG4vLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG4vLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG4vLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbi8vICAtIFUrMDBGNyAgw7cgRGl2aXNpb24gc2lnblxuLy8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcbi8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4vLyBJUEEgRXh0ZW5zaW9ucywgMDI1MOKAkzAyQUZcbi8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcbi8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuLy8gIC0gVSswMkQ4ICDLmCAmIzcyODsgIEJyZXZlXG4vLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuLy8gIC0gVSswMkRCICDLmyAmIzczMTsgIE9nb25la1xuLy8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMOKAkzFFRkZcblxudmFyIGV4dGVuZGVkV29yZENoYXJzID0gL15bQS1aYS16XFx4QzAtXFx1MDJDNlxcdTAyQzgtXFx1MDJEN1xcdTAyREUtXFx1MDJGRlxcdTFFMDAtXFx1MUVGRl0rJC87XG52YXIgcmVXaGl0ZXNwYWNlID0gL1xcUy87XG52YXIgd29yZERpZmYgPSBuZXcgRGlmZigpO1xuXG53b3JkRGlmZi5lcXVhbHMgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcbiAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICByZXR1cm4gbGVmdCA9PT0gcmlnaHQgfHwgdGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KGxlZnQpICYmICFyZVdoaXRlc3BhY2UudGVzdChyaWdodCk7XG59O1xuXG53b3JkRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAvLyBBbGwgd2hpdGVzcGFjZSBzeW1ib2xzIGV4Y2VwdCBuZXdsaW5lIGdyb3VwIGludG8gb25lIHRva2VuLCBlYWNoIG5ld2xpbmUgLSBpbiBzZXBhcmF0ZSB0b2tlblxuICB2YXIgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhbXlxcU1xcclxcbl0rfFsoKVtcXF17fSdcIlxcclxcbl18XFxiKS8pOyAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIG5leHQgZmllbGQgYW5kIHdlIGhhdmUgb25seSB3b3JkIGNoYXJzIGJlZm9yZSBhbmQgYWZ0ZXIsIG1lcmdlXG4gICAgaWYgKCF0b2tlbnNbaSArIDFdICYmIHRva2Vuc1tpICsgMl0gJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pICYmIGV4dGVuZGVkV29yZENoYXJzLnRlc3QodG9rZW5zW2kgKyAyXSkpIHtcbiAgICAgIHRva2Vuc1tpXSArPSB0b2tlbnNbaSArIDJdO1xuICAgICAgdG9rZW5zLnNwbGljZShpICsgMSwgMik7XG4gICAgICBpLS07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtcbiAgICBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiBkaWZmV29yZHNXaXRoU3BhY2Uob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHdvcmREaWZmLmRpZmYob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpO1xufVxuXG52YXIgbGluZURpZmYgPSBuZXcgRGlmZigpO1xuXG5saW5lRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7IC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfSAvLyBNZXJnZSB0aGUgY29udGVudCBhbmQgbGluZSBzZXBhcmF0b3JzIGludG8gc2luZ2xlIHRva2Vuc1xuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuXG4gICAgaWYgKGkgJSAyICYmICF0aGlzLm9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICBsaW5lID0gbGluZS50cmltKCk7XG4gICAgICB9XG5cbiAgICAgIHJldExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldExpbmVzO1xufTtcblxuZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgdmFyIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtcbiAgICBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlXG4gIH0pO1xuICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5cbnZhciBzZW50ZW5jZURpZmYgPSBuZXcgRGlmZigpO1xuXG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNwbGl0KC8oXFxTLis/Wy4hP10pKD89XFxzK3wkKS8pO1xufTtcblxuZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG5cbnZhciBjc3NEaWZmID0gbmV3IERpZmYoKTtcblxuY3NzRGlmZi50b2tlbml6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5mdW5jdGlvbiBkaWZmQ3NzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykge1xuICByZXR1cm4gY3NzRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbnZhciBqc29uRGlmZiA9IG5ldyBEaWZmKCk7IC8vIERpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR3byBsaW5lcyBvZiBwcmV0dHktcHJpbnRlZCwgc2VyaWFsaXplZCBKU09OIHdoZXJlIG9uZSBvZiB0aGVtIGhhcyBhXG4vLyBkYW5nbGluZyBjb21tYSBhbmQgdGhlIG90aGVyIGRvZXNuJ3QuIFR1cm5zIG91dCBpbmNsdWRpbmcgdGhlIGRhbmdsaW5nIGNvbW1hIHlpZWxkcyB0aGUgbmljZXN0IG91dHB1dDpcblxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcbmpzb25EaWZmLnRva2VuaXplID0gbGluZURpZmYudG9rZW5pemU7XG5cbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgIHVuZGVmaW5lZFJlcGxhY2VtZW50ID0gX3RoaXMkb3B0aW9ucy51bmRlZmluZWRSZXBsYWNlbWVudCxcbiAgICAgIF90aGlzJG9wdGlvbnMkc3RyaW5naSA9IF90aGlzJG9wdGlvbnMuc3RyaW5naWZ5UmVwbGFjZXIsXG4gICAgICBzdHJpbmdpZnlSZXBsYWNlciA9IF90aGlzJG9wdGlvbnMkc3RyaW5naSA9PT0gdm9pZCAwID8gZnVuY3Rpb24gKGssIHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2O1xuICB9IDogX3RoaXMkb3B0aW9ucyRzdHJpbmdpO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5cbmpzb25EaWZmLmVxdWFscyA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmZ1bmN0aW9uIGRpZmZKc29uKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKSB7XG4gIHJldHVybiBqc29uRGlmZi5kaWZmKG9sZE9iaiwgbmV3T2JqLCBvcHRpb25zKTtcbn0gLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5cbmZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShvYmosIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KSB7XG4gIHN0YWNrID0gc3RhY2sgfHwgW107XG4gIHJlcGxhY2VtZW50U3RhY2sgPSByZXBsYWNlbWVudFN0YWNrIHx8IFtdO1xuXG4gIGlmIChyZXBsYWNlcikge1xuICAgIG9iaiA9IHJlcGxhY2VyKGtleSwgb2JqKTtcbiAgfVxuXG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChzdGFja1tpXSA9PT0gb2JqKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZW1lbnRTdGFja1tpXTtcbiAgICB9XG4gIH1cblxuICB2YXIgY2Fub25pY2FsaXplZE9iajtcblxuICBpZiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gb2JqZWN0UHJvdG90eXBlVG9TdHJpbmcuY2FsbChvYmopKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wdXNoKGNhbm9uaWNhbGl6ZWRPYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICAgIHJldHVybiBjYW5vbmljYWxpemVkT2JqO1xuICB9XG5cbiAgaWYgKG9iaiAmJiBvYmoudG9KU09OKSB7XG4gICAgb2JqID0gb2JqLnRvSlNPTigpO1xuICB9XG5cbiAgaWYgKF90eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XG4gICAgc3RhY2sucHVzaChvYmopO1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSB7fTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG5cbiAgICB2YXIgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBfa2V5O1xuXG4gICAgZm9yIChfa2V5IGluIG9iaikge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoX2tleSkpIHtcbiAgICAgICAgc29ydGVkS2V5cy5wdXNoKF9rZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRlZEtleXMuc29ydCgpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvcnRlZEtleXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIF9rZXkgPSBzb3J0ZWRLZXlzW2ldO1xuICAgICAgY2Fub25pY2FsaXplZE9ialtfa2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpbX2tleV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwgX2tleSk7XG4gICAgfVxuXG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgfSBlbHNlIHtcbiAgICBjYW5vbmljYWxpemVkT2JqID0gb2JqO1xuICB9XG5cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG5cbnZhciBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuXG5hcnJheURpZmYudG9rZW5pemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuXG5hcnJheURpZmYuam9pbiA9IGFycmF5RGlmZi5yZW1vdmVFbXB0eSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBkaWZmQXJyYXlzKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjaykge1xuICByZXR1cm4gYXJyYXlEaWZmLmRpZmYob2xkQXJyLCBuZXdBcnIsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgdmFyIGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICB2YXIgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpOyAvLyBQYXJzZSBkaWZmIG1ldGFkYXRhXG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICB2YXIgbGluZSA9IGRpZmZzdHJbaV07IC8vIEZpbGUgaGVhZGVyIGZvdW5kLCBlbmQgcGFyc2luZyBkaWZmIG1ldGFkYXRhXG5cbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gRGlmZiBpbmRleFxuXG5cbiAgICAgIHZhciBoZWFkZXIgPSAvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8uZXhlYyhsaW5lKTtcblxuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBpbmRleC5pbmRleCA9IGhlYWRlclsxXTtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH0gLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcblxuXG4gICAgcGFyc2VGaWxlSGVhZGVyKGluZGV4KTtcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpOyAvLyBQYXJzZSBodW5rc1xuXG4gICAgaW5kZXguaHVua3MgPSBbXTtcblxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIHZhciBfbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChfbGluZSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKC9eQEAvLnRlc3QoX2xpbmUpKSB7XG4gICAgICAgIGluZGV4Lmh1bmtzLnB1c2gocGFyc2VIdW5rKCkpO1xuICAgICAgfSBlbHNlIGlmIChfbGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KF9saW5lKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFBhcnNlcyB0aGUgLS0tIGFuZCArKysgaGVhZGVycywgaWYgbm9uZSBhcmUgZm91bmQsIG5vIGxpbmVzXG4gIC8vIGFyZSBjb25zdW1lZC5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIHZhciBmaWxlSGVhZGVyID0gL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvLmV4ZWMoZGlmZnN0cltpXSk7XG5cbiAgICBpZiAoZmlsZUhlYWRlcikge1xuICAgICAgdmFyIGtleVByZWZpeCA9IGZpbGVIZWFkZXJbMV0gPT09ICctLS0nID8gJ29sZCcgOiAnbmV3JztcbiAgICAgIHZhciBkYXRhID0gZmlsZUhlYWRlclsyXS5zcGxpdCgnXFx0JywgMik7XG4gICAgICB2YXIgZmlsZU5hbWUgPSBkYXRhWzBdLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJyk7XG5cbiAgICAgIGlmICgvXlwiLipcIiQvLnRlc3QoZmlsZU5hbWUpKSB7XG4gICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyKDEsIGZpbGVOYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgfVxuXG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH0gLy8gUGFyc2VzIGEgaHVua1xuICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgYXQgdGhlIHN0YXJ0IG9mIGEgaHVuay5cblxuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICB2YXIgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG4gICAgdmFyIGh1bmsgPSB7XG4gICAgICBvbGRTdGFydDogK2NodW5rSGVhZGVyWzFdLFxuICAgICAgb2xkTGluZXM6IHR5cGVvZiBjaHVua0hlYWRlclsyXSA9PT0gJ3VuZGVmaW5lZCcgPyAxIDogK2NodW5rSGVhZGVyWzJdLFxuICAgICAgbmV3U3RhcnQ6ICtjaHVua0hlYWRlclszXSxcbiAgICAgIG5ld0xpbmVzOiB0eXBlb2YgY2h1bmtIZWFkZXJbNF0gPT09ICd1bmRlZmluZWQnID8gMSA6ICtjaHVua0hlYWRlcls0XSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGxpbmVkZWxpbWl0ZXJzOiBbXVxuICAgIH07IC8vIFVuaWZpZWQgRGlmZiBGb3JtYXQgcXVpcms6IElmIHRoZSBjaHVuayBzaXplIGlzIDAsXG4gICAgLy8gdGhlIGZpcnN0IG51bWJlciBpcyBvbmUgbG93ZXIgdGhhbiBvbmUgd291bGQgZXhwZWN0LlxuICAgIC8vIGh0dHBzOi8vd3d3LmFydGltYS5jb20vd2VibG9ncy92aWV3cG9zdC5qc3A/dGhyZWFkPTE2NDI5M1xuXG4gICAgaWYgKGh1bmsub2xkTGluZXMgPT09IDApIHtcbiAgICAgIGh1bmsub2xkU3RhcnQgKz0gMTtcbiAgICB9XG5cbiAgICBpZiAoaHVuay5uZXdMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5uZXdTdGFydCArPSAxO1xuICAgIH1cblxuICAgIHZhciBhZGRDb3VudCA9IDAsXG4gICAgICAgIHJlbW92ZUNvdW50ID0gMDtcblxuICAgIGZvciAoOyBpIDwgZGlmZnN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCAnLS0tJyBjb3VsZCBiZSBtaXN0YWtlbiBmb3IgdGhlIFwicmVtb3ZlIGxpbmVcIiBvcGVyYXRpb25cbiAgICAgIC8vIEJ1dCB0aGV5IGNvdWxkIGJlIHRoZSBoZWFkZXIgZm9yIHRoZSBuZXh0IGZpbGUuIFRoZXJlZm9yZSBwcnVuZSBzdWNoIGNhc2VzIG91dC5cbiAgICAgIGlmIChkaWZmc3RyW2ldLmluZGV4T2YoJy0tLSAnKSA9PT0gMCAmJiBpICsgMiA8IGRpZmZzdHIubGVuZ3RoICYmIGRpZmZzdHJbaSArIDFdLmluZGV4T2YoJysrKyAnKSA9PT0gMCAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3BlcmF0aW9uID0gZGlmZnN0cltpXS5sZW5ndGggPT0gMCAmJiBpICE9IGRpZmZzdHIubGVuZ3RoIC0gMSA/ICcgJyA6IGRpZmZzdHJbaV1bMF07XG5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICcrJyB8fCBvcGVyYXRpb24gPT09ICctJyB8fCBvcGVyYXRpb24gPT09ICcgJyB8fCBvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBodW5rLmxpbmVzLnB1c2goZGlmZnN0cltpXSk7XG4gICAgICAgIGh1bmsubGluZWRlbGltaXRlcnMucHVzaChkZWxpbWl0ZXJzW2ldIHx8ICdcXG4nKTtcblxuICAgICAgICBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICcgJykge1xuICAgICAgICAgIGFkZENvdW50Kys7XG4gICAgICAgICAgcmVtb3ZlQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSAvLyBIYW5kbGUgdGhlIGVtcHR5IGJsb2NrIGNvdW50IGNhc2VcblxuXG4gICAgaWYgKCFhZGRDb3VudCAmJiBodW5rLm5ld0xpbmVzID09PSAxKSB7XG4gICAgICBodW5rLm5ld0xpbmVzID0gMDtcbiAgICB9XG5cbiAgICBpZiAoIXJlbW92ZUNvdW50ICYmIGh1bmsub2xkTGluZXMgPT09IDEpIHtcbiAgICAgIGh1bmsub2xkTGluZXMgPSAwO1xuICAgIH0gLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcblxuXG4gICAgaWYgKG9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICBpZiAoYWRkQ291bnQgIT09IGh1bmsubmV3TGluZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGRlZCBsaW5lIGNvdW50IGRpZCBub3QgbWF0Y2ggZm9yIGh1bmsgYXQgbGluZSAnICsgKGNodW5rSGVhZGVySW5kZXggKyAxKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBodW5rO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgIHBhcnNlSW5kZXgoKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufVxuXG4vLyBJdGVyYXRvciB0aGF0IHRyYXZlcnNlcyBpbiB0aGUgcmFuZ2Ugb2YgW21pbiwgbWF4XSwgc3RlcHBpbmdcbi8vIGJ5IGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdGFydCBwb3NpdGlvbi4gSS5lLiBmb3IgWzAsIDRdLCB3aXRoXG4vLyBzdGFydCBvZiAyLCB0aGlzIHdpbGwgaXRlcmF0ZSAyLCAzLCAxLCA0LCAwLlxuZnVuY3Rpb24gZGlzdGFuY2VJdGVyYXRvciAoc3RhcnQsIG1pbkxpbmUsIG1heExpbmUpIHtcbiAgdmFyIHdhbnRGb3J3YXJkID0gdHJ1ZSxcbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBmb3J3YXJkRXhoYXVzdGVkID0gZmFsc2UsXG4gICAgICBsb2NhbE9mZnNldCA9IDE7XG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH0gLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG5cblxuICAgICAgaWYgKHN0YXJ0ICsgbG9jYWxPZmZzZXQgPD0gbWF4TGluZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGZvcndhcmRFeGhhdXN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghYmFja3dhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmICghZm9yd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICB3YW50Rm9yd2FyZCA9IHRydWU7XG4gICAgICB9IC8vIENoZWNrIGlmIHRyeWluZyB0byBmaXQgYmVmb3JlIHRleHQgYmVnaW5uaW5nLCBhbmQgaWYgbm90LCBjaGVjayBpdCBmaXRzXG4gICAgICAvLyBiZWZvcmUgb2Zmc2V0IGxvY2F0aW9uXG5cblxuICAgICAgaWYgKG1pbkxpbmUgPD0gc3RhcnQgLSBsb2NhbE9mZnNldCkge1xuICAgICAgICByZXR1cm4gLWxvY2FsT2Zmc2V0Kys7XG4gICAgICB9XG5cbiAgICAgIGJhY2t3YXJkRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBpdGVyYXRvcigpO1xuICAgIH0gLy8gV2UgdHJpZWQgdG8gZml0IGh1bmsgYmVmb3JlIHRleHQgYmVnaW5uaW5nIGFuZCBiZXlvbmQgdGV4dCBsZW5ndGgsIHRoZW5cbiAgICAvLyBodW5rIGNhbid0IGZpdCBvbiB0aGUgdGV4dC4gUmV0dXJuIHVuZGVmaW5lZFxuXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh1bmlEaWZmKSkge1xuICAgIGlmICh1bmlEaWZmLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXBwbHlQYXRjaCBvbmx5IHdvcmtzIHdpdGggYSBzaW5nbGUgaW5wdXQuJyk7XG4gICAgfVxuXG4gICAgdW5pRGlmZiA9IHVuaURpZmZbMF07XG4gIH0gLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG5cblxuICB2YXIgbGluZXMgPSBzb3VyY2Uuc3BsaXQoL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdLyksXG4gICAgICBkZWxpbWl0ZXJzID0gc291cmNlLm1hdGNoKC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS9nKSB8fCBbXSxcbiAgICAgIGh1bmtzID0gdW5pRGlmZi5odW5rcyxcbiAgICAgIGNvbXBhcmVMaW5lID0gb3B0aW9ucy5jb21wYXJlTGluZSB8fCBmdW5jdGlvbiAobGluZU51bWJlciwgbGluZSwgb3BlcmF0aW9uLCBwYXRjaENvbnRlbnQpIHtcbiAgICByZXR1cm4gbGluZSA9PT0gcGF0Y2hDb250ZW50O1xuICB9LFxuICAgICAgZXJyb3JDb3VudCA9IDAsXG4gICAgICBmdXp6RmFjdG9yID0gb3B0aW9ucy5mdXp6RmFjdG9yIHx8IDAsXG4gICAgICBtaW5MaW5lID0gMCxcbiAgICAgIG9mZnNldCA9IDAsXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBodW5rIGV4YWN0bHkgZml0cyBvbiB0aGUgcHJvdmlkZWQgbG9jYXRpb25cbiAgICovXG5cblxuICBmdW5jdGlvbiBodW5rRml0cyhodW5rLCB0b1Bvcykge1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnIHx8IG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIC8vIENvbnRleHQgc2FuaXR5IGNoZWNrXG4gICAgICAgIGlmICghY29tcGFyZUxpbmUodG9Qb3MgKyAxLCBsaW5lc1t0b1Bvc10sIG9wZXJhdGlvbiwgY29udGVudCkpIHtcbiAgICAgICAgICBlcnJvckNvdW50Kys7XG5cbiAgICAgICAgICBpZiAoZXJyb3JDb3VudCA+IGZ1enpGYWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFNlYXJjaCBiZXN0IGZpdCBvZmZzZXRzIGZvciBlYWNoIGh1bmsgYmFzZWQgb24gdGhlIHByZXZpb3VzIG9uZXNcblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaHVuayA9IGh1bmtzW2ldLFxuICAgICAgICBtYXhMaW5lID0gbGluZXMubGVuZ3RoIC0gaHVuay5vbGRMaW5lcyxcbiAgICAgICAgbG9jYWxPZmZzZXQgPSAwLFxuICAgICAgICB0b1BvcyA9IG9mZnNldCArIGh1bmsub2xkU3RhcnQgLSAxO1xuICAgIHZhciBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gU2V0IGxvd2VyIHRleHQgbGltaXQgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGh1bmssIHNvIG5leHQgb25lcyBkb24ndCB0cnlcbiAgICAvLyB0byBmaXQgb3ZlciBhbHJlYWR5IHBhdGNoZWQgdGV4dFxuXG5cbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfSAvLyBBcHBseSBwYXRjaCBodW5rc1xuXG5cbiAgdmFyIGRpZmZPZmZzZXQgPSAwO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBodW5rcy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX2h1bmsgPSBodW5rc1tfaV0sXG4gICAgICAgIF90b1BvcyA9IF9odW5rLm9sZFN0YXJ0ICsgX2h1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG5cbiAgICBkaWZmT2Zmc2V0ICs9IF9odW5rLm5ld0xpbmVzIC0gX2h1bmsub2xkTGluZXM7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9odW5rLmxpbmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgbGluZSA9IF9odW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmVbMF0gOiAnICcsXG4gICAgICAgICAgY29udGVudCA9IGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSxcbiAgICAgICAgICBkZWxpbWl0ZXIgPSBfaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIF90b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICBsaW5lcy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgZGVsaW1pdGVycy5zcGxpY2UoX3RvUG9zLCAxKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgbGluZXMuc3BsaWNlKF90b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKF90b1BvcywgMCwgZGVsaW1pdGVyKTtcbiAgICAgICAgX3RvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHZhciBwcmV2aW91c09wZXJhdGlvbiA9IF9odW5rLmxpbmVzW2ogLSAxXSA/IF9odW5rLmxpbmVzW2ogLSAxXVswXSA6IG51bGw7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBIYW5kbGUgRU9GTkwgaW5zZXJ0aW9uL3JlbW92YWxcblxuXG4gIGlmIChyZW1vdmVFT0ZOTCkge1xuICAgIHdoaWxlICghbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pIHtcbiAgICAgIGxpbmVzLnBvcCgpO1xuICAgICAgZGVsaW1pdGVycy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYWRkRU9GTkwpIHtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBkZWxpbWl0ZXJzLnB1c2goJ1xcbicpO1xuICB9XG5cbiAgZm9yICh2YXIgX2sgPSAwOyBfayA8IGxpbmVzLmxlbmd0aCAtIDE7IF9rKyspIHtcbiAgICBsaW5lc1tfa10gPSBsaW5lc1tfa10gKyBkZWxpbWl0ZXJzW19rXTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn0gLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuXG5mdW5jdGlvbiBhcHBseVBhdGNoZXModW5pRGlmZiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHVuaURpZmYgPT09ICdzdHJpbmcnKSB7XG4gICAgdW5pRGlmZiA9IHBhcnNlUGF0Y2godW5pRGlmZik7XG4gIH1cblxuICB2YXIgY3VycmVudEluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgdmFyIGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG5cbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9wdGlvbnMubG9hZEZpbGUoaW5kZXgsIGZ1bmN0aW9uIChlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jb21wbGV0ZShlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc0luZGV4KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb2Nlc3NJbmRleCgpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgb3B0aW9ucy5jb250ZXh0ID0gNDtcbiAgfVxuXG4gIHZhciBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgZGlmZi5wdXNoKHtcbiAgICB2YWx1ZTogJycsXG4gICAgbGluZXM6IFtdXG4gIH0pOyAvLyBBcHBlbmQgYW4gZW1wdHkgdmFsdWUgdG8gbWFrZSBjbGVhbnVwIGVhc2llclxuXG4gIGZ1bmN0aW9uIGNvbnRleHRMaW5lcyhsaW5lcykge1xuICAgIHJldHVybiBsaW5lcy5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICByZXR1cm4gJyAnICsgZW50cnk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaHVua3MgPSBbXTtcbiAgdmFyIG9sZFJhbmdlU3RhcnQgPSAwLFxuICAgICAgbmV3UmFuZ2VTdGFydCA9IDAsXG4gICAgICBjdXJSYW5nZSA9IFtdLFxuICAgICAgb2xkTGluZSA9IDEsXG4gICAgICBuZXdMaW5lID0gMTtcblxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICBsaW5lcyA9IGN1cnJlbnQubGluZXMgfHwgY3VycmVudC52YWx1ZS5yZXBsYWNlKC9cXG4kLywgJycpLnNwbGl0KCdcXG4nKTtcbiAgICBjdXJyZW50LmxpbmVzID0gbGluZXM7XG5cbiAgICBpZiAoY3VycmVudC5hZGRlZCB8fCBjdXJyZW50LnJlbW92ZWQpIHtcbiAgICAgIHZhciBfY3VyUmFuZ2U7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgcHJldmlvdXMgY29udGV4dCwgc3RhcnQgd2l0aCB0aGF0XG4gICAgICBpZiAoIW9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgdmFyIHByZXYgPSBkaWZmW2kgLSAxXTtcbiAgICAgICAgb2xkUmFuZ2VTdGFydCA9IG9sZExpbmU7XG4gICAgICAgIG5ld1JhbmdlU3RhcnQgPSBuZXdMaW5lO1xuXG4gICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgY3VyUmFuZ2UgPSBvcHRpb25zLmNvbnRleHQgPiAwID8gY29udGV4dExpbmVzKHByZXYubGluZXMuc2xpY2UoLW9wdGlvbnMuY29udGV4dCkpIDogW107XG4gICAgICAgICAgb2xkUmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG4gICAgICAgICAgbmV3UmFuZ2VTdGFydCAtPSBjdXJSYW5nZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gT3V0cHV0IG91ciBjaGFuZ2VzXG5cblxuICAgICAgKF9jdXJSYW5nZSA9IGN1clJhbmdlKS5wdXNoLmFwcGx5KF9jdXJSYW5nZSwgX3RvQ29uc3VtYWJsZUFycmF5KGxpbmVzLm1hcChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgcmV0dXJuIChjdXJyZW50LmFkZGVkID8gJysnIDogJy0nKSArIGVudHJ5O1xuICAgICAgfSkpKTsgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuXG5cbiAgICAgIGlmIChjdXJyZW50LmFkZGVkKSB7XG4gICAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2xkTGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElkZW50aWNhbCBjb250ZXh0IGxpbmVzLiBUcmFjayBsaW5lIGNoYW5nZXNcbiAgICAgIGlmIChvbGRSYW5nZVN0YXJ0KSB7XG4gICAgICAgIC8vIENsb3NlIG91dCBhbnkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBvdXRwdXQgKG9yIGpvaW4gb3ZlcmxhcHBpbmcpXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0ICogMiAmJiBpIDwgZGlmZi5sZW5ndGggLSAyKSB7XG4gICAgICAgICAgdmFyIF9jdXJSYW5nZTI7XG5cbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIChfY3VyUmFuZ2UyID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlMiwgX3RvQ29uc3VtYWJsZUFycmF5KGNvbnRleHRMaW5lcyhsaW5lcykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgX2N1clJhbmdlMztcblxuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIHZhciBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcblxuICAgICAgICAgIChfY3VyUmFuZ2UzID0gY3VyUmFuZ2UpLnB1c2guYXBwbHkoX2N1clJhbmdlMywgX3RvQ29uc3VtYWJsZUFycmF5KGNvbnRleHRMaW5lcyhsaW5lcy5zbGljZSgwLCBjb250ZXh0U2l6ZSkpKSk7XG5cbiAgICAgICAgICB2YXIgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IG9sZExpbmUgLSBvbGRSYW5nZVN0YXJ0ICsgY29udGV4dFNpemUsXG4gICAgICAgICAgICBuZXdTdGFydDogbmV3UmFuZ2VTdGFydCxcbiAgICAgICAgICAgIG5ld0xpbmVzOiBuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplLFxuICAgICAgICAgICAgbGluZXM6IGN1clJhbmdlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChpID49IGRpZmYubGVuZ3RoIC0gMiAmJiBsaW5lcy5sZW5ndGggPD0gb3B0aW9ucy5jb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBFT0YgaXMgaW5zaWRlIHRoaXMgaHVua1xuICAgICAgICAgICAgdmFyIG9sZEVPRk5ld2xpbmUgPSAvXFxuJC8udGVzdChvbGRTdHIpO1xuICAgICAgICAgICAgdmFyIG5ld0VPRk5ld2xpbmUgPSAvXFxuJC8udGVzdChuZXdTdHIpO1xuICAgICAgICAgICAgdmFyIG5vTmxCZWZvcmVBZGRzID0gbGluZXMubGVuZ3RoID09IDAgJiYgY3VyUmFuZ2UubGVuZ3RoID4gaHVuay5vbGRMaW5lcztcblxuICAgICAgICAgICAgaWYgKCFvbGRFT0ZOZXdsaW5lICYmIG5vTmxCZWZvcmVBZGRzICYmIG9sZFN0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogb2xkIGhhcyBubyBlb2wgYW5kIG5vIHRyYWlsaW5nIGNvbnRleHQ7IG5vLW5sIGNhbiBlbmQgdXAgYmVmb3JlIGFkZHNcbiAgICAgICAgICAgICAgLy8gaG93ZXZlciwgaWYgdGhlIG9sZCBmaWxlIGlzIGVtcHR5LCBkbyBub3Qgb3V0cHV0IHRoZSBuby1ubCBsaW5lXG4gICAgICAgICAgICAgIGN1clJhbmdlLnNwbGljZShodW5rLm9sZExpbmVzLCAwLCAnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb2xkRU9GTmV3bGluZSAmJiAhbm9ObEJlZm9yZUFkZHMgfHwgIW5ld0VPRk5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgY3VyUmFuZ2UucHVzaCgnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaHVua3MucHVzaChodW5rKTtcbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9sZExpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIF9sb29wKGkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbGRGaWxlTmFtZTogb2xkRmlsZU5hbWUsXG4gICAgbmV3RmlsZU5hbWU6IG5ld0ZpbGVOYW1lLFxuICAgIG9sZEhlYWRlcjogb2xkSGVhZGVyLFxuICAgIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuICAgIGh1bmtzOiBodW5rc1xuICB9O1xufVxuZnVuY3Rpb24gZm9ybWF0UGF0Y2goZGlmZikge1xuICB2YXIgcmV0ID0gW107XG5cbiAgaWYgKGRpZmYub2xkRmlsZU5hbWUgPT0gZGlmZi5uZXdGaWxlTmFtZSkge1xuICAgIHJldC5wdXNoKCdJbmRleDogJyArIGRpZmYub2xkRmlsZU5hbWUpO1xuICB9XG5cbiAgcmV0LnB1c2goJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgcmV0LnB1c2goJy0tLSAnICsgZGlmZi5vbGRGaWxlTmFtZSArICh0eXBlb2YgZGlmZi5vbGRIZWFkZXIgPT09ICd1bmRlZmluZWQnID8gJycgOiAnXFx0JyArIGRpZmYub2xkSGVhZGVyKSk7XG4gIHJldC5wdXNoKCcrKysgJyArIGRpZmYubmV3RmlsZU5hbWUgKyAodHlwZW9mIGRpZmYubmV3SGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm5ld0hlYWRlcikpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5odW5rcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBodW5rID0gZGlmZi5odW5rc1tpXTsgLy8gVW5pZmllZCBEaWZmIEZvcm1hdCBxdWlyazogSWYgdGhlIGNodW5rIHNpemUgaXMgMCxcbiAgICAvLyB0aGUgZmlyc3QgbnVtYmVyIGlzIG9uZSBsb3dlciB0aGFuIG9uZSB3b3VsZCBleHBlY3QuXG4gICAgLy8gaHR0cHM6Ly93d3cuYXJ0aW1hLmNvbS93ZWJsb2dzL3ZpZXdwb3N0LmpzcD90aHJlYWQ9MTY0MjkzXG5cbiAgICBpZiAoaHVuay5vbGRMaW5lcyA9PT0gMCkge1xuICAgICAgaHVuay5vbGRTdGFydCAtPSAxO1xuICAgIH1cblxuICAgIGlmIChodW5rLm5ld0xpbmVzID09PSAwKSB7XG4gICAgICBodW5rLm5ld1N0YXJ0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goJ0BAIC0nICsgaHVuay5vbGRTdGFydCArICcsJyArIGh1bmsub2xkTGluZXMgKyAnICsnICsgaHVuay5uZXdTdGFydCArICcsJyArIGh1bmsubmV3TGluZXMgKyAnIEBAJyk7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBodW5rLmxpbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXQuam9pbignXFxuJykgKyAnXFxuJztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZvcm1hdFBhdGNoKHN0cnVjdHVyZWRQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gY3JlYXRlUGF0Y2goZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICByZXR1cm4gY3JlYXRlVHdvRmlsZXNQYXRjaChmaWxlTmFtZSwgZmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGFycmF5RXF1YWwoYSwgYikge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcbn1cbmZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcbiAgaWYgKHN0YXJ0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RhcnRbaV0gIT09IGFycmF5W2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNhbGNMaW5lQ291bnQoaHVuaykge1xuICB2YXIgX2NhbGNPbGROZXdMaW5lQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGh1bmsubGluZXMpLFxuICAgICAgb2xkTGluZXMgPSBfY2FsY09sZE5ld0xpbmVDb3VudC5vbGRMaW5lcyxcbiAgICAgIG5ld0xpbmVzID0gX2NhbGNPbGROZXdMaW5lQ291bnQubmV3TGluZXM7XG5cbiAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBodW5rLm9sZExpbmVzID0gb2xkTGluZXM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGh1bmsub2xkTGluZXM7XG4gIH1cblxuICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsubmV3TGluZXMgPSBuZXdMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5uZXdMaW5lcztcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2UobWluZSwgdGhlaXJzLCBiYXNlKSB7XG4gIG1pbmUgPSBsb2FkUGF0Y2gobWluZSwgYmFzZSk7XG4gIHRoZWlycyA9IGxvYWRQYXRjaCh0aGVpcnMsIGJhc2UpO1xuICB2YXIgcmV0ID0ge307IC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cbiAgLy8gTGVhdmluZyBzYW5pdHkgY2hlY2tzIG9uIHRoaXMgdG8gdGhlIEFQSSBjb25zdW1lciB0aGF0IG1heSBrbm93IG1vcmUgYWJvdXQgdGhlXG4gIC8vIG1lYW5pbmcgaW4gdGhlaXIgb3duIGNvbnRleHQuXG5cbiAgaWYgKG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4KSB7XG4gICAgcmV0LmluZGV4ID0gbWluZS5pbmRleCB8fCB0aGVpcnMuaW5kZXg7XG4gIH1cblxuICBpZiAobWluZS5uZXdGaWxlTmFtZSB8fCB0aGVpcnMubmV3RmlsZU5hbWUpIHtcbiAgICBpZiAoIWZpbGVOYW1lQ2hhbmdlZChtaW5lKSkge1xuICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiBvdXJzLCB1c2UgdGhlaXJzIChhbmQgb3VycyBpZiB0aGVpcnMgZG9lcyBub3QgZXhpc3QpXG4gICAgICByZXQub2xkRmlsZU5hbWUgPSB0aGVpcnMub2xkRmlsZU5hbWUgfHwgbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHRoZWlycy5uZXdGaWxlTmFtZSB8fCBtaW5lLm5ld0ZpbGVOYW1lO1xuICAgICAgcmV0Lm9sZEhlYWRlciA9IHRoZWlycy5vbGRIZWFkZXIgfHwgbWluZS5vbGRIZWFkZXI7XG4gICAgICByZXQubmV3SGVhZGVyID0gdGhlaXJzLm5ld0hlYWRlciB8fCBtaW5lLm5ld0hlYWRlcjtcbiAgICB9IGVsc2UgaWYgKCFmaWxlTmFtZUNoYW5nZWQodGhlaXJzKSkge1xuICAgICAgLy8gTm8gaGVhZGVyIG9yIG5vIGNoYW5nZSBpbiB0aGVpcnMsIHVzZSBvdXJzXG4gICAgICByZXQub2xkRmlsZU5hbWUgPSBtaW5lLm9sZEZpbGVOYW1lO1xuICAgICAgcmV0Lm5ld0ZpbGVOYW1lID0gbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSBtaW5lLm9sZEhlYWRlcjtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSBtaW5lLm5ld0hlYWRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQm90aCBjaGFuZ2VkLi4uIGZpZ3VyZSBpdCBvdXRcbiAgICAgIHJldC5vbGRGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5vbGRGaWxlTmFtZSwgdGhlaXJzLm9sZEZpbGVOYW1lKTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IHNlbGVjdEZpZWxkKHJldCwgbWluZS5uZXdGaWxlTmFtZSwgdGhlaXJzLm5ld0ZpbGVOYW1lKTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkSGVhZGVyLCB0aGVpcnMub2xkSGVhZGVyKTtcbiAgICAgIHJldC5uZXdIZWFkZXIgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3SGVhZGVyLCB0aGVpcnMubmV3SGVhZGVyKTtcbiAgICB9XG4gIH1cblxuICByZXQuaHVua3MgPSBbXTtcbiAgdmFyIG1pbmVJbmRleCA9IDAsXG4gICAgICB0aGVpcnNJbmRleCA9IDAsXG4gICAgICBtaW5lT2Zmc2V0ID0gMCxcbiAgICAgIHRoZWlyc09mZnNldCA9IDA7XG5cbiAgd2hpbGUgKG1pbmVJbmRleCA8IG1pbmUuaHVua3MubGVuZ3RoIHx8IHRoZWlyc0luZGV4IDwgdGhlaXJzLmh1bmtzLmxlbmd0aCkge1xuICAgIHZhciBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7XG4gICAgICBvbGRTdGFydDogSW5maW5pdHlcbiAgICB9LFxuICAgICAgICB0aGVpcnNDdXJyZW50ID0gdGhlaXJzLmh1bmtzW3RoZWlyc0luZGV4XSB8fCB7XG4gICAgICBvbGRTdGFydDogSW5maW5pdHlcbiAgICB9O1xuXG4gICAgaWYgKGh1bmtCZWZvcmUobWluZUN1cnJlbnQsIHRoZWlyc0N1cnJlbnQpKSB7XG4gICAgICAvLyBUaGlzIHBhdGNoIGRvZXMgbm90IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIG90aGVycywgeWF5LlxuICAgICAgcmV0Lmh1bmtzLnB1c2goY2xvbmVIdW5rKG1pbmVDdXJyZW50LCBtaW5lT2Zmc2V0KSk7XG4gICAgICBtaW5lSW5kZXgrKztcbiAgICAgIHRoZWlyc09mZnNldCArPSBtaW5lQ3VycmVudC5uZXdMaW5lcyAtIG1pbmVDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSBpZiAoaHVua0JlZm9yZSh0aGVpcnNDdXJyZW50LCBtaW5lQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsodGhlaXJzQ3VycmVudCwgdGhlaXJzT2Zmc2V0KSk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZU9mZnNldCArPSB0aGVpcnNDdXJyZW50Lm5ld0xpbmVzIC0gdGhlaXJzQ3VycmVudC5vbGRMaW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3ZlcmxhcCwgbWVyZ2UgYXMgYmVzdCB3ZSBjYW5cbiAgICAgIHZhciBtZXJnZWRIdW5rID0ge1xuICAgICAgICBvbGRTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQub2xkU3RhcnQsIHRoZWlyc0N1cnJlbnQub2xkU3RhcnQpLFxuICAgICAgICBvbGRMaW5lczogMCxcbiAgICAgICAgbmV3U3RhcnQ6IE1hdGgubWluKG1pbmVDdXJyZW50Lm5ld1N0YXJ0ICsgbWluZU9mZnNldCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCArIHRoZWlyc09mZnNldCksXG4gICAgICAgIG5ld0xpbmVzOiAwLFxuICAgICAgICBsaW5lczogW11cbiAgICAgIH07XG4gICAgICBtZXJnZUxpbmVzKG1lcmdlZEh1bmssIG1pbmVDdXJyZW50Lm9sZFN0YXJ0LCBtaW5lQ3VycmVudC5saW5lcywgdGhlaXJzQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5saW5lcyk7XG4gICAgICB0aGVpcnNJbmRleCsrO1xuICAgICAgbWluZUluZGV4Kys7XG4gICAgICByZXQuaHVua3MucHVzaChtZXJnZWRIdW5rKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBsb2FkUGF0Y2gocGFyYW0sIGJhc2UpIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoL15AQC9tLnRlc3QocGFyYW0pIHx8IC9eSW5kZXg6L20udGVzdChwYXJhbSkpIHtcbiAgICAgIHJldHVybiBwYXJzZVBhdGNoKHBhcmFtKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYmFzZSByZWZlcmVuY2Ugb3IgcGFzcyBpbiBhIHBhdGNoJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cnVjdHVyZWRQYXRjaCh1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmFzZSwgcGFyYW0pO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtO1xufVxuXG5mdW5jdGlvbiBmaWxlTmFtZUNoYW5nZWQocGF0Y2gpIHtcbiAgcmV0dXJuIHBhdGNoLm5ld0ZpbGVOYW1lICYmIHBhdGNoLm5ld0ZpbGVOYW1lICE9PSBwYXRjaC5vbGRGaWxlTmFtZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0RmllbGQoaW5kZXgsIG1pbmUsIHRoZWlycykge1xuICBpZiAobWluZSA9PT0gdGhlaXJzKSB7XG4gICAgcmV0dXJuIG1pbmU7XG4gIH0gZWxzZSB7XG4gICAgaW5kZXguY29uZmxpY3QgPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBtaW5lOiBtaW5lLFxuICAgICAgdGhlaXJzOiB0aGVpcnNcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGh1bmtCZWZvcmUodGVzdCwgY2hlY2spIHtcbiAgcmV0dXJuIHRlc3Qub2xkU3RhcnQgPCBjaGVjay5vbGRTdGFydCAmJiB0ZXN0Lm9sZFN0YXJ0ICsgdGVzdC5vbGRMaW5lcyA8IGNoZWNrLm9sZFN0YXJ0O1xufVxuXG5mdW5jdGlvbiBjbG9uZUh1bmsoaHVuaywgb2Zmc2V0KSB7XG4gIHJldHVybiB7XG4gICAgb2xkU3RhcnQ6IGh1bmsub2xkU3RhcnQsXG4gICAgb2xkTGluZXM6IGh1bmsub2xkTGluZXMsXG4gICAgbmV3U3RhcnQ6IGh1bmsubmV3U3RhcnQgKyBvZmZzZXQsXG4gICAgbmV3TGluZXM6IGh1bmsubmV3TGluZXMsXG4gICAgbGluZXM6IGh1bmsubGluZXNcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VMaW5lcyhodW5rLCBtaW5lT2Zmc2V0LCBtaW5lTGluZXMsIHRoZWlyT2Zmc2V0LCB0aGVpckxpbmVzKSB7XG4gIC8vIFRoaXMgd2lsbCBnZW5lcmFsbHkgcmVzdWx0IGluIGEgY29uZmxpY3RlZCBodW5rLCBidXQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBjb250ZXh0XG4gIC8vIGlzIHRoZSBvbmx5IG92ZXJsYXAgd2hlcmUgd2UgY2FuIHN1Y2Nlc3NmdWxseSBtZXJnZSB0aGUgY29udGVudCBoZXJlLlxuICB2YXIgbWluZSA9IHtcbiAgICBvZmZzZXQ6IG1pbmVPZmZzZXQsXG4gICAgbGluZXM6IG1pbmVMaW5lcyxcbiAgICBpbmRleDogMFxuICB9LFxuICAgICAgdGhlaXIgPSB7XG4gICAgb2Zmc2V0OiB0aGVpck9mZnNldCxcbiAgICBsaW5lczogdGhlaXJMaW5lcyxcbiAgICBpbmRleDogMFxuICB9OyAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuXG4gIGluc2VydExlYWRpbmcoaHVuaywgbWluZSwgdGhlaXIpO1xuICBpbnNlcnRMZWFkaW5nKGh1bmssIHRoZWlyLCBtaW5lKTsgLy8gTm93IGluIHRoZSBvdmVybGFwIGNvbnRlbnQuIFNjYW4gdGhyb3VnaCBhbmQgc2VsZWN0IHRoZSBiZXN0IGNoYW5nZXMgZnJvbSBlYWNoLlxuXG4gIHdoaWxlIChtaW5lLmluZGV4IDwgbWluZS5saW5lcy5sZW5ndGggJiYgdGhlaXIuaW5kZXggPCB0aGVpci5saW5lcy5sZW5ndGgpIHtcbiAgICB2YXIgbWluZUN1cnJlbnQgPSBtaW5lLmxpbmVzW21pbmUuaW5kZXhdLFxuICAgICAgICB0aGVpckN1cnJlbnQgPSB0aGVpci5saW5lc1t0aGVpci5pbmRleF07XG5cbiAgICBpZiAoKG1pbmVDdXJyZW50WzBdID09PSAnLScgfHwgbWluZUN1cnJlbnRbMF0gPT09ICcrJykgJiYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nIHx8IHRoZWlyQ3VycmVudFswXSA9PT0gJysnKSkge1xuICAgICAgLy8gQm90aCBtb2RpZmllZCAuLi5cbiAgICAgIG11dHVhbENoYW5nZShodW5rLCBtaW5lLCB0aGVpcik7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJysnICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICB2YXIgX2h1bmskbGluZXM7XG5cbiAgICAgIC8vIE1pbmUgaW5zZXJ0ZWRcbiAgICAgIChfaHVuayRsaW5lcyA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXMsIF90b0NvbnN1bWFibGVBcnJheShjb2xsZWN0Q2hhbmdlKG1pbmUpKSk7XG4gICAgfSBlbHNlIGlmICh0aGVpckN1cnJlbnRbMF0gPT09ICcrJyAmJiBtaW5lQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICB2YXIgX2h1bmskbGluZXMyO1xuXG4gICAgICAvLyBUaGVpcnMgaW5zZXJ0ZWRcbiAgICAgIChfaHVuayRsaW5lczIgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzMiwgX3RvQ29uc3VtYWJsZUFycmF5KGNvbGxlY3RDaGFuZ2UodGhlaXIpKSk7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG4gICAgICBtaW5lLmluZGV4Kys7XG4gICAgICB0aGVpci5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfVxuICB9IC8vIE5vdyBwdXNoIGFueXRoaW5nIHRoYXQgbWF5IGJlIHJlbWFpbmluZ1xuXG5cbiAgaW5zZXJ0VHJhaWxpbmcoaHVuaywgbWluZSk7XG4gIGluc2VydFRyYWlsaW5nKGh1bmssIHRoZWlyKTtcbiAgY2FsY0xpbmVDb3VudChodW5rKTtcbn1cblxuZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gIHZhciBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgIGlmIChhcnJheVN0YXJ0c1dpdGgobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldCh0aGVpciwgbXlDaGFuZ2VzLCBteUNoYW5nZXMubGVuZ3RoIC0gdGhlaXJDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgIHZhciBfaHVuayRsaW5lczM7XG5cbiAgICAgIChfaHVuayRsaW5lczMgPSBodW5rLmxpbmVzKS5wdXNoLmFwcGx5KF9odW5rJGxpbmVzMywgX3RvQ29uc3VtYWJsZUFycmF5KG15Q2hhbmdlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChhcnJheVN0YXJ0c1dpdGgodGhlaXJDaGFuZ2VzLCBteUNoYW5nZXMpICYmIHNraXBSZW1vdmVTdXBlcnNldChtaW5lLCB0aGVpckNoYW5nZXMsIHRoZWlyQ2hhbmdlcy5sZW5ndGggLSBteUNoYW5nZXMubGVuZ3RoKSkge1xuICAgICAgdmFyIF9odW5rJGxpbmVzNDtcblxuICAgICAgKF9odW5rJGxpbmVzNCA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXM0LCBfdG9Db25zdW1hYmxlQXJyYXkodGhlaXJDaGFuZ2VzKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXJyYXlFcXVhbChteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcykpIHtcbiAgICB2YXIgX2h1bmskbGluZXM1O1xuXG4gICAgKF9odW5rJGxpbmVzNSA9IGh1bmsubGluZXMpLnB1c2guYXBwbHkoX2h1bmskbGluZXM1LCBfdG9Db25zdW1hYmxlQXJyYXkobXlDaGFuZ2VzKSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25mbGljdChodW5rLCBteUNoYW5nZXMsIHRoZWlyQ2hhbmdlcyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92YWwoaHVuaywgbWluZSwgdGhlaXIsIHN3YXApIHtcbiAgdmFyIG15Q2hhbmdlcyA9IGNvbGxlY3RDaGFuZ2UobWluZSksXG4gICAgICB0aGVpckNoYW5nZXMgPSBjb2xsZWN0Q29udGV4dCh0aGVpciwgbXlDaGFuZ2VzKTtcblxuICBpZiAodGhlaXJDaGFuZ2VzLm1lcmdlZCkge1xuICAgIHZhciBfaHVuayRsaW5lczY7XG5cbiAgICAoX2h1bmskbGluZXM2ID0gaHVuay5saW5lcykucHVzaC5hcHBseShfaHVuayRsaW5lczYsIF90b0NvbnN1bWFibGVBcnJheSh0aGVpckNoYW5nZXMubWVyZ2VkKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gIGh1bmsubGluZXMucHVzaCh7XG4gICAgY29uZmxpY3Q6IHRydWUsXG4gICAgbWluZTogbWluZSxcbiAgICB0aGVpcnM6IHRoZWlyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcbiAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgaW5zZXJ0Lm9mZnNldCsrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydFRyYWlsaW5nKGh1bmssIGluc2VydCkge1xuICB3aGlsZSAoaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENoYW5nZShzdGF0ZSkge1xuICB2YXIgcmV0ID0gW10sXG4gICAgICBvcGVyYXRpb24gPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF1bMF07XG5cbiAgd2hpbGUgKHN0YXRlLmluZGV4IDwgc3RhdGUubGluZXMubGVuZ3RoKSB7XG4gICAgdmFyIGxpbmUgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF07IC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cblxuICAgIGlmIChvcGVyYXRpb24gPT09ICctJyAmJiBsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIG9wZXJhdGlvbiA9ICcrJztcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0aW9uID09PSBsaW5lWzBdKSB7XG4gICAgICByZXQucHVzaChsaW5lKTtcbiAgICAgIHN0YXRlLmluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb250ZXh0KHN0YXRlLCBtYXRjaENoYW5nZXMpIHtcbiAgdmFyIGNoYW5nZXMgPSBbXSxcbiAgICAgIG1lcmdlZCA9IFtdLFxuICAgICAgbWF0Y2hJbmRleCA9IDAsXG4gICAgICBjb250ZXh0Q2hhbmdlcyA9IGZhbHNlLFxuICAgICAgY29uZmxpY3RlZCA9IGZhbHNlO1xuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdOyAvLyBPbmNlIHdlJ3ZlIGhpdCBvdXIgYWRkLCB0aGVuIHdlIGFyZSBkb25lXG5cbiAgICBpZiAobWF0Y2hbMF0gPT09ICcrJykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29udGV4dENoYW5nZXMgPSBjb250ZXh0Q2hhbmdlcyB8fCBjaGFuZ2VbMF0gIT09ICcgJztcbiAgICBtZXJnZWQucHVzaChtYXRjaCk7XG4gICAgbWF0Y2hJbmRleCsrOyAvLyBDb25zdW1lIGFueSBhZGRpdGlvbnMgaW4gdGhlIG90aGVyIGJsb2NrIGFzIGEgY29uZmxpY3QgdG8gYXR0ZW1wdFxuICAgIC8vIHRvIHB1bGwgaW4gdGhlIHJlbWFpbmluZyBjb250ZXh0IGFmdGVyIHRoaXNcblxuICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJyAmJiBjb250ZXh0Q2hhbmdlcykge1xuICAgIGNvbmZsaWN0ZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGNvbmZsaWN0ZWQpIHtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aCkge1xuICAgIG1lcmdlZC5wdXNoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4KytdKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiBtZXJnZWQsXG4gICAgY2hhbmdlczogY2hhbmdlc1xuICB9O1xufVxuXG5mdW5jdGlvbiBhbGxSZW1vdmVzKGNoYW5nZXMpIHtcbiAgcmV0dXJuIGNoYW5nZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjaGFuZ2UpIHtcbiAgICByZXR1cm4gcHJldiAmJiBjaGFuZ2VbMF0gPT09ICctJztcbiAgfSwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHNraXBSZW1vdmVTdXBlcnNldChzdGF0ZSwgcmVtb3ZlQ2hhbmdlcywgZGVsdGEpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZUNvbnRlbnQgPSByZW1vdmVDaGFuZ2VzW3JlbW92ZUNoYW5nZXMubGVuZ3RoIC0gZGVsdGEgKyBpXS5zdWJzdHIoMSk7XG5cbiAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICB2YXIgb2xkTGluZXMgPSAwO1xuICB2YXIgbmV3TGluZXMgPSAwO1xuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lKSB7XG4gICAgaWYgKHR5cGVvZiBsaW5lICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG15Q291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUubWluZSk7XG4gICAgICB2YXIgdGhlaXJDb3VudCA9IGNhbGNPbGROZXdMaW5lQ291bnQobGluZS50aGVpcnMpO1xuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobXlDb3VudC5vbGRMaW5lcyA9PT0gdGhlaXJDb3VudC5vbGRMaW5lcykge1xuICAgICAgICAgIG9sZExpbmVzICs9IG15Q291bnQub2xkTGluZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkTGluZXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0xpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQubmV3TGluZXMgPT09IHRoZWlyQ291bnQubmV3TGluZXMpIHtcbiAgICAgICAgICBuZXdMaW5lcyArPSBteUNvdW50Lm5ld0xpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0xpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnKycgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBuZXdMaW5lcysrO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJy0nIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgb2xkTGluZXMrKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIG9sZExpbmVzOiBvbGRMaW5lcyxcbiAgICBuZXdMaW5lczogbmV3TGluZXNcbiAgfTtcbn1cblxuLy8gU2VlOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2gvd2lraS9BUElcbmZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuICB2YXIgcmV0ID0gW10sXG4gICAgICBjaGFuZ2UsXG4gICAgICBvcGVyYXRpb247XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhbmdlID0gY2hhbmdlc1tpXTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIG9wZXJhdGlvbiA9IDE7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgb3BlcmF0aW9uID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goW29wZXJhdGlvbiwgY2hhbmdlLnZhbHVlXSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Q2hhbmdlc1RvWE1MKGNoYW5nZXMpIHtcbiAgdmFyIHJldCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldO1xuXG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgcmV0LnB1c2goJzxpbnM+Jyk7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2UucmVtb3ZlZCkge1xuICAgICAgcmV0LnB1c2goJzxkZWw+Jyk7XG4gICAgfVxuXG4gICAgcmV0LnB1c2goZXNjYXBlSFRNTChjaGFuZ2UudmFsdWUpKTtcblxuICAgIGlmIChjaGFuZ2UuYWRkZWQpIHtcbiAgICAgIHJldC5wdXNoKCc8L2lucz4nKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICByZXQucHVzaCgnPC9kZWw+Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlSFRNTChzKSB7XG4gIHZhciBuID0gcztcbiAgbiA9IG4ucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTtcbiAgbiA9IG4ucmVwbGFjZSgvPC9nLCAnJmx0OycpO1xuICBuID0gbi5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG4gIG4gPSBuLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgcmV0dXJuIG47XG59XG5cbmV4cG9ydCB7IERpZmYsIGFwcGx5UGF0Y2gsIGFwcGx5UGF0Y2hlcywgY2Fub25pY2FsaXplLCBjb252ZXJ0Q2hhbmdlc1RvRE1QLCBjb252ZXJ0Q2hhbmdlc1RvWE1MLCBjcmVhdGVQYXRjaCwgY3JlYXRlVHdvRmlsZXNQYXRjaCwgZGlmZkFycmF5cywgZGlmZkNoYXJzLCBkaWZmQ3NzLCBkaWZmSnNvbiwgZGlmZkxpbmVzLCBkaWZmU2VudGVuY2VzLCBkaWZmVHJpbW1lZExpbmVzLCBkaWZmV29yZHMsIGRpZmZXb3Jkc1dpdGhTcGFjZSwgbWVyZ2UsIHBhcnNlUGF0Y2gsIHN0cnVjdHVyZWRQYXRjaCB9O1xuIiwiLyogZXNsaW50LWRpc2FibGUgeW9kYSAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0Z1bGx3aWR0aENvZGVQb2ludChjb2RlUG9pbnQpIHtcblx0aWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGNvZGVQb2ludCkpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBDb2RlIHBvaW50cyBhcmUgZGVyaXZlZCBmcm9tOlxuXHQvLyBodHRwczovL3VuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL0Vhc3RBc2lhbldpZHRoLnR4dFxuXHRyZXR1cm4gY29kZVBvaW50ID49IDB4MTEwMCAmJiAoXG5cdFx0Y29kZVBvaW50IDw9IDB4MTE1RiB8fCAvLyBIYW5ndWwgSmFtb1xuXHRcdGNvZGVQb2ludCA9PT0gMHgyMzI5IHx8IC8vIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVFxuXHRcdGNvZGVQb2ludCA9PT0gMHgyMzJBIHx8IC8vIFJJR0hULVBPSU5USU5HIEFOR0xFIEJSQUNLRVRcblx0XHQvLyBDSksgUmFkaWNhbHMgU3VwcGxlbWVudCAuLiBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXG5cdFx0KDB4MkU4MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzI0NyAmJiBjb2RlUG9pbnQgIT09IDB4MzAzRikgfHxcblx0XHQvLyBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzIC4uIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcblx0XHQoMHgzMjUwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHg0REJGKSB8fFxuXHRcdC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgLi4gWWkgUmFkaWNhbHNcblx0XHQoMHg0RTAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBNEM2KSB8fFxuXHRcdC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUFcblx0XHQoMHhBOTYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBOTdDKSB8fFxuXHRcdC8vIEhhbmd1bCBTeWxsYWJsZXNcblx0XHQoMHhBQzAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhEN0EzKSB8fFxuXHRcdC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcblx0XHQoMHhGOTAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGQUZGKSB8fFxuXHRcdC8vIFZlcnRpY2FsIEZvcm1zXG5cdFx0KDB4RkUxMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkUxOSkgfHxcblx0XHQvLyBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyAuLiBTbWFsbCBGb3JtIFZhcmlhbnRzXG5cdFx0KDB4RkUzMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkU2QikgfHxcblx0XHQvLyBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1xuXHRcdCgweEZGMDEgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGNjApIHx8XG5cdFx0KDB4RkZFMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZFNikgfHxcblx0XHQvLyBLYW5hIFN1cHBsZW1lbnRcblx0XHQoMHgxQjAwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MUIwMDEpIHx8XG5cdFx0Ly8gRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudFxuXHRcdCgweDFGMjAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjI1MSkgfHxcblx0XHQvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBCIC4uIFRlcnRpYXJ5IElkZW9ncmFwaGljIFBsYW5lXG5cdFx0KDB4MjAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDNGRkZEKVxuXHQpO1xufVxuIiwiY29uc3QgQU5TSV9CQUNLR1JPVU5EX09GRlNFVCA9IDEwO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKG9mZnNldCA9IDApID0+IGNvZGUgPT4gYFxcdTAwMUJbJHtjb2RlICsgb2Zmc2V0fW1gO1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChvZmZzZXQgPSAwKSA9PiBjb2RlID0+IGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xuXG5jb25zdCB3cmFwQW5zaTE2bSA9IChvZmZzZXQgPSAwKSA9PiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JlZH07JHtncmVlbn07JHtibHVlfW1gO1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHN0eWxlcyA9IHtcblx0XHRtb2RpZmllcjoge1xuXHRcdFx0cmVzZXQ6IFswLCAwXSxcblx0XHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0XHRkaW06IFsyLCAyMl0sXG5cdFx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0XHRvdmVybGluZTogWzUzLCA1NV0sXG5cdFx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XVxuXHRcdH0sXG5cdFx0Y29sb3I6IHtcblx0XHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRcdGN5YW46IFszNiwgMzldLFxuXHRcdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldXG5cdFx0fSxcblx0XHRiZ0NvbG9yOiB7XG5cdFx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV1cblx0XHR9XG5cdH07XG5cblx0Ly8gQWxpYXMgYnJpZ2h0IGJsYWNrIGFzIGdyYXkgKGFuZCBncmV5KVxuXHRzdHlsZXMuY29sb3IuZ3JheSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcblx0c3R5bGVzLmJnQ29sb3IuYmdHcmF5ID0gc3R5bGVzLmJnQ29sb3IuYmdCbGFja0JyaWdodDtcblx0c3R5bGVzLmNvbG9yLmdyZXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JleSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHN0eWxlcy5jb2xvci5hbnNpID0gd3JhcEFuc2kxNigpO1xuXHRzdHlsZXMuY29sb3IuYW5zaTI1NiA9IHdyYXBBbnNpMjU2KCk7XG5cdHN0eWxlcy5jb2xvci5hbnNpMTZtID0gd3JhcEFuc2kxNm0oKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaSA9IHdyYXBBbnNpMTYoQU5TSV9CQUNLR1JPVU5EX09GRlNFVCk7XG5cdHN0eWxlcy5iZ0NvbG9yLmFuc2kyNTYgPSB3cmFwQW5zaTI1NihBTlNJX0JBQ0tHUk9VTkRfT0ZGU0VUKTtcblx0c3R5bGVzLmJnQ29sb3IuYW5zaTE2bSA9IHdyYXBBbnNpMTZtKEFOU0lfQkFDS0dST1VORF9PRkZTRVQpO1xuXG5cdC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL1FpeC0vY29sb3ItY29udmVydC9ibG9iLzNmMGUwZDRlOTJlMjM1Nzk2Y2NiMTdmNmU4NWM3MjA5NGE2NTFmNDkvY29udmVyc2lvbnMuanNcblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3R5bGVzLCB7XG5cdFx0cmdiVG9BbnNpMjU2OiB7XG5cdFx0XHR2YWx1ZTogKHJlZCwgZ3JlZW4sIGJsdWUpID0+IHtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0XHRcdFx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdFx0XHRcdGlmIChyZWQgPT09IGdyZWVuICYmIGdyZWVuID09PSBibHVlKSB7XG5cdFx0XHRcdFx0aWYgKHJlZCA8IDgpIHtcblx0XHRcdFx0XHRcdHJldHVybiAxNjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocmVkID4gMjQ4KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gMjMxO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKCgocmVkIC0gOCkgLyAyNDcpICogMjQpICsgMjMyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIDE2ICtcblx0XHRcdFx0XHQoMzYgKiBNYXRoLnJvdW5kKHJlZCAvIDI1NSAqIDUpKSArXG5cdFx0XHRcdFx0KDYgKiBNYXRoLnJvdW5kKGdyZWVuIC8gMjU1ICogNSkpICtcblx0XHRcdFx0XHRNYXRoLnJvdW5kKGJsdWUgLyAyNTUgKiA1KTtcblx0XHRcdH0sXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHRcdH0sXG5cdFx0aGV4VG9SZ2I6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4ge1xuXHRcdFx0XHRjb25zdCBtYXRjaGVzID0gLyg/PGNvbG9yU3RyaW5nPlthLWZcXGRdezZ9fFthLWZcXGRdezN9KS9pLmV4ZWMoaGV4LnRvU3RyaW5nKDE2KSk7XG5cdFx0XHRcdGlmICghbWF0Y2hlcykge1xuXHRcdFx0XHRcdHJldHVybiBbMCwgMCwgMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQge2NvbG9yU3RyaW5nfSA9IG1hdGNoZXMuZ3JvdXBzO1xuXG5cdFx0XHRcdGlmIChjb2xvclN0cmluZy5sZW5ndGggPT09IDMpIHtcblx0XHRcdFx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoY2hhcmFjdGVyID0+IGNoYXJhY3RlciArIGNoYXJhY3Rlcikuam9pbignJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KGNvbG9yU3RyaW5nLCAxNik7XG5cblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQoaW50ZWdlciA+PiAxNikgJiAweEZGLFxuXHRcdFx0XHRcdChpbnRlZ2VyID4+IDgpICYgMHhGRixcblx0XHRcdFx0XHRpbnRlZ2VyICYgMHhGRlxuXHRcdFx0XHRdO1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSxcblx0XHRoZXhUb0Fuc2kyNTY6IHtcblx0XHRcdHZhbHVlOiBoZXggPT4gc3R5bGVzLnJnYlRvQW5zaTI1NiguLi5zdHlsZXMuaGV4VG9SZ2IoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHRcdH0sXG5cdFx0YW5zaTI1NlRvQW5zaToge1xuXHRcdFx0dmFsdWU6IGNvZGUgPT4ge1xuXHRcdFx0XHRpZiAoY29kZSA8IDgpIHtcblx0XHRcdFx0XHRyZXR1cm4gMzAgKyBjb2RlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvZGUgPCAxNikge1xuXHRcdFx0XHRcdHJldHVybiA5MCArIChjb2RlIC0gOCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgcmVkO1xuXHRcdFx0XHRsZXQgZ3JlZW47XG5cdFx0XHRcdGxldCBibHVlO1xuXG5cdFx0XHRcdGlmIChjb2RlID49IDIzMikge1xuXHRcdFx0XHRcdHJlZCA9ICgoKGNvZGUgLSAyMzIpICogMTApICsgOCkgLyAyNTU7XG5cdFx0XHRcdFx0Z3JlZW4gPSByZWQ7XG5cdFx0XHRcdFx0Ymx1ZSA9IHJlZDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb2RlIC09IDE2O1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVtYWluZGVyID0gY29kZSAlIDM2O1xuXG5cdFx0XHRcdFx0cmVkID0gTWF0aC5mbG9vcihjb2RlIC8gMzYpIC8gNTtcblx0XHRcdFx0XHRncmVlbiA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gNikgLyA1O1xuXHRcdFx0XHRcdGJsdWUgPSAocmVtYWluZGVyICUgNikgLyA1O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBNYXRoLm1heChyZWQsIGdyZWVuLCBibHVlKSAqIDI7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDMwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHJlc3VsdCA9IDMwICsgKChNYXRoLnJvdW5kKGJsdWUpIDw8IDIpIHwgKE1hdGgucm91bmQoZ3JlZW4pIDw8IDEpIHwgTWF0aC5yb3VuZChyZWQpKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRcdFx0XHRyZXN1bHQgKz0gNjA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSxcblx0XHRyZ2JUb0Fuc2k6IHtcblx0XHRcdHZhbHVlOiAocmVkLCBncmVlbiwgYmx1ZSkgPT4gc3R5bGVzLmFuc2kyNTZUb0Fuc2koc3R5bGVzLnJnYlRvQW5zaTI1NihyZWQsIGdyZWVuLCBibHVlKSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHRcdH0sXG5cdFx0aGV4VG9BbnNpOiB7XG5cdFx0XHR2YWx1ZTogaGV4ID0+IHN0eWxlcy5hbnNpMjU2VG9BbnNpKHN0eWxlcy5oZXhUb0Fuc2kyNTYoaGV4KSksXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZVxuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuY29uc3QgYW5zaVN0eWxlcyA9IGFzc2VtYmxlU3R5bGVzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGFuc2lTdHlsZXM7XG4iLCJpbXBvcnQgaXNGdWxsd2lkdGhDb2RlUG9pbnQgZnJvbSAnaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQnO1xuaW1wb3J0IGFuc2lTdHlsZXMgZnJvbSAnYW5zaS1zdHlsZXMnO1xuXG5jb25zdCBhc3RyYWxSZWdleCA9IC9eW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXSQvO1xuXG5jb25zdCBFU0NBUEVTID0gW1xuXHQnXFx1MDAxQicsXG5cdCdcXHUwMDlCJ1xuXTtcblxuY29uc3Qgd3JhcEFuc2kgPSBjb2RlID0+IGAke0VTQ0FQRVNbMF19WyR7Y29kZX1tYDtcblxuY29uc3QgY2hlY2tBbnNpID0gKGFuc2lDb2RlcywgaXNFc2NhcGVzLCBlbmRBbnNpQ29kZSkgPT4ge1xuXHRsZXQgb3V0cHV0ID0gW107XG5cdGFuc2lDb2RlcyA9IFsuLi5hbnNpQ29kZXNdO1xuXG5cdGZvciAobGV0IGFuc2lDb2RlIG9mIGFuc2lDb2Rlcykge1xuXHRcdGNvbnN0IGFuc2lDb2RlT3JpZ2luID0gYW5zaUNvZGU7XG5cdFx0aWYgKGFuc2lDb2RlLmluY2x1ZGVzKCc7JykpIHtcblx0XHRcdGFuc2lDb2RlID0gYW5zaUNvZGUuc3BsaXQoJzsnKVswXVswXSArICcwJztcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtID0gYW5zaVN0eWxlcy5jb2Rlcy5nZXQoTnVtYmVyLnBhcnNlSW50KGFuc2lDb2RlLCAxMCkpO1xuXHRcdGlmIChpdGVtKSB7XG5cdFx0XHRjb25zdCBpbmRleEVzY2FwZSA9IGFuc2lDb2Rlcy5pbmRleE9mKGl0ZW0udG9TdHJpbmcoKSk7XG5cdFx0XHRpZiAoaW5kZXhFc2NhcGUgPT09IC0xKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHdyYXBBbnNpKGlzRXNjYXBlcyA/IGl0ZW0gOiBhbnNpQ29kZU9yaWdpbikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YW5zaUNvZGVzLnNwbGljZShpbmRleEVzY2FwZSwgMSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc0VzY2FwZXMpIHtcblx0XHRcdG91dHB1dC5wdXNoKHdyYXBBbnNpKDApKTtcblx0XHRcdGJyZWFrO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRwdXQucHVzaCh3cmFwQW5zaShhbnNpQ29kZU9yaWdpbikpO1xuXHRcdH1cblx0fVxuXG5cdGlmIChpc0VzY2FwZXMpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlsdGVyKChlbGVtZW50LCBpbmRleCkgPT4gb3V0cHV0LmluZGV4T2YoZWxlbWVudCkgPT09IGluZGV4KTtcblxuXHRcdGlmIChlbmRBbnNpQ29kZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBmaXN0RXNjYXBlQ29kZSA9IHdyYXBBbnNpKGFuc2lTdHlsZXMuY29kZXMuZ2V0KE51bWJlci5wYXJzZUludChlbmRBbnNpQ29kZSwgMTApKSk7XG5cdFx0XHQvLyBUT0RPOiBSZW1vdmUgdGhlIHVzZSBvZiBgLnJlZHVjZWAgaGVyZS5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LXJlZHVjZVxuXHRcdFx0b3V0cHV0ID0gb3V0cHV0LnJlZHVjZSgoY3VycmVudCwgbmV4dCkgPT4gbmV4dCA9PT0gZmlzdEVzY2FwZUNvZGUgPyBbbmV4dCwgLi4uY3VycmVudF0gOiBbLi4uY3VycmVudCwgbmV4dF0sIFtdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2xpY2VBbnNpKHN0cmluZywgYmVnaW4sIGVuZCkge1xuXHRjb25zdCBjaGFyYWN0ZXJzID0gWy4uLnN0cmluZ107XG5cdGNvbnN0IGFuc2lDb2RlcyA9IFtdO1xuXG5cdGxldCBzdHJpbmdFbmQgPSB0eXBlb2YgZW5kID09PSAnbnVtYmVyJyA/IGVuZCA6IGNoYXJhY3RlcnMubGVuZ3RoO1xuXHRsZXQgaXNJbnNpZGVFc2NhcGUgPSBmYWxzZTtcblx0bGV0IGFuc2lDb2RlO1xuXHRsZXQgdmlzaWJsZSA9IDA7XG5cdGxldCBvdXRwdXQgPSAnJztcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgY2hhcmFjdGVyXSBvZiBjaGFyYWN0ZXJzLmVudHJpZXMoKSkge1xuXHRcdGxldCBsZWZ0RXNjYXBlID0gZmFsc2U7XG5cblx0XHRpZiAoRVNDQVBFUy5pbmNsdWRlcyhjaGFyYWN0ZXIpKSB7XG5cdFx0XHRjb25zdCBjb2RlID0gL1xcZFtebV0qLy5leGVjKHN0cmluZy5zbGljZShpbmRleCwgaW5kZXggKyAxOCkpO1xuXHRcdFx0YW5zaUNvZGUgPSBjb2RlICYmIGNvZGUubGVuZ3RoID4gMCA/IGNvZGVbMF0gOiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICh2aXNpYmxlIDwgc3RyaW5nRW5kKSB7XG5cdFx0XHRcdGlzSW5zaWRlRXNjYXBlID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoYW5zaUNvZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFuc2lDb2Rlcy5wdXNoKGFuc2lDb2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNJbnNpZGVFc2NhcGUgJiYgY2hhcmFjdGVyID09PSAnbScpIHtcblx0XHRcdGlzSW5zaWRlRXNjYXBlID0gZmFsc2U7XG5cdFx0XHRsZWZ0RXNjYXBlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIWlzSW5zaWRlRXNjYXBlICYmICFsZWZ0RXNjYXBlKSB7XG5cdFx0XHR2aXNpYmxlKys7XG5cdFx0fVxuXG5cdFx0aWYgKCFhc3RyYWxSZWdleC50ZXN0KGNoYXJhY3RlcikgJiYgaXNGdWxsd2lkdGhDb2RlUG9pbnQoY2hhcmFjdGVyLmNvZGVQb2ludEF0KCkpKSB7XG5cdFx0XHR2aXNpYmxlKys7XG5cblx0XHRcdGlmICh0eXBlb2YgZW5kICE9PSAnbnVtYmVyJykge1xuXHRcdFx0XHRzdHJpbmdFbmQrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodmlzaWJsZSA+IGJlZ2luICYmIHZpc2libGUgPD0gc3RyaW5nRW5kKSB7XG5cdFx0XHRvdXRwdXQgKz0gY2hhcmFjdGVyO1xuXHRcdH0gZWxzZSBpZiAodmlzaWJsZSA9PT0gYmVnaW4gJiYgIWlzSW5zaWRlRXNjYXBlICYmIGFuc2lDb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG91dHB1dCA9IGNoZWNrQW5zaShhbnNpQ29kZXMpO1xuXHRcdH0gZWxzZSBpZiAodmlzaWJsZSA+PSBzdHJpbmdFbmQpIHtcblx0XHRcdG91dHB1dCArPSBjaGVja0Fuc2koYW5zaUNvZGVzLCB0cnVlLCBhbnNpQ29kZSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYW5zaVJlZ2V4KHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHQgICAgJ1tcXFxcdTAwMUJcXFxcdTAwOUJdW1tcXFxcXSgpIzs/XSooPzooPzooPzooPzo7Wy1hLXpBLVpcXFxcZFxcXFwvIyYuOj0/JUB+X10rKSp8W2EtekEtWlxcXFxkXSsoPzo7Wy1hLXpBLVpcXFxcZFxcXFwvIyYuOj0/JUB+X10qKSopP1xcXFx1MDAwNyknLFxuXHRcdCcoPzooPzpcXFxcZHsxLDR9KD86O1xcXFxkezAsNH0pKik/W1xcXFxkQS1QUi1UWmNmLW50cXJ5PT48fl0pKSdcblx0XS5qb2luKCd8Jyk7XG5cblx0cmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgb25seUZpcnN0ID8gdW5kZWZpbmVkIDogJ2cnKTtcbn1cbiIsImltcG9ydCBhbnNpUmVnZXggZnJvbSAnYW5zaS1yZWdleCc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN0cmlwQW5zaShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBzdHJpbmd9XFxgYCk7XG5cdH1cblxuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoYW5zaVJlZ2V4KCksICcnKTtcbn1cbiIsInZhciBlYXcgPSB7fTtcblxuaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBtb2R1bGUpIHtcbiAgd2luZG93LmVhc3Rhc2lhbndpZHRoID0gZWF3O1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBlYXc7XG59XG5cbmVhdy5lYXN0QXNpYW5XaWR0aCA9IGZ1bmN0aW9uKGNoYXJhY3Rlcikge1xuICB2YXIgeCA9IGNoYXJhY3Rlci5jaGFyQ29kZUF0KDApO1xuICB2YXIgeSA9IChjaGFyYWN0ZXIubGVuZ3RoID09IDIpID8gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMSkgOiAwO1xuICB2YXIgY29kZVBvaW50ID0geDtcbiAgaWYgKCgweEQ4MDAgPD0geCAmJiB4IDw9IDB4REJGRikgJiYgKDB4REMwMCA8PSB5ICYmIHkgPD0gMHhERkZGKSkge1xuICAgIHggJj0gMHgzRkY7XG4gICAgeSAmPSAweDNGRjtcbiAgICBjb2RlUG9pbnQgPSAoeCA8PCAxMCkgfCB5O1xuICAgIGNvZGVQb2ludCArPSAweDEwMDAwO1xuICB9XG5cbiAgaWYgKCgweDMwMDAgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4RkYwMSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkY2MCkgfHxcbiAgICAgICgweEZGRTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGRTYpKSB7XG4gICAgcmV0dXJuICdGJztcbiAgfVxuICBpZiAoKDB4MjBBOSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHhGRjYxIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRkJFKSB8fFxuICAgICAgKDB4RkZDMiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZDNykgfHxcbiAgICAgICgweEZGQ0EgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGQ0YpIHx8XG4gICAgICAoMHhGRkQyIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRkQ3KSB8fFxuICAgICAgKDB4RkZEQSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZEQykgfHxcbiAgICAgICgweEZGRTggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGRUUpKSB7XG4gICAgcmV0dXJuICdIJztcbiAgfVxuICBpZiAoKDB4MTEwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MTE1RikgfHxcbiAgICAgICgweDExQTMgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDExQTcpIHx8XG4gICAgICAoMHgxMUZBIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxMUZGKSB8fFxuICAgICAgKDB4MjMyOSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjMyQSkgfHxcbiAgICAgICgweDJFODAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDJFOTkpIHx8XG4gICAgICAoMHgyRTlCIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyRUYzKSB8fFxuICAgICAgKDB4MkYwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MkZENSkgfHxcbiAgICAgICgweDJGRjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDJGRkIpIHx8XG4gICAgICAoMHgzMDAxIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMDNFKSB8fFxuICAgICAgKDB4MzA0MSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzA5NikgfHxcbiAgICAgICgweDMwOTkgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDMwRkYpIHx8XG4gICAgICAoMHgzMTA1IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMTJEKSB8fFxuICAgICAgKDB4MzEzMSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzE4RSkgfHxcbiAgICAgICgweDMxOTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDMxQkEpIHx8XG4gICAgICAoMHgzMUMwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMUUzKSB8fFxuICAgICAgKDB4MzFGMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzIxRSkgfHxcbiAgICAgICgweDMyMjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDMyNDcpIHx8XG4gICAgICAoMHgzMjUwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMkZFKSB8fFxuICAgICAgKDB4MzMwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4NERCRikgfHxcbiAgICAgICgweDRFMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEE0OEMpIHx8XG4gICAgICAoMHhBNDkwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBNEM2KSB8fFxuICAgICAgKDB4QTk2MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4QTk3QykgfHxcbiAgICAgICgweEFDMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEQ3QTMpIHx8XG4gICAgICAoMHhEN0IwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhEN0M2KSB8fFxuICAgICAgKDB4RDdDQiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RDdGQikgfHxcbiAgICAgICgweEY5MDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZBRkYpIHx8XG4gICAgICAoMHhGRTEwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRTE5KSB8fFxuICAgICAgKDB4RkUzMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkU1MikgfHxcbiAgICAgICgweEZFNTQgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZFNjYpIHx8XG4gICAgICAoMHhGRTY4IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRTZCKSB8fFxuICAgICAgKDB4MUIwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFCMDAxKSB8fFxuICAgICAgKDB4MUYyMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjAyKSB8fFxuICAgICAgKDB4MUYyMTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjNBKSB8fFxuICAgICAgKDB4MUYyNDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjQ4KSB8fFxuICAgICAgKDB4MUYyNTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjUxKSB8fFxuICAgICAgKDB4MjAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDJGNzNGKSB8fFxuICAgICAgKDB4MkI3NDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDJGRkZEKSB8fFxuICAgICAgKDB4MzAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDNGRkZEKSkge1xuICAgIHJldHVybiAnVyc7XG4gIH1cbiAgaWYgKCgweDAwMjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwN0UpIHx8XG4gICAgICAoMHgwMEEyIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMEEzKSB8fFxuICAgICAgKDB4MDBBNSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDBBNikgfHxcbiAgICAgICgweDAwQUMgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDBBRiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyN0U2IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyN0VEKSB8fFxuICAgICAgKDB4Mjk4NSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4Mjk4NikpIHtcbiAgICByZXR1cm4gJ05hJztcbiAgfVxuICBpZiAoKDB4MDBBMSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMEE0ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAwQTcgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwQTgpIHx8XG4gICAgICAoMHgwMEFBID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAwQUQgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwQUUpIHx8XG4gICAgICAoMHgwMEIwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMEI0KSB8fFxuICAgICAgKDB4MDBCNiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDBCQSkgfHxcbiAgICAgICgweDAwQkMgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwQkYpIHx8XG4gICAgICAoMHgwMEM2ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAwRDAgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDBENyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDBEOCkgfHxcbiAgICAgICgweDAwREUgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwRTEpIHx8XG4gICAgICAoMHgwMEU2ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAwRTggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAwRUEpIHx8XG4gICAgICAoMHgwMEVDIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMEVEKSB8fFxuICAgICAgKDB4MDBGMCA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMEYyIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMEYzKSB8fFxuICAgICAgKDB4MDBGNyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDBGQSkgfHxcbiAgICAgICgweDAwRkMgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDBGRSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMTAxID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxMTEgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDExMyA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMTFCID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxMjYgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAxMjcpIHx8XG4gICAgICAoMHgwMTJCID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxMzEgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAxMzMpIHx8XG4gICAgICAoMHgwMTM4ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxM0YgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAxNDIpIHx8XG4gICAgICAoMHgwMTQ0ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxNDggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAxNEIpIHx8XG4gICAgICAoMHgwMTREID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxNTIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAxNTMpIHx8XG4gICAgICAoMHgwMTY2IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMTY3KSB8fFxuICAgICAgKDB4MDE2QiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMUNFID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxRDAgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDFEMiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMUQ0ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxRDYgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDFEOCA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMURBID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAxREMgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDI1MSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMjYxID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAyQzQgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDJDNyA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMkM5IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwMkNCKSB8fFxuICAgICAgKDB4MDJDRCA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgwMkQwID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAyRDggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAyREIpIHx8XG4gICAgICAoMHgwMkREID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDAyREYgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MDMwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDM2RikgfHxcbiAgICAgICgweDAzOTEgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAzQTEpIHx8XG4gICAgICAoMHgwM0EzIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgwM0E5KSB8fFxuICAgICAgKDB4MDNCMSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MDNDMSkgfHxcbiAgICAgICgweDAzQzMgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDAzQzkpIHx8XG4gICAgICAoMHgwNDAxID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDA0MTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDA0NEYpIHx8XG4gICAgICAoMHgwNDUxID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIwMTAgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjAxMyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjAxNikgfHxcbiAgICAgICgweDIwMTggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIwMTkpIHx8XG4gICAgICAoMHgyMDFDIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyMDFEKSB8fFxuICAgICAgKDB4MjAyMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjAyMikgfHxcbiAgICAgICgweDIwMjQgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIwMjcpIHx8XG4gICAgICAoMHgyMDMwID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIwMzIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIwMzMpIHx8XG4gICAgICAoMHgyMDM1ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIwM0IgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjAzRSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMDc0ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIwN0YgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjA4MSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjA4NCkgfHxcbiAgICAgICgweDIwQUMgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjEwMyA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMTA1ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIxMDkgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjExMyA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMTE2ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIxMjEgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIxMjIpIHx8XG4gICAgICAoMHgyMTI2ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIxMkIgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjE1MyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjE1NCkgfHxcbiAgICAgICgweDIxNUIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIxNUUpIHx8XG4gICAgICAoMHgyMTYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyMTZCKSB8fFxuICAgICAgKDB4MjE3MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjE3OSkgfHxcbiAgICAgICgweDIxODkgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjE5MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjE5OSkgfHxcbiAgICAgICgweDIxQjggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIxQjkpIHx8XG4gICAgICAoMHgyMUQyID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIxRDQgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjFFNyA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMjAwID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyMDIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIyMDMpIHx8XG4gICAgICAoMHgyMjA3IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyMjA4KSB8fFxuICAgICAgKDB4MjIwQiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMjBGID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyMTEgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjIxNSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMjFBID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyMUQgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIyMjApIHx8XG4gICAgICAoMHgyMjIzID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyMjUgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjIyNyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjIyQykgfHxcbiAgICAgICgweDIyMkUgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjIzNCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjIzNykgfHxcbiAgICAgICgweDIyM0MgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIyM0QpIHx8XG4gICAgICAoMHgyMjQ4ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyNEMgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjI1MiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMjYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyMjYxKSB8fFxuICAgICAgKDB4MjI2NCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjI2NykgfHxcbiAgICAgICgweDIyNkEgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIyNkIpIHx8XG4gICAgICAoMHgyMjZFIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyMjZGKSB8fFxuICAgICAgKDB4MjI4MiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjI4MykgfHxcbiAgICAgICgweDIyODYgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDIyODcpIHx8XG4gICAgICAoMHgyMjk1ID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIyOTkgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjJBNSA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyMkJGID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDIzMTIgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjQ2MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjRFOSkgfHxcbiAgICAgICgweDI0RUIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI1NEIpIHx8XG4gICAgICAoMHgyNTUwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNTczKSB8fFxuICAgICAgKDB4MjU4MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjU4RikgfHxcbiAgICAgICgweDI1OTIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI1OTUpIHx8XG4gICAgICAoMHgyNUEwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNUExKSB8fFxuICAgICAgKDB4MjVBMyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjVBOSkgfHxcbiAgICAgICgweDI1QjIgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI1QjMpIHx8XG4gICAgICAoMHgyNUI2IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNUI3KSB8fFxuICAgICAgKDB4MjVCQyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjVCRCkgfHxcbiAgICAgICgweDI1QzAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI1QzEpIHx8XG4gICAgICAoMHgyNUM2IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNUM4KSB8fFxuICAgICAgKDB4MjVDQiA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyNUNFIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNUQxKSB8fFxuICAgICAgKDB4MjVFMiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjVFNSkgfHxcbiAgICAgICgweDI1RUYgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjYwNSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjYwNikgfHxcbiAgICAgICgweDI2MDkgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjYwRSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjYwRikgfHxcbiAgICAgICgweDI2MTQgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2MTUpIHx8XG4gICAgICAoMHgyNjFDID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDI2MUUgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4MjY0MCA9PSBjb2RlUG9pbnQpIHx8XG4gICAgICAoMHgyNjQyID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDI2NjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2NjEpIHx8XG4gICAgICAoMHgyNjYzIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNjY1KSB8fFxuICAgICAgKDB4MjY2NyA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjY2QSkgfHxcbiAgICAgICgweDI2NkMgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2NkQpIHx8XG4gICAgICAoMHgyNjZGID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDI2OUUgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2OUYpIHx8XG4gICAgICAoMHgyNkJFIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgyNkJGKSB8fFxuICAgICAgKDB4MjZDNCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MjZDRCkgfHxcbiAgICAgICgweDI2Q0YgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2RTEpIHx8XG4gICAgICAoMHgyNkUzID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDI2RTggPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDI2RkYpIHx8XG4gICAgICAoMHgyNzNEID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDI3NTcgPT0gY29kZVBvaW50KSB8fFxuICAgICAgKDB4Mjc3NiA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4Mjc3RikgfHxcbiAgICAgICgweDJCNTUgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDJCNTkpIHx8XG4gICAgICAoMHgzMjQ4IDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMjRGKSB8fFxuICAgICAgKDB4RTAwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RjhGRikgfHxcbiAgICAgICgweEZFMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZFMEYpIHx8XG4gICAgICAoMHhGRkZEID09IGNvZGVQb2ludCkgfHxcbiAgICAgICgweDFGMTAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjEwQSkgfHxcbiAgICAgICgweDFGMTEwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjEyRCkgfHxcbiAgICAgICgweDFGMTMwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjE2OSkgfHxcbiAgICAgICgweDFGMTcwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjE5QSkgfHxcbiAgICAgICgweEUwMTAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhFMDFFRikgfHxcbiAgICAgICgweEYwMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRkZGRCkgfHxcbiAgICAgICgweDEwMDAwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MTBGRkZEKSkge1xuICAgIHJldHVybiAnQSc7XG4gIH1cblxuICByZXR1cm4gJ04nO1xufTtcblxuZWF3LmNoYXJhY3Rlckxlbmd0aCA9IGZ1bmN0aW9uKGNoYXJhY3Rlcikge1xuICB2YXIgY29kZSA9IHRoaXMuZWFzdEFzaWFuV2lkdGgoY2hhcmFjdGVyKTtcbiAgaWYgKGNvZGUgPT0gJ0YnIHx8IGNvZGUgPT0gJ1cnIHx8IGNvZGUgPT0gJ0EnKSB7XG4gICAgcmV0dXJuIDI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbi8vIFNwbGl0IGEgc3RyaW5nIGNvbnNpZGVyaW5nIHN1cnJvZ2F0ZS1wYWlycy5cbmZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2goL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl18W15cXHVEODAwLVxcdURGRkZdL2cpIHx8IFtdO1xufVxuXG5lYXcubGVuZ3RoID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciBjaGFyYWN0ZXJzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpO1xuICB2YXIgbGVuID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGVuID0gbGVuICsgdGhpcy5jaGFyYWN0ZXJMZW5ndGgoY2hhcmFjdGVyc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGxlbjtcbn07XG5cbmVhdy5zbGljZSA9IGZ1bmN0aW9uKHRleHQsIHN0YXJ0LCBlbmQpIHtcbiAgdGV4dExlbiA9IGVhdy5sZW5ndGgodGV4dClcbiAgc3RhcnQgPSBzdGFydCA/IHN0YXJ0IDogMDtcbiAgZW5kID0gZW5kID8gZW5kIDogMTtcbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgc3RhcnQgPSB0ZXh0TGVuICsgc3RhcnQ7XG4gIH1cbiAgaWYgKGVuZCA8IDApIHtcbiAgICAgIGVuZCA9IHRleHRMZW4gKyBlbmQ7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICcnO1xuICB2YXIgZWF3TGVuID0gMDtcbiAgdmFyIGNoYXJzID0gc3RyaW5nVG9BcnJheSh0ZXh0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGFyID0gY2hhcnNbaV07XG4gICAgdmFyIGNoYXJMZW4gPSBlYXcubGVuZ3RoKGNoYXIpO1xuICAgIGlmIChlYXdMZW4gPj0gc3RhcnQgLSAoY2hhckxlbiA9PSAyID8gMSA6IDApKSB7XG4gICAgICAgIGlmIChlYXdMZW4gKyBjaGFyTGVuIDw9IGVuZCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlYXdMZW4gKz0gY2hhckxlbjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gaHR0cHM6Ly9tdGhzLmJlL2Vtb2ppXG4gIHJldHVybiAvXFx1RDgzQ1xcdURGRjRcXHVEQjQwXFx1REM2N1xcdURCNDBcXHVEQzYyKD86XFx1REI0MFxcdURDNzdcXHVEQjQwXFx1REM2Q1xcdURCNDBcXHVEQzczfFxcdURCNDBcXHVEQzczXFx1REI0MFxcdURDNjNcXHVEQjQwXFx1REM3NHxcXHVEQjQwXFx1REM2NVxcdURCNDBcXHVEQzZFXFx1REI0MFxcdURDNjcpXFx1REI0MFxcdURDN0Z8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGRlxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkZcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGRVxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZEXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKT9cXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKSkoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXFx1REZGRVxcdURGRkZdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZDXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGRC1cXHVERkZGXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGQlxcdTIwMERcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQy1cXHVERkZGXSl8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDXFx1REZGQig/OlxcdTIwMEQoPzpcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pKXxcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQy1cXHVERkZGXSl8W1xcdTI2OTVcXHUyNjk2XFx1MjcwOF1cXHVGRTBGfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSkpP3woPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSkpfFxcdTIwMEQoPzpcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0RcXHVEQzY4fCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRcXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNcXHVERkZFXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZELVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfCg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZFXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZEXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZDXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSlcXHVGRTBGfFxcdTIwMEQoPzooPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSlcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfFxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXxcXHVEODNDXFx1REZGRnxcXHVEODNDXFx1REZGRXxcXHVEODNDXFx1REZGRHxcXHVEODNDXFx1REZGQyk/fCg/OlxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXwoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pXFx1MjAwRFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpfFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNFXFx1REREMSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKSl8XFx1RDgzRFxcdURDNjkoPzpcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY3Q1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjdDXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKSl8XFx1RDgzRVxcdURERDEoPzpcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkZcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGN0NcXHVERjg0XFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSkpfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8KD86XFx1RDgzRFxcdURDNDFcXHVGRTBGXFx1MjAwRFxcdUQ4M0RcXHVEREU4fFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1xcdURGRkZcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkVcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkRcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkNcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkJcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdKXxcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZFXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZEXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZDXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdUQ4M0NcXHVERkZCXFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdfFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSl8XFx1RDgzRFxcdURFMzZcXHUyMDBEXFx1RDgzQ1xcdURGMkJ8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdTI2QTd8XFx1RDgzRFxcdURDM0JcXHUyMDBEXFx1Mjc0NHwoPzooPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MFxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM1XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDRcXHVEREQ2LVxcdURERERdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzRFxcdURDNkZ8XFx1RDgzRVtcXHVERDNDXFx1RERERVxcdUREREZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RkUwRnxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18XFx1RDgzQ1xcdURGRjRcXHUyMDBEXFx1MjYyMHwoPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MFxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM1XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDRcXHVEREQ2LVxcdURERERdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfFtcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMyOFxcdTIzQ0ZcXHUyM0VELVxcdTIzRUZcXHUyM0YxXFx1MjNGMlxcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQlxcdTI1RkNcXHUyNjAwLVxcdTI2MDRcXHUyNjBFXFx1MjYxMVxcdTI2MThcXHUyNjIwXFx1MjYyMlxcdTI2MjNcXHUyNjI2XFx1MjYyQVxcdTI2MkVcXHUyNjJGXFx1MjYzOC1cXHUyNjNBXFx1MjY0MFxcdTI2NDJcXHUyNjVGXFx1MjY2MFxcdTI2NjNcXHUyNjY1XFx1MjY2NlxcdTI2NjhcXHUyNjdCXFx1MjY3RVxcdTI2OTJcXHUyNjk0LVxcdTI2OTdcXHUyNjk5XFx1MjY5QlxcdTI2OUNcXHUyNkEwXFx1MjZBN1xcdTI2QjBcXHUyNkIxXFx1MjZDOFxcdTI2Q0ZcXHUyNkQxXFx1MjZEM1xcdTI2RTlcXHUyNkYwXFx1MjZGMVxcdTI2RjRcXHUyNkY3XFx1MjZGOFxcdTI3MDJcXHUyNzA4XFx1MjcwOVxcdTI3MEZcXHUyNzEyXFx1MjcxNFxcdTI3MTZcXHUyNzFEXFx1MjcyMVxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzYzXFx1MjdBMVxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MzAzMFxcdTMwM0RcXHUzMjk3XFx1MzI5OV18XFx1RDgzQ1tcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REUwMlxcdURFMzdcXHVERjIxXFx1REYyNC1cXHVERjJDXFx1REYzNlxcdURGN0RcXHVERjk2XFx1REY5N1xcdURGOTktXFx1REY5QlxcdURGOUVcXHVERjlGXFx1REZDRFxcdURGQ0VcXHVERkQ0LVxcdURGREZcXHVERkY1XFx1REZGN118XFx1RDgzRFtcXHVEQzNGXFx1RENGRFxcdURENDlcXHVERDRBXFx1REQ2RlxcdURENzBcXHVERDczXFx1REQ3Ni1cXHVERDc5XFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREQTVcXHVEREE4XFx1RERCMVxcdUREQjJcXHVEREJDXFx1RERDMi1cXHVEREM0XFx1REREMS1cXHVEREQzXFx1REREQy1cXHVERERFXFx1RERFMVxcdURERTNcXHVEREU4XFx1RERFRlxcdURERjNcXHVEREZBXFx1REVDQlxcdURFQ0QtXFx1REVDRlxcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUYwXFx1REVGM10pXFx1RkUwRnxcXHVEODNDXFx1REZGM1xcdUZFMEZcXHUyMDBEXFx1RDgzQ1xcdURGMDh8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjd8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURFMzVcXHUyMDBEXFx1RDgzRFxcdURDQUJ8XFx1RDgzRFxcdURFMkVcXHUyMDBEXFx1RDgzRFxcdURDQTh8XFx1RDgzRFxcdURDMTVcXHUyMDBEXFx1RDgzRVxcdUREQkF8XFx1RDgzRVxcdURERDEoPzpcXHVEODNDXFx1REZGRnxcXHVEODNDXFx1REZGRXxcXHVEODNDXFx1REZGRHxcXHVEODNDXFx1REZGQ3xcXHVEODNDXFx1REZGQik/fFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkZ8XFx1RDgzQ1xcdURGRkV8XFx1RDgzQ1xcdURGRkR8XFx1RDgzQ1xcdURGRkN8XFx1RDgzQ1xcdURGRkIpP3xcXHVEODNDXFx1RERGRFxcdUQ4M0NcXHVEREYwfFxcdUQ4M0NcXHVEREY2XFx1RDgzQ1xcdURERTZ8XFx1RDgzQ1xcdURERjRcXHVEODNDXFx1RERGMnxcXHVEODNEXFx1REMwOFxcdTIwMERcXHUyQjFCfFxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVERDI1fFxcdUQ4M0VcXHVERTc5KXxcXHVEODNEXFx1REM0MVxcdUZFMEZ8XFx1RDgzQ1xcdURGRjNcXHVGRTBGfFxcdUQ4M0NcXHVEREZGKD86XFx1RDgzQ1tcXHVEREU2XFx1RERGMlxcdURERkNdKXxcXHVEODNDXFx1RERGRSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjldKXxcXHVEODNDXFx1RERGQyg/OlxcdUQ4M0NbXFx1RERFQlxcdURERjhdKXxcXHVEODNDXFx1RERGQig/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERUVcXHVEREYzXFx1RERGQV0pfFxcdUQ4M0NcXHVEREZBKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQ1xcdURERjJcXHVEREYzXFx1RERGOFxcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERjkoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRFxcdURERUYtXFx1RERGNFxcdURERjdcXHVEREY5XFx1RERGQlxcdURERkNcXHVEREZGXSl8XFx1RDgzQ1xcdURERjgoPzpcXHVEODNDW1xcdURERTYtXFx1RERFQVxcdURERUMtXFx1RERGNFxcdURERjctXFx1RERGOVxcdURERkJcXHVEREZELVxcdURERkZdKXxcXHVEODNDXFx1RERGNyg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjRcXHVEREY4XFx1RERGQVxcdURERkNdKXxcXHVEODNDXFx1RERGNSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERUEtXFx1RERFRFxcdURERjAtXFx1RERGM1xcdURERjctXFx1RERGOVxcdURERkNcXHVEREZFXSl8XFx1RDgzQ1xcdURERjMoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQS1cXHVEREVDXFx1RERFRVxcdURERjFcXHVEREY0XFx1RERGNVxcdURERjdcXHVEREZBXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYyKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERjEoPzpcXHVEODNDW1xcdURERTYtXFx1RERFOFxcdURERUVcXHVEREYwXFx1RERGNy1cXHVEREZCXFx1RERGRV0pfFxcdUQ4M0NcXHVEREYwKD86XFx1RDgzQ1tcXHVEREVBXFx1RERFQy1cXHVEREVFXFx1RERGMlxcdURERjNcXHVEREY1XFx1RERGN1xcdURERkNcXHVEREZFXFx1RERGRl0pfFxcdUQ4M0NcXHVEREVGKD86XFx1RDgzQ1tcXHVEREVBXFx1RERGMlxcdURERjRcXHVEREY1XSl8XFx1RDgzQ1xcdURERUUoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQVxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOV0pfFxcdUQ4M0NcXHVEREVEKD86XFx1RDgzQ1tcXHVEREYwXFx1RERGMlxcdURERjNcXHVEREY3XFx1RERGOVxcdURERkFdKXxcXHVEODNDXFx1RERFQyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREVCKD86XFx1RDgzQ1tcXHVEREVFLVxcdURERjBcXHVEREYyXFx1RERGNFxcdURERjddKXxcXHVEODNDXFx1RERFQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERURcXHVEREY3LVxcdURERkFdKXxcXHVEODNDXFx1RERFOSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUNcXHVEREVGXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGRl0pfFxcdUQ4M0NcXHVEREU4KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERTlcXHVEREVCLVxcdURERUVcXHVEREYwLVxcdURERjVcXHVEREY3XFx1RERGQS1cXHVEREZGXSl8XFx1RDgzQ1xcdURERTcoPzpcXHVEODNDW1xcdURERTZcXHVEREU3XFx1RERFOS1cXHVEREVGXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XFx1RERGQlxcdURERkNcXHVEREZFXFx1RERGRl0pfFxcdUQ4M0NcXHVEREU2KD86XFx1RDgzQ1tcXHVEREU4LVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjJcXHVEREY0XFx1RERGNi1cXHVEREZBXFx1RERGQ1xcdURERkRcXHVEREZGXSl8WyNcXCowLTldXFx1RkUwRlxcdTIwRTN8XFx1Mjc2NFxcdUZFMEZ8KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzBcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNVxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ0XFx1RERENi1cXHVEREREXSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RkUwRnxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVERkY0fCg/OltcXHUyNzBBXFx1MjcwQl18XFx1RDgzQ1tcXHVERjg1XFx1REZDMlxcdURGQzddfFxcdUQ4M0RbXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2XFx1REM2N1xcdURDNkItXFx1REM2RFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1REM4RlxcdURDOTFcXHVEQ0FBXFx1REQ3QVxcdUREOTVcXHVERDk2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBDXFx1REQwRlxcdUREMTgtXFx1REQxQ1xcdUREMUVcXHVERDFGXFx1REQzMC1cXHVERDM0XFx1REQzNlxcdURENzdcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyXFx1REREM1xcdURERDVdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86W1xcdTI2MURcXHUyNzBDXFx1MjcwRF18XFx1RDgzRFtcXHVERDc0XFx1REQ5MF0pKD86XFx1RkUwRnxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFtcXHUyNzBBXFx1MjcwQl18XFx1RDgzQ1tcXHVERjg1XFx1REZDMlxcdURGQzddfFxcdUQ4M0RbXFx1REMwOFxcdURDMTVcXHVEQzNCXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2XFx1REM2N1xcdURDNkItXFx1REM2RFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1REM4RlxcdURDOTFcXHVEQ0FBXFx1REQ3QVxcdUREOTVcXHVERDk2XFx1REUyRVxcdURFMzVcXHVERTM2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBDXFx1REQwRlxcdUREMTgtXFx1REQxQ1xcdUREMUVcXHVERDFGXFx1REQzMC1cXHVERDM0XFx1REQzNlxcdURENzdcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyXFx1REREM1xcdURERDVdfFxcdUQ4M0NbXFx1REZDM1xcdURGQzRcXHVERkNBXXxcXHVEODNEW1xcdURDNkVcXHVEQzcwXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzVcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENFxcdURERDYtXFx1RERERF18XFx1RDgzRFxcdURDNkZ8XFx1RDgzRVtcXHVERDNDXFx1RERERVxcdUREREZdfFtcXHUyMzFBXFx1MjMxQlxcdTIzRTktXFx1MjNFQ1xcdTIzRjBcXHUyM0YzXFx1MjVGRFxcdTI1RkVcXHUyNjE0XFx1MjYxNVxcdTI2NDgtXFx1MjY1M1xcdTI2N0ZcXHUyNjkzXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2Q0VcXHUyNkQ0XFx1MjZFQVxcdTI2RjJcXHUyNkYzXFx1MjZGNVxcdTI2RkFcXHUyNkZEXFx1MjcwNVxcdTI3MjhcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzk1LVxcdTI3OTdcXHUyN0IwXFx1MjdCRlxcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVdfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDhFXFx1REQ5MS1cXHVERDlBXFx1REUwMVxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTM2XFx1REUzOC1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjBcXHVERjJELVxcdURGMzVcXHVERjM3LVxcdURGN0NcXHVERjdFLVxcdURGODRcXHVERjg2LVxcdURGOTNcXHVERkEwLVxcdURGQzFcXHVERkM1XFx1REZDNlxcdURGQzhcXHVERkM5XFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGOC1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1REMwN1xcdURDMDktXFx1REMxNFxcdURDMTYtXFx1REMzQVxcdURDM0MtXFx1REMzRVxcdURDNDBcXHVEQzQ0XFx1REM0NVxcdURDNTEtXFx1REM2NVxcdURDNkFcXHVEQzc5LVxcdURDN0JcXHVEQzdELVxcdURDODBcXHVEQzg0XFx1REM4OC1cXHVEQzhFXFx1REM5MFxcdURDOTItXFx1RENBOVxcdURDQUItXFx1RENGQ1xcdURDRkYtXFx1REQzRFxcdURENEItXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdUREQTRcXHVEREZCLVxcdURFMkRcXHVERTJGLVxcdURFMzRcXHVERTM3LVxcdURFNDRcXHVERTQ4LVxcdURFNEFcXHVERTgwLVxcdURFQTJcXHVERUE0LVxcdURFQjNcXHVERUI3LVxcdURFQkZcXHVERUMxLVxcdURFQzVcXHVERUQwLVxcdURFRDJcXHVERUQ1LVxcdURFRDdcXHVERUVCXFx1REVFQ1xcdURFRjQtXFx1REVGQ1xcdURGRTAtXFx1REZFQl18XFx1RDgzRVtcXHVERDBEXFx1REQwRVxcdUREMTAtXFx1REQxN1xcdUREMURcXHVERDIwLVxcdUREMjVcXHVERDI3LVxcdUREMkZcXHVERDNBXFx1REQzRi1cXHVERDQ1XFx1REQ0Ny1cXHVERDc2XFx1REQ3OFxcdUREN0EtXFx1RERCNFxcdUREQjdcXHVEREJBXFx1RERCQy1cXHVERENCXFx1REREMFxcdURERTAtXFx1RERGRlxcdURFNzAtXFx1REU3NFxcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4NlxcdURFOTAtXFx1REVBOFxcdURFQjAtXFx1REVCNlxcdURFQzAtXFx1REVDMlxcdURFRDAtXFx1REVENl18KD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1LVxcdURFRDdcXHVERUVCXFx1REVFQ1xcdURFRjQtXFx1REVGQ1xcdURGRTAtXFx1REZFQl18XFx1RDgzRVtcXHVERDBDLVxcdUREM0FcXHVERDNDLVxcdURENDVcXHVERDQ3LVxcdURENzhcXHVERDdBLVxcdUREQ0JcXHVERENELVxcdURERkZcXHVERTcwLVxcdURFNzRcXHVERTc4LVxcdURFN0FcXHVERTgwLVxcdURFODZcXHVERTkwLVxcdURFQThcXHVERUIwLVxcdURFQjZcXHVERUMwLVxcdURFQzJcXHVERUQwLVxcdURFRDZdKXwoPzpbI1xcKjAtOVxceEE5XFx4QUVcXHUyMDNDXFx1MjA0OVxcdTIxMjJcXHUyMTM5XFx1MjE5NC1cXHUyMTk5XFx1MjFBOVxcdTIxQUFcXHUyMzFBXFx1MjMxQlxcdTIzMjhcXHUyM0NGXFx1MjNFOS1cXHUyM0YzXFx1MjNGOC1cXHUyM0ZBXFx1MjRDMlxcdTI1QUFcXHUyNUFCXFx1MjVCNlxcdTI1QzBcXHUyNUZCLVxcdTI1RkVcXHUyNjAwLVxcdTI2MDRcXHUyNjBFXFx1MjYxMVxcdTI2MTRcXHUyNjE1XFx1MjYxOFxcdTI2MURcXHUyNjIwXFx1MjYyMlxcdTI2MjNcXHUyNjI2XFx1MjYyQVxcdTI2MkVcXHUyNjJGXFx1MjYzOC1cXHUyNjNBXFx1MjY0MFxcdTI2NDJcXHUyNjQ4LVxcdTI2NTNcXHUyNjVGXFx1MjY2MFxcdTI2NjNcXHUyNjY1XFx1MjY2NlxcdTI2NjhcXHUyNjdCXFx1MjY3RVxcdTI2N0ZcXHUyNjkyLVxcdTI2OTdcXHUyNjk5XFx1MjY5QlxcdTI2OUNcXHUyNkEwXFx1MjZBMVxcdTI2QTdcXHUyNkFBXFx1MjZBQlxcdTI2QjBcXHUyNkIxXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2QzhcXHUyNkNFXFx1MjZDRlxcdTI2RDFcXHUyNkQzXFx1MjZENFxcdTI2RTlcXHUyNkVBXFx1MjZGMC1cXHUyNkY1XFx1MjZGNy1cXHUyNkZBXFx1MjZGRFxcdTI3MDJcXHUyNzA1XFx1MjcwOC1cXHUyNzBEXFx1MjcwRlxcdTI3MTJcXHUyNzE0XFx1MjcxNlxcdTI3MURcXHUyNzIxXFx1MjcyOFxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzYzXFx1Mjc2NFxcdTI3OTUtXFx1Mjc5N1xcdTI3QTFcXHUyN0IwXFx1MjdCRlxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NVxcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTAyXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMVxcdURGMjQtXFx1REY5M1xcdURGOTZcXHVERjk3XFx1REY5OS1cXHVERjlCXFx1REY5RS1cXHVERkYwXFx1REZGMy1cXHVERkY1XFx1REZGNy1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1RENGRFxcdURDRkYtXFx1REQzRFxcdURENDktXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdURENkZcXHVERDcwXFx1REQ3My1cXHVERDdBXFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREOTBcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQyXFx1REVENS1cXHVERUQ3XFx1REVFMC1cXHVERUU1XFx1REVFOVxcdURFRUJcXHVERUVDXFx1REVGMFxcdURFRjMtXFx1REVGQ1xcdURGRTAtXFx1REZFQl18XFx1RDgzRVtcXHVERDBDLVxcdUREM0FcXHVERDNDLVxcdURENDVcXHVERDQ3LVxcdURENzhcXHVERDdBLVxcdUREQ0JcXHVERENELVxcdURERkZcXHVERTcwLVxcdURFNzRcXHVERTc4LVxcdURFN0FcXHVERTgwLVxcdURFODZcXHVERTkwLVxcdURFQThcXHVERUIwLVxcdURFQjZcXHVERUMwLVxcdURFQzJcXHVERUQwLVxcdURFRDZdKVxcdUZFMEZ8KD86W1xcdTI2MURcXHUyNkY5XFx1MjcwQS1cXHUyNzBEXXxcXHVEODNDW1xcdURGODVcXHVERkMyLVxcdURGQzRcXHVERkM3XFx1REZDQS1cXHVERkNDXXxcXHVEODNEW1xcdURDNDJcXHVEQzQzXFx1REM0Ni1cXHVEQzUwXFx1REM2Ni1cXHVEQzc4XFx1REM3Q1xcdURDODEtXFx1REM4M1xcdURDODUtXFx1REM4N1xcdURDOEZcXHVEQzkxXFx1RENBQVxcdURENzRcXHVERDc1XFx1REQ3QVxcdUREOTBcXHVERDk1XFx1REQ5NlxcdURFNDUtXFx1REU0N1xcdURFNEItXFx1REU0RlxcdURFQTNcXHVERUI0LVxcdURFQjZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBDXFx1REQwRlxcdUREMTgtXFx1REQxRlxcdUREMjZcXHVERDMwLVxcdUREMzlcXHVERDNDLVxcdUREM0VcXHVERDc3XFx1RERCNVxcdUREQjZcXHVEREI4XFx1RERCOVxcdUREQkJcXHVERENELVxcdUREQ0ZcXHVEREQxLVxcdURERERdKS9nO1xufTtcbiIsImltcG9ydCBzdHJpcEFuc2kgZnJvbSAnc3RyaXAtYW5zaSc7XG5pbXBvcnQgZWFzdEFzaWFuV2lkdGggZnJvbSAnZWFzdGFzaWFud2lkdGgnO1xuaW1wb3J0IGVtb2ppUmVnZXggZnJvbSAnZW1vamktcmVnZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpbmdXaWR0aChzdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycgfHwgc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0c3RyaW5nID0gc3RyaXBBbnNpKHN0cmluZyk7XG5cblx0aWYgKHN0cmluZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGVtb2ppUmVnZXgoKSwgJyAgJyk7XG5cblx0Y29uc3QgYW1iaWd1b3VzQ2hhcldpZHRoID0gb3B0aW9ucy5hbWJpZ3VvdXNJc05hcnJvdyA/IDEgOiAyO1xuXHRsZXQgd2lkdGggPSAwO1xuXG5cdGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpbmcubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0Y29uc3QgY29kZVBvaW50ID0gc3RyaW5nLmNvZGVQb2ludEF0KGluZGV4KTtcblxuXHRcdC8vIElnbm9yZSBjb250cm9sIGNoYXJhY3RlcnNcblx0XHRpZiAoY29kZVBvaW50IDw9IDB4MUYgfHwgKGNvZGVQb2ludCA+PSAweDdGICYmIGNvZGVQb2ludCA8PSAweDlGKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Ly8gSWdub3JlIGNvbWJpbmluZyBjaGFyYWN0ZXJzXG5cdFx0aWYgKGNvZGVQb2ludCA+PSAweDMwMCAmJiBjb2RlUG9pbnQgPD0gMHgzNkYpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvZGUgPSBlYXN0QXNpYW5XaWR0aC5lYXN0QXNpYW5XaWR0aChzdHJpbmcuY2hhckF0KGluZGV4KSk7XG5cdFx0c3dpdGNoIChjb2RlKSB7XG5cdFx0XHRjYXNlICdGJzpcblx0XHRcdGNhc2UgJ1cnOlxuXHRcdFx0XHR3aWR0aCArPSAyO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ0EnOlxuXHRcdFx0XHR3aWR0aCArPSBhbWJpZ3VvdXNDaGFyV2lkdGg7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0d2lkdGggKz0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gd2lkdGg7XG59XG4iLCJpbXBvcnQgc2xpY2VBbnNpIGZyb20gJ3NsaWNlLWFuc2knO1xuaW1wb3J0IHN0cmluZ1dpZHRoIGZyb20gJ3N0cmluZy13aWR0aCc7XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZOZWFyZXN0U3BhY2Uoc3RyaW5nLCB3YW50ZWRJbmRleCwgc2hvdWxkU2VhcmNoUmlnaHQpIHtcblx0aWYgKHN0cmluZy5jaGFyQXQod2FudGVkSW5kZXgpID09PSAnICcpIHtcblx0XHRyZXR1cm4gd2FudGVkSW5kZXg7XG5cdH1cblxuXHRmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDw9IDM7IGluZGV4KyspIHtcblx0XHRpZiAoc2hvdWxkU2VhcmNoUmlnaHQpIHtcblx0XHRcdGlmIChzdHJpbmcuY2hhckF0KHdhbnRlZEluZGV4ICsgaW5kZXgpID09PSAnICcpIHtcblx0XHRcdFx0cmV0dXJuIHdhbnRlZEluZGV4ICsgaW5kZXg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChzdHJpbmcuY2hhckF0KHdhbnRlZEluZGV4IC0gaW5kZXgpID09PSAnICcpIHtcblx0XHRcdHJldHVybiB3YW50ZWRJbmRleCAtIGluZGV4O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB3YW50ZWRJbmRleDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2xpVHJ1bmNhdGUodGV4dCwgY29sdW1ucywgb3B0aW9ucykge1xuXHRvcHRpb25zID0ge1xuXHRcdHBvc2l0aW9uOiAnZW5kJyxcblx0XHRwcmVmZXJUcnVuY2F0aW9uT25TcGFjZTogZmFsc2UsXG5cdFx0dHJ1bmNhdGlvbkNoYXJhY3RlcjogJ+KApicsXG5cdFx0Li4ub3B0aW9ucyxcblx0fTtcblxuXHRjb25zdCB7cG9zaXRpb24sIHNwYWNlLCBwcmVmZXJUcnVuY2F0aW9uT25TcGFjZX0gPSBvcHRpb25zO1xuXHRsZXQge3RydW5jYXRpb25DaGFyYWN0ZXJ9ID0gb3B0aW9ucztcblxuXHRpZiAodHlwZW9mIHRleHQgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5wdXRcXGAgdG8gYmUgYSBzdHJpbmcsIGdvdCAke3R5cGVvZiB0ZXh0fWApO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBjb2x1bW5zICE9PSAnbnVtYmVyJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGNvbHVtbnNcXGAgdG8gYmUgYSBudW1iZXIsIGdvdCAke3R5cGVvZiBjb2x1bW5zfWApO1xuXHR9XG5cblx0aWYgKGNvbHVtbnMgPCAxKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0aWYgKGNvbHVtbnMgPT09IDEpIHtcblx0XHRyZXR1cm4gdHJ1bmNhdGlvbkNoYXJhY3Rlcjtcblx0fVxuXG5cdGNvbnN0IGxlbmd0aCA9IHN0cmluZ1dpZHRoKHRleHQpO1xuXG5cdGlmIChsZW5ndGggPD0gY29sdW1ucykge1xuXHRcdHJldHVybiB0ZXh0O1xuXHR9XG5cblx0aWYgKHBvc2l0aW9uID09PSAnc3RhcnQnKSB7XG5cdFx0aWYgKHByZWZlclRydW5jYXRpb25PblNwYWNlKSB7XG5cdFx0XHRjb25zdCBuZWFyZXN0U3BhY2UgPSBnZXRJbmRleE9mTmVhcmVzdFNwYWNlKHRleHQsIGxlbmd0aCAtIGNvbHVtbnMgKyAxLCB0cnVlKTtcblx0XHRcdHJldHVybiB0cnVuY2F0aW9uQ2hhcmFjdGVyICsgc2xpY2VBbnNpKHRleHQsIG5lYXJlc3RTcGFjZSwgbGVuZ3RoKS50cmltKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHNwYWNlID09PSB0cnVlKSB7XG5cdFx0XHR0cnVuY2F0aW9uQ2hhcmFjdGVyICs9ICcgJztcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1bmNhdGlvbkNoYXJhY3RlciArIHNsaWNlQW5zaSh0ZXh0LCBsZW5ndGggLSBjb2x1bW5zICsgc3RyaW5nV2lkdGgodHJ1bmNhdGlvbkNoYXJhY3RlciksIGxlbmd0aCk7XG5cdH1cblxuXHRpZiAocG9zaXRpb24gPT09ICdtaWRkbGUnKSB7XG5cdFx0aWYgKHNwYWNlID09PSB0cnVlKSB7XG5cdFx0XHR0cnVuY2F0aW9uQ2hhcmFjdGVyID0gYCAke3RydW5jYXRpb25DaGFyYWN0ZXJ9IGA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaGFsZiA9IE1hdGguZmxvb3IoY29sdW1ucyAvIDIpO1xuXG5cdFx0aWYgKHByZWZlclRydW5jYXRpb25PblNwYWNlKSB7XG5cdFx0XHRjb25zdCBzcGFjZU5lYXJGaXJzdEJyZWFrUG9pbnQgPSBnZXRJbmRleE9mTmVhcmVzdFNwYWNlKHRleHQsIGhhbGYpO1xuXHRcdFx0Y29uc3Qgc3BhY2VOZWFyU2Vjb25kQnJlYWtQb2ludCA9IGdldEluZGV4T2ZOZWFyZXN0U3BhY2UodGV4dCwgbGVuZ3RoIC0gKGNvbHVtbnMgLSBoYWxmKSArIDEsIHRydWUpO1xuXHRcdFx0cmV0dXJuIHNsaWNlQW5zaSh0ZXh0LCAwLCBzcGFjZU5lYXJGaXJzdEJyZWFrUG9pbnQpICsgdHJ1bmNhdGlvbkNoYXJhY3RlciArIHNsaWNlQW5zaSh0ZXh0LCBzcGFjZU5lYXJTZWNvbmRCcmVha1BvaW50LCBsZW5ndGgpLnRyaW0oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0c2xpY2VBbnNpKHRleHQsIDAsIGhhbGYpXG5cdFx0XHRcdCsgdHJ1bmNhdGlvbkNoYXJhY3RlclxuXHRcdFx0XHQrIHNsaWNlQW5zaSh0ZXh0LCBsZW5ndGggLSAoY29sdW1ucyAtIGhhbGYpICsgc3RyaW5nV2lkdGgodHJ1bmNhdGlvbkNoYXJhY3RlciksIGxlbmd0aClcblx0XHQpO1xuXHR9XG5cblx0aWYgKHBvc2l0aW9uID09PSAnZW5kJykge1xuXHRcdGlmIChwcmVmZXJUcnVuY2F0aW9uT25TcGFjZSkge1xuXHRcdFx0Y29uc3QgbmVhcmVzdFNwYWNlID0gZ2V0SW5kZXhPZk5lYXJlc3RTcGFjZSh0ZXh0LCBjb2x1bW5zIC0gMSk7XG5cdFx0XHRyZXR1cm4gc2xpY2VBbnNpKHRleHQsIDAsIG5lYXJlc3RTcGFjZSkgKyB0cnVuY2F0aW9uQ2hhcmFjdGVyO1xuXHRcdH1cblxuXHRcdGlmIChzcGFjZSA9PT0gdHJ1ZSkge1xuXHRcdFx0dHJ1bmNhdGlvbkNoYXJhY3RlciA9IGAgJHt0cnVuY2F0aW9uQ2hhcmFjdGVyfWA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNsaWNlQW5zaSh0ZXh0LCAwLCBjb2x1bW5zIC0gc3RyaW5nV2lkdGgodHJ1bmNhdGlvbkNoYXJhY3RlcikpICsgdHJ1bmNhdGlvbkNoYXJhY3Rlcjtcblx0fVxuXG5cdHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgXFxgb3B0aW9ucy5wb3NpdGlvblxcYCB0byBiZSBlaXRoZXIgXFxgc3RhcnRcXGAsIFxcYG1pZGRsZVxcYCBvciBcXGBlbmRcXGAsIGdvdCAke3Bvc2l0aW9ufWApO1xufVxuIiwiZXhwb3J0IGNvbnN0IEZfUklHSFQgPSAn4oaSJ1xuZXhwb3J0IGNvbnN0IEZfRE9XTiA9ICfihpMnXG5leHBvcnQgY29uc3QgRl9VUCA9ICfihpEnXG5leHBvcnQgY29uc3QgRl9ET1dOX1JJR0hUID0gJ+KGsydcbmV4cG9ydCBjb25zdCBGX1BPSU5URVIgPSAn4p2vJ1xuZXhwb3J0IGNvbnN0IEZfRE9UID0gJ8K3J1xuZXhwb3J0IGNvbnN0IEZfQ0hFQ0sgPSAn4oiaJ1xuZXhwb3J0IGNvbnN0IEZfQ1JPU1MgPSAnw5cnXG5leHBvcnQgY29uc3QgRl9MT05HX0RBU0ggPSAn4o6vJ1xuZXhwb3J0IGNvbnN0IEZfUklHSFRfVFJJID0gJ+KWtidcbiIsIi8qIGVzbGludC1kaXNhYmxlIHByZWZlci10ZW1wbGF0ZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXG5pbXBvcnQgeyBleGlzdHNTeW5jLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdwYXRoZSdcbmltcG9ydCBjIGZyb20gJ3BpY29jb2xvcnMnXG5pbXBvcnQgKiBhcyBkaWZmIGZyb20gJ2RpZmYnXG5pbXBvcnQgY2xpVHJ1bmNhdGUgZnJvbSAnY2xpLXRydW5jYXRlJ1xuaW1wb3J0IHR5cGUgeyBWaXRlc3QgfSBmcm9tICcuLi8uLi8uLi9ub2RlJ1xuaW1wb3J0IHR5cGUgeyBFcnJvcldpdGhEaWZmLCBQYXJzZWRTdGFjaywgUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9nZW5lcmFsJ1xuaW1wb3J0IHsgaW50ZXJwcmV0U291cmNlUG9zLCBsaW5lU3BsaXRSRSwgcGFyc2VTdGFja3RyYWNlLCBwb3NUb051bWJlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3NvdXJjZS1tYXAnXG5pbXBvcnQgeyBGX1BPSU5URVIgfSBmcm9tICcuL2ZpZ3VyZXMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmludEVycm9yKGVycm9yOiB1bmtub3duLCBjdHg6IFZpdGVzdCkge1xuICBsZXQgZSA9IGVycm9yIGFzIEVycm9yV2l0aERpZmZcblxuICBpZiAodHlwZW9mIGVycm9yID09PSAnc3RyaW5nJykge1xuICAgIGUgPSB7XG4gICAgICBtZXNzYWdlOiBlcnJvci5zcGxpdCgvXFxuL2cpWzBdLFxuICAgICAgc3RhY2s6IGVycm9yLFxuICAgIH0gYXMgYW55XG4gIH1cblxuICBjb25zdCBzdGFja3MgPSBwYXJzZVN0YWNrdHJhY2UoZSlcblxuICBhd2FpdCBpbnRlcnByZXRTb3VyY2VQb3Moc3RhY2tzLCBjdHgpXG5cbiAgY29uc3QgbmVhcmVzdCA9IHN0YWNrcy5maW5kKHN0YWNrID0+XG4gICAgY3R4LnNlcnZlci5tb2R1bGVHcmFwaC5nZXRNb2R1bGVCeUlkKHN0YWNrLmZpbGUpXG4gICAgICAmJiBleGlzdHNTeW5jKHN0YWNrLmZpbGUpLFxuICApXG5cbiAgcHJpbnRFcnJvck1lc3NhZ2UoZSwgY3R4LmNvbnNvbGUpXG4gIGF3YWl0IHByaW50U3RhY2soY3R4LCBzdGFja3MsIG5lYXJlc3QsIGFzeW5jKHMsIHBvcykgPT4ge1xuICAgIGlmIChzID09PSBuZWFyZXN0ICYmIG5lYXJlc3QpIHtcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBhd2FpdCBmcy5yZWFkRmlsZShuZWFyZXN0LmZpbGUsICd1dGYtOCcpXG4gICAgICBjdHgubG9nKGMueWVsbG93KGdlbmVyYXRlQ29kZUZyYW1lKHNvdXJjZUNvZGUsIDQsIHBvcykpKVxuICAgIH1cbiAgfSlcblxuICBoYW5kbGVJbXBvcnRPdXRzaWRlTW9kdWxlRXJyb3IoZS5zdGFjayB8fCBlLnN0YWNrU3RyIHx8ICcnLCBjdHgpXG5cbiAgaWYgKGUuc2hvd0RpZmYpXG4gICAgZGlzcGxheURpZmYoZS5hY3R1YWwsIGUuZXhwZWN0ZWQsIGN0eC5jb25zb2xlKVxufVxuXG5jb25zdCBlc21FcnJvcnMgPSBbXG4gICdDYW5ub3QgdXNlIGltcG9ydCBzdGF0ZW1lbnQgb3V0c2lkZSBhIG1vZHVsZScsXG4gICdVbmV4cGVjdGVkIHRva2VuIFxcJ2V4cG9ydFxcJycsXG5dXG5cbmZ1bmN0aW9uIGhhbmRsZUltcG9ydE91dHNpZGVNb2R1bGVFcnJvcihzdGFjazogc3RyaW5nLCBjdHg6IFZpdGVzdCkge1xuICBpZiAoIWVzbUVycm9ycy5zb21lKGUgPT4gc3RhY2suaW5jbHVkZXMoZSkpKVxuICAgIHJldHVyblxuXG4gIGNvbnN0IHBhdGggPSBzdGFjay5zcGxpdCgnXFxuJylbMF0udHJpbSgpXG4gIGxldCBuYW1lID0gcGF0aC5zcGxpdCgnL25vZGVfbW9kdWxlcy8nKS5wb3AoKSB8fCAnJ1xuICBpZiAobmFtZT8uc3RhcnRzV2l0aCgnQCcpKVxuICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcvJykuc2xpY2UoMCwgMikuam9pbignLycpXG4gIGVsc2VcbiAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpWzBdXG5cbiAgY3R4LmNvbnNvbGUuZXJyb3IoYy55ZWxsb3coXG4gICAgYE1vZHVsZSAke3BhdGh9IHNlZW1zIHRvIGJlIGFuIEVTIE1vZHVsZSBidXQgc2hpcHBlZCBpbiBhIENvbW1vbkpTIHBhY2thZ2UuIGBcbisgYFlvdSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhbiBpc3N1ZSB0byB0aGUgcGFja2FnZSAke2MuYm9sZChgXCIke25hbWV9XCJgKX0gYXNraW5nIGBcbisgJ3RoZW0gdG8gc2hpcCB0aGUgZmlsZSBpbiAubWpzIGV4dGVuc2lvbiBvciBhZGQgXCJ0eXBlXCI6IFwibW9kdWxlXCIgaW4gdGhlaXIgcGFja2FnZS5qc29uLidcbisgJ1xcblxcbidcbisgJ0FzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgeW91IGNhbiB0cnkgdG8gaW5saW5lIHRoZSBwYWNrYWdlIGJ5IHVwZGF0aW5nIHlvdXIgY29uZmlnOidcbisgJ1xcblxcbidcbisgYy5ncmF5KGMuZGltKCcvLyB2aXRlc3QuY29uZmlnLmpzJykpXG4rICdcXG4nXG4rIGMuZ3JlZW4oYGV4cG9ydCBkZWZhdWx0IHtcbiAgdGVzdDoge1xuICAgIGRlcHM6IHtcbiAgICAgIGlubGluZTogW1xuICAgICAgICAke2MueWVsbG93KGMuYm9sZChgXCIke25hbWV9XCJgKSl9XG4gICAgICBdXG4gICAgfVxuICB9XG59XFxuYCkpKVxufVxuXG5mdW5jdGlvbiBkaXNwbGF5RGlmZihhY3R1YWw6IHN0cmluZywgZXhwZWN0ZWQ6IHN0cmluZywgY29uc29sZTogQ29uc29sZSkge1xuICBjb25zb2xlLmVycm9yKGMuZ3JheSh1bmlmaWVkRGlmZihhY3R1YWwsIGV4cGVjdGVkKSkgKyAnXFxuJylcbn1cblxuZnVuY3Rpb24gcHJpbnRFcnJvck1lc3NhZ2UoZXJyb3I6IEVycm9yV2l0aERpZmYsIGNvbnNvbGU6IENvbnNvbGUpIHtcbiAgY29uc3QgZXJyb3JOYW1lID0gZXJyb3IubmFtZSB8fCBlcnJvci5uYW1lU3RyIHx8ICdVbmtub3duIEVycm9yJ1xuICBjb25zb2xlLmVycm9yKGMucmVkKGAke2MuYm9sZChlcnJvck5hbWUpfTogJHtlcnJvci5tZXNzYWdlfWApKVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcmludFN0YWNrKFxuICBjdHg6IFZpdGVzdCxcbiAgc3RhY2s6IFBhcnNlZFN0YWNrW10sXG4gIGhpZ2hsaWdodD86IFBhcnNlZFN0YWNrLFxuICBvblN0YWNrPzogKChzdGFjazogUGFyc2VkU3RhY2ssIHBvczogUG9zaXRpb24pID0+IHZvaWQpLFxuKSB7XG4gIGlmICghc3RhY2subGVuZ3RoKVxuICAgIHJldHVyblxuXG4gIGZvciAoY29uc3QgZnJhbWUgb2Ygc3RhY2spIHtcbiAgICBjb25zdCBwb3MgPSBmcmFtZS5zb3VyY2VQb3MgfHwgZnJhbWVcbiAgICBjb25zdCBjb2xvciA9IGZyYW1lID09PSBoaWdobGlnaHQgPyBjLnllbGxvdyA6IGMuZ3JheVxuICAgIGNvbnN0IHBhdGggPSByZWxhdGl2ZShjdHguY29uZmlnLnJvb3QsIGZyYW1lLmZpbGUpXG5cbiAgICBjdHgubG9nKGNvbG9yKGAgJHtjLmRpbShGX1BPSU5URVIpfSAke1tmcmFtZS5tZXRob2QsIGMuZGltKGAke3BhdGh9OiR7cG9zLmxpbmV9OiR7cG9zLmNvbHVtbn1gKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKX1gKSlcbiAgICBhd2FpdCBvblN0YWNrPy4oZnJhbWUsIHBvcylcblxuICAgIC8vIHJlYWNoZWQgYXQgdGVzdCBmaWxlLCBza2lwIHRoZSBmb2xsb3cgc3RhY2tcbiAgICBpZiAoZnJhbWUuZmlsZSBpbiBjdHguc3RhdGUuZmlsZXNNYXApXG4gICAgICBicmVha1xuICB9XG4gIGN0eC5sb2coKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVDb2RlRnJhbWUoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBpbmRlbnQgPSAwLFxuICBzdGFydDogbnVtYmVyIHwgUG9zaXRpb24gPSAwLFxuICBlbmQ/OiBudW1iZXIsXG4gIHJhbmdlID0gMixcbik6IHN0cmluZyB7XG4gIHN0YXJ0ID0gcG9zVG9OdW1iZXIoc291cmNlLCBzdGFydClcbiAgZW5kID0gZW5kIHx8IHN0YXJ0XG4gIGNvbnN0IGxpbmVzID0gc291cmNlLnNwbGl0KGxpbmVTcGxpdFJFKVxuICBsZXQgY291bnQgPSAwXG4gIGxldCByZXM6IHN0cmluZ1tdID0gW11cblxuICBjb25zdCBjb2x1bW5zID0gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MFxuXG4gIGZ1bmN0aW9uIGxpbmVObyhubzogbnVtYmVyIHwgc3RyaW5nID0gJycpIHtcbiAgICByZXR1cm4gYy5ncmF5KGAke1N0cmluZyhubykucGFkU3RhcnQoMywgJyAnKX18IGApXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY291bnQgKz0gbGluZXNbaV0ubGVuZ3RoICsgMVxuICAgIGlmIChjb3VudCA+PSBzdGFydCkge1xuICAgICAgZm9yIChsZXQgaiA9IGkgLSByYW5nZTsgaiA8PSBpICsgcmFuZ2UgfHwgZW5kID4gY291bnQ7IGorKykge1xuICAgICAgICBpZiAoaiA8IDAgfHwgaiA+PSBsaW5lcy5sZW5ndGgpXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZXNbal0ubGVuZ3RoXG5cbiAgICAgICAgLy8gdG8gbG9uZywgbWF5YmUgaXQncyBhIG1pbmlmaWVkIGZpbGUsIHNraXAgZm9yIGNvZGVmcmFtZVxuICAgICAgICBpZiAobGluZUxlbmd0aCA+IDIwMClcbiAgICAgICAgICByZXR1cm4gJydcblxuICAgICAgICByZXMucHVzaChsaW5lTm8oaiArIDEpICsgY2xpVHJ1bmNhdGUobGluZXNbal0sIGNvbHVtbnMgLSA1IC0gaW5kZW50KSlcblxuICAgICAgICBpZiAoaiA9PT0gaSkge1xuICAgICAgICAgIC8vIHB1c2ggdW5kZXJsaW5lXG4gICAgICAgICAgY29uc3QgcGFkID0gc3RhcnQgLSAoY291bnQgLSBsaW5lTGVuZ3RoKVxuICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDEsIGVuZCA+IGNvdW50ID8gbGluZUxlbmd0aCAtIHBhZCA6IGVuZCAtIHN0YXJ0KVxuICAgICAgICAgIHJlcy5wdXNoKGxpbmVObygpICsgJyAnLnJlcGVhdChwYWQpICsgYy5yZWQoJ14nLnJlcGVhdChsZW5ndGgpKSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqID4gaSkge1xuICAgICAgICAgIGlmIChlbmQgPiBjb3VudCkge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oZW5kIC0gY291bnQsIGxpbmVMZW5ndGgpKVxuICAgICAgICAgICAgcmVzLnB1c2gobGluZU5vKCkgKyBjLnJlZCgnXicucmVwZWF0KGxlbmd0aCkpKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb3VudCArPSBsaW5lTGVuZ3RoICsgMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRlbnQpXG4gICAgcmVzID0gcmVzLm1hcChsaW5lID0+ICcgJy5yZXBlYXQoaW5kZW50KSArIGxpbmUpXG5cbiAgcmV0dXJuIHJlcy5qb2luKCdcXG4nKVxufVxuXG4vKipcbiAqIFJldHVybnMgdW5pZmllZCBkaWZmIGJldHdlZW4gdHdvIHN0cmluZ3Mgd2l0aCBjb2xvdXJlZCBBTlNJIG91dHB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGFjdHVhbFxuICogQHBhcmFtIHtTdHJpbmd9IGV4cGVjdGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkaWZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pZmllZERpZmYoYWN0dWFsOiBzdHJpbmcsIGV4cGVjdGVkOiBzdHJpbmcpIHtcbiAgaWYgKGFjdHVhbCA9PT0gZXhwZWN0ZWQpXG4gICAgcmV0dXJuICcnXG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJ1xuICBjb25zdCBkaWZmTGltaXQgPSAxNVxuXG4gIGNvbnN0IGNvdW50cyA9IHtcbiAgICAnKyc6IDAsXG4gICAgJy0nOiAwLFxuICB9XG4gIGxldCBwcmV2aW91c1N0YXRlOiAnLScgfCAnKycgfCBudWxsID0gbnVsbFxuICBsZXQgcHJldmlvdXNDb3VudCA9IDBcbiAgZnVuY3Rpb24gcHJlcHJvY2VzcyhsaW5lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWxpbmUgfHwgbGluZS5tYXRjaCgvXFxcXCBObyBuZXdsaW5lLykpXG4gICAgICByZXR1cm5cblxuICAgIGNvbnN0IGNoYXIgPSBsaW5lWzBdIGFzICcrJyB8ICctJ1xuICAgIGlmICgnLSsnLmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPT0gY2hhcikge1xuICAgICAgICBwcmV2aW91c1N0YXRlID0gY2hhclxuICAgICAgICBwcmV2aW91c0NvdW50ID0gMFxuICAgICAgfVxuICAgICAgcHJldmlvdXNDb3VudCsrXG4gICAgICBjb3VudHNbY2hhcl0rK1xuICAgICAgaWYgKHByZXZpb3VzQ291bnQgPT09IGRpZmZMaW1pdClcbiAgICAgICAgcmV0dXJuIGMuZGltKGNoYXIgKyAnIC4uLicpXG4gICAgICBlbHNlIGlmIChwcmV2aW91c0NvdW50ID4gZGlmZkxpbWl0KVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGxpbmVcbiAgfVxuXG4gIGNvbnN0IG1zZyA9IGRpZmYuY3JlYXRlUGF0Y2goJ3N0cmluZycsIGV4cGVjdGVkLCBhY3R1YWwpXG4gIGNvbnN0IGxpbmVzID0gbXNnLnNwbGl0KCdcXG4nKS5zbGljZSg1KS5tYXAocHJlcHJvY2VzcykuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gIGNvbnN0IGlzQ29tcGFjdCA9IGNvdW50c1snKyddID09PSAxICYmIGNvdW50c1snLSddID09PSAxICYmIGxpbmVzLmxlbmd0aCA9PT0gMlxuXG4gIGxldCBmb3JtYXR0ZWQgPSBsaW5lcy5tYXAoKGxpbmU6IHN0cmluZykgPT4ge1xuICAgIGlmIChsaW5lWzBdID09PSAnLScpIHtcbiAgICAgIGxpbmUgPSBmb3JtYXRMaW5lKGxpbmUuc2xpY2UoMSkpXG4gICAgICBpZiAoaXNDb21wYWN0KVxuICAgICAgICByZXR1cm4gYy5ncmVlbihsaW5lKVxuICAgICAgcmV0dXJuIGMuZ3JlZW4oYC0gJHtmb3JtYXRMaW5lKGxpbmUpfWApXG4gICAgfVxuICAgIGlmIChsaW5lWzBdID09PSAnKycpIHtcbiAgICAgIGxpbmUgPSBmb3JtYXRMaW5lKGxpbmUuc2xpY2UoMSkpXG4gICAgICBpZiAoaXNDb21wYWN0KVxuICAgICAgICByZXR1cm4gYy5yZWQobGluZSlcbiAgICAgIHJldHVybiBjLnJlZChgKyAke2Zvcm1hdExpbmUobGluZSl9YClcbiAgICB9XG4gICAgaWYgKGxpbmUubWF0Y2goL0BALykpXG4gICAgICByZXR1cm4gJy0tJ1xuICAgIHJldHVybiAnICcgKyBsaW5lXG4gIH0pXG5cbiAgLy8gQ29tcGFjdCBtb2RlXG4gIGlmIChpc0NvbXBhY3QpIHtcbiAgICBmb3JtYXR0ZWQgPSBbXG4gICAgICBgJHtjLmdyZWVuKCctIEV4cGVjdGVkJyl9ICAgJHtmb3JtYXR0ZWRbMF19YCxcbiAgICAgIGAke2MucmVkKCcrIFJlY2VpdmVkJyl9ICAgJHtmb3JtYXR0ZWRbMV19YCxcbiAgICBdXG4gIH1cbiAgZWxzZSB7XG4gICAgZm9ybWF0dGVkLnVuc2hpZnQoXG4gICAgICBjLmdyZWVuKCctIEV4cGVjdGVkICAtICcgKyBjb3VudHNbJy0nXSksXG4gICAgICBjLnJlZCgnKyBSZWNlaXZlZCAgKyAnICsgY291bnRzWycrJ10pLFxuICAgICAgJycsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZC5tYXAoaSA9PiBpbmRlbnQgKyBpKS5qb2luKCdcXG4nKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRMaW5lKGxpbmU6IHN0cmluZykge1xuICByZXR1cm4gY2xpVHJ1bmNhdGUobGluZSwgKHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODApIC0gNClcbn1cbiJdLCJuYW1lcyI6WyJmcyIsImRpZmYuY3JlYXRlUGF0Y2giXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTyxNQUFNLGNBQWMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7QUFDNUUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7QUFDM0gsTUFBTSx1QkFBdUIsR0FBRztBQUNoQyxFQUFFLGFBQWE7QUFDZixFQUFFLHdCQUF3QjtBQUMxQixFQUFFLFdBQVc7QUFDYixFQUFFLFlBQVk7QUFDZCxFQUFFLGFBQWE7QUFDZixFQUFFLG1DQUFtQztBQUNyQyxFQUFFLHVDQUF1QztBQUN6QyxFQUFFLGlCQUFpQjtBQUNuQixFQUFFLGlGQUFpRjtBQUNuRixFQUFFLDRDQUE0QztBQUM5QyxDQUFDLENBQUM7QUFDRixNQUFNLHNCQUFzQixHQUFHO0FBQy9CLEVBQUUsT0FBTyxFQUFFLEtBQUs7QUFDaEIsRUFBRSxLQUFLLEVBQUUsSUFBSTtBQUNiLEVBQUUsWUFBWSxFQUFFLEtBQUs7QUFDckIsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZO0FBQ2hDLEVBQUUsa0JBQWtCLEVBQUUsSUFBSTtBQUMxQixFQUFFLE9BQU8sRUFB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QUFDLENBQUMsQ0FBQztBQUNsQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEUsRUFBRSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxNQUFNLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFO0FBQ3BFLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNmLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNmLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUIsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDO0FBQ3pCLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTO0FBQzFCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLEVBQUU7QUFDcEQsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLEdBQUc7QUFDSCxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksU0FBUztBQUMxQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxFQUFFO0FBQ3BELElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTTtBQUNqRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQztBQUNwRCxPQUFPLE9BQU8sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxFQUFFO0FBQ3RELElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTTtBQUNqRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLEVBQUU7QUFDcEQsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0gsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVM7QUFDMUIsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDbEQsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMzQixPQUFPLE1BQU0sSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNsRCxPQUFPLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDM0IsT0FBTyxNQUFNLElBQUksU0FBUyxDQUFDO0FBQzNCLE9BQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDO0FBQ2xELE9BQU8sTUFB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O0FBQ3RDLFVBQVUsU0FBUztBQUNuQixRQUFRLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsUUFBUSxJQUFJLFVBQVUsR0FBRyxHQUFHO0FBQzVCLFVBQVUsT0FBTyxFQUFFLENBQUM7QUFDcEIsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUUsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDckIsVUFBVSxNQUFNLEdBQUcsR0FBRyxLQUFLLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELFVBQVUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssR0FBRyxVQUFVLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNuRixVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLFNBQVMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUIsVUFBVSxJQUFJLEdBQUcsR0FBRyxLQUFLLEVBQUU7QUFDM0IsWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUMxRSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxH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
|